anchor.diff:  -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
            terminate/2, code_change/3]).
   
  --record(state, {should_contact_tracker = false,
  -                queued_message = none,
  +-record(state, {queued_message = none,
                   %% The hard timer is the time we *must* wait on the tracker.
                   %% soft timer may be overridden if we want to change state.
                   soft_timer = none,
  
positive.code:     contact_tracker(none, S).
  
  contact_tracker(Event, S) ->
      NewUrl = build_tracker_url(S, Event),
      ?INFO([{contacting_tracker, NewUrl}]),
      case http_gzip:request(NewUrl) of
          {ok, {{_, 200, _}, _, Body}} ->
              handle_tracker_response(etorrent_bcoding:decode(Body), S);
          {error, etimedout} ->
  
negative.code:     Data = lists:concat([Key, "=", Value, "&"]),
      construct_headers(Rest, [Data | HeaderLines]).
  
  build_tracker_url(Url, #state { torrent_id = Id,
  				info_hash = InfoHash,
  				peer_id = PeerId }, Event) ->
      {torrent_info, Uploaded, Downloaded, Left} =
                  etorrent_torrent:find(Id),
      {ok, Port} = application:get_env(etorrent, port),
      Request = [{"info_hash",
                  etorrent_utils:build_encoded_form_rfc1738(InfoHash)},
                 {"peer_id",
                  etorrent_utils:build_encoded_form_rfc1738(PeerId)},
                 {"uploaded", Uploaded},
                 {"downloaded", Downloaded},
                 {"left", Left},
  