anchor.diff:                              UrlTiers, InfoHash, PeerId, TorrentId],
                             []).
   
  +%% @doc Prod the tracker and tell it we completed to torrent
  +%% @end
   -spec completed(pid()) -> ok.
   completed(Pid) ->
       gen_server:cast(Pid, completed).
   
   %%====================================================================
  -%% gen_server callbacks
  -%%====================================================================
  -
  -%%--------------------------------------------------------------------
  -%% Function: init(Args) -> {ok, State} |
  -%%                         {ok, State, Timeout} |
  -%%                         ignore               |
  -%%                         {stop, Reason}
  -%% Description: Initiates the server
  -%%--------------------------------------------------------------------
  +
  +%% @private
   init([ControlPid, UrlTiers, InfoHash, PeerId, TorrentId]) ->
       process_flag(trap_exit, true),
       HardRef = erlang:send_after(0, self(), hard_timeout),
  
positive.code: %% gen_server callbacks
  -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
           terminate/2, code_change/3]).
  
  %% Dummy exports
  -export([swap_urls/1]).
  
  -record(state, {queued_message = none,
                  %% The hard timer is the time we *must* wait on the tracker.
  
negative.code:     ?ERR([unknown_msg, Msg]),
      {noreply, S}.
  
  %% @private
  handle_info(hard_timeout,
      #state { queued_message = none } = S) ->
      %% There is nothing to do with the hard_timer, just ignore this
  