anchor.diff:  push(Name, RegIds, Message) ->
       push(Name, RegIds, Message, 1).
   
  -push(Name, RegIds, Message, Retry) ->
  -    gen_server:cast(Name, {send, RegIds, Message, Retry}).
  +push(Name, RegIds, Message, Attempt) ->
  +    gen_server:cast(Name, {send, RegIds, Message, Attempt}).
   
   sync_push(Name, RegIds, Message) ->
       sync_push(Name, RegIds, Message, 1).
   
  -sync_push(Name, RegIds, Message, Retry) ->
  -    gen_server:call(Name, {send, RegIds, Message, Retry}).
  +sync_push(Name, RegIds, Message, Attempt) ->
  +    gen_server:call(Name, {send, RegIds, Message, Attempt}).
   
   %% OTP
   start_link(Name, Key) ->
  
positive.code: -export([push/3, push/4, sync_push/3, sync_push/4]).
  
  -define(SERVER, ?MODULE).
  -define(RETRY, 3).
  
  -record(state, {key}).
  
  
negative.code:     {_MulticastId, _SuccessesNumber, _FailuresNumber, _CanonicalIdsNumber, Results} = GCMResult,
      lists:map(fun({Result, RegId}) -> {RegId, parse(Result)} end, lists:zip(Results, RegIds)).
  
  do_backoff(_, _, _, _, ?MAX_ATTEMPT + 1) ->
      ok;
  
  do_backoff(RetryAfter, RegIds, Message, Key, Attempt) ->
      case RetryAfter of
          no_retry ->
              ok;
  	_ ->
  	    timer:apply_after(RetryAfter * 1000, ?MODULE, do_push, [RegIds, Message, Key, Attempt+1])
      end.
  
  parse(Result) ->
  