anchor.diff:  	C2 = cowboy_bstr:char_to_lower(C),
   	alpha(Rest, Fun, << Acc/binary, C2 >>);
   alpha(Data, Fun, Acc) ->
  +	Fun(Data, Acc).
  +
  +-spec alphanumeric(binary(), fun()) -> any().
  +alphanumeric(Data, Fun) ->
  +	alphanumeric(Data, Fun, <<>>).
  +
  +-spec alphanumeric(binary(), fun(), binary()) -> any().
  +alphanumeric(<<>>, Fun, Acc) ->
  +	Fun(<<>>, Acc);
  +alphanumeric(<< C, Rest/binary >>, Fun, Acc)
  +		when C >= $a andalso C =< $z;
  +			 C >= $A andalso C =< $Z;
  +			 C >= $0 andalso C =< $9 ->
  +	C2 = cowboy_bstr:char_to_lower(C),
  +	alphanumeric(Rest, Fun, << Acc/binary, C2 >>);
  +alphanumeric(Data, Fun, Acc) ->
   	Fun(Data, Acc).
   
   %% @doc Parse either a token or a quoted string.
  
positive.code: 			{<<"en-gb">>, 800},
  			{<<"en">>, 700}
  		]},
  		{<<"en, en-US, en-cockney, i-cherokee, x-pig-latin">>, [
  			{<<"en">>, 1000},
  			{<<"en-us">>, 1000},
  			{<<"en-cockney">>, 1000},
  			{<<"i-cherokee">>, 1000},
  			{<<"x-pig-latin">>, 1000}
  		]}
  	],
  	[{V, fun() -> R = nonempty_list(V, fun language_range/2) end}
  
negative.code: 
  -spec language_subtag(binary(), fun(), binary(), [binary()]) -> any().
  language_subtag(Data, Fun, Tag, Acc) ->
  	alphanumeric(Data,
  		fun (_Rest, SubTag) when byte_size(SubTag) =:= 0;
  				byte_size(SubTag) > 8 -> {error, badarg};
  			(<< $-, Rest/binary >>, SubTag) ->
  