anchor.diff:  check_rawdt([_|T], Time) -> check_rawdt(T, Time);
   check_rawdt([], _Time)   -> true.
   
  +-spec parse_rawdt([riakacl_group:rawdt()], riakacl_group:parse_rawdt_handler()) -> map().
  +parse_rawdt(Raw, HandleData) ->
  +	parse_rawdt(Raw, HandleData, #{}).
  +
   %% =============================================================================
   %% Internal functions
   %% =============================================================================
  
positive.code: 	new_dt/1,
  	new_dt/2,
  	data_rawdt/1,
  	check_rawdt/2
  ]).
  
  %% Types
  -type claims() :: map().
  -type data()   :: riakc_map:crdt_map().
  -type group()  :: riakc_map:crdt_map().
  -type rawdt()  :: {{binary(), riakc_datatype:datatype()}, any()}.
  
  -export_type([claims/0, data/0, group/0, rawdt/0]).
  
  %% =============================================================================
  %% DataType API
  
negative.code: new_dt_([{exp, Val}|T], G) -> new_dt_(T, riakc_map:update({<<"exp">>, register}, fun(Obj) -> riakc_register:set(integer_to_binary(Val), Obj) end, G));
  new_dt_([{iat, Val}|T], G) -> new_dt_(T, riakc_map:update({<<"iat">>, register}, fun(Obj) -> riakc_register:set(integer_to_binary(Val), Obj) end, G));
  new_dt_([], G)             -> G.
  
  -spec parse_rawdt([riakacl_group:rawdt()], riakacl_group:parse_rawdt_handler(), map()) -> map().
  parse_rawdt([{{<<"data">>, map}, L}|T], HandleData, Acc)       -> parse_rawdt(T, HandleData, HandleData(L, Acc));
  parse_rawdt([{{<<"iat">>, register}, Val}|T], HandleData, Acc) -> parse_rawdt(T, HandleData, Acc#{iat => Val});
  parse_rawdt([{{<<"exp">>, register}, Val}|T], HandleData, Acc) -> parse_rawdt(T, HandleData, Acc#{exp => Val});
  parse_rawdt([_|T], HandleData, Acc)                            -> parse_rawdt(T, HandleData, Acc);
  parse_rawdt([], _HandleData, Acc)                              -> Acc.
  