anchor.diff:  -define(OPERATIONS,
           [
            {<<"contains">>, contains},
  +         {<<"is_member_of">>, is_member_of},
            {<<"equals">>, equals},
            {<<"regexp">>, regexp},
            {<<"any">>, any}
  
positive.code:     end.
  
  
  convert_value_if_needed(any, _) ->
      {ok, undefined};
  convert_value_if_needed(regexp, Value) ->
      case re:compile(Value) of
          {ok, MP} ->
              {ok, MP};
          {error, Reason} ->
              Msg = io_lib:format("compilation of regexp failed: ~p",[Reason]),
              {error, Msg}
      end;
  convert_value_if_needed(_, Value) ->
  
negative.code:         {ok, Value} ->
              [ {Issuer, OidcKey, AtomOp, Value} | Result ] ;
          {error, Reason} ->
              add_failed(Reason, OidcKey, AtomOp, Value0, Issuer, Result)
      end;
  maybe_add_to_result({false, Id}, {_, Op}, Key, Val, Result) ->
      add_failed("provider not found", Key, Op, Val, Id, Result);
  maybe_add_to_result({true, Id}, {false, Op}, Key, Val, Result) ->
      add_failed("unknown operation", Key, Op, Val, Id, Result);
  maybe_add_to_result(Id, Op, Key, Val, Result) ->
      add_failed("unknown error", Key, Op, Val, Id, Result).
  
  add_failed(Reason, Key, Op, Val, Id, Result) ->
      Msg = "skipping rule ~p ~p ~p for provider ~p (~s) -> ~p",
      lager:warning(Msg, [Key, Op, Val, Id, Reason, Result]),
      Result.
  
  
  does_provider_exist(ProviderId, ProviderList) ->
      case lists:keyfind(ProviderId, 1, ProviderList) of
  