anchor.diff:                      ))
               )
       
  +        // keyboard
           showObserver <- UIKeyboard.Notifications.ObserveWillShow(System.EventHandler<UIKeyboardEventArgs>(placeKeyboard))
           hideObserver <- UIKeyboard.Notifications.ObserveWillHide(System.EventHandler<UIKeyboardEventArgs>(placeKeyboard))
           this.Text.BecomeFirstResponder () |> ignore
  
positive.code:     let cancelPoll = new Threading.CancellationTokenSource()
  
      let keepAlive () =
          this.InvokeOnMainThread(fun _ -> 
              if this.NavigationController <> null && this.NavigationController.VisibleViewController = upcast this then
                  Async.startWithContinuation
                      (Chat.keepAlive room.Slug)
                      (fun _ -> ())
  
negative.code: 
      let barButtons () =
          [|
              yield controller.UserButton
  
              if apps.Any(fun e -> appsAllowed.Contains(e)) then
                  yield controller.GameButton
  
              if starred then
                  yield controller.UnstarButton
              else
                  yield controller.StarButton
          |]
  
  
      let webViewDelegate = {
          new UIWebViewDelegate() with
          override this.ShouldStartLoad (view, request, navigationType) =
              let uri = new Uri(request.Url.AbsoluteString)
              match uri.Segments with
              | [|_; "api/"; "chat/"; "chatRoomTemplate" |] -> true
              | [|_; "users/"; slug |] ->
                  match users.Values |> Seq.tryFind (fun e -> e.Slug = slug) with
                  | Some user ->
                      Navigation.navigate (sprintf "/users/%s" slug) (Some { Id = user.Id; Label = user.Name; Slug = user.Slug; Image = user.Avatar })
                  | _ ->
                      Navigation.navigate (sprintf "/users/%s" slug) None
                  false
              | segments -> 
                  Navigation.navigate (uri.ToString()) None
                  false
  
          override this.LoadFailed (view, error) = showSimpleAlert "Error" error.Description "Close"
  
          override this.LoadingFinished (view) = 
              Async.startNetworkWithContinuation
                  (Chat.join room.Slug)
                  (function
                  | Api.ApiOk (result, events) ->
                      startSequence <- result.Sequence
                      loaded <- true
                      starred <- result.Channel.ViewerHasStarred
                      apps <- result.Channel.Apps
  
                      if apps.Any(fun e -> appsAllowed.Contains(e)) then
                          gameController <- Some (new GameViewController(room, apps.First()))
  
                      controller.NavigationItem.RightBarButtonItems <- barButtons()
  
                      result.Members |> Array.filter (fun e -> memberTypes.Contains e.Membership) |> Array.iter addUser
                      result.HistoricMembers |> Array.filter (fun e -> memberTypes.Contains e.Membership) |> Array.iter addUser
                      controller.WebView.PreloadImages [ for user in users.Values do yield App.imageUrl user.Avatar nameplateImageSize ]
                      let lines = new List<string>()
                      for event in events do processEvent event (fun l _ -> lines.Add l)
                      addLines (lines.ToArray())
                      controller.Progress.StopAnimating ()
  
                      if loaded = false then
                          processor.Start()
  
                      lastEvent <- DateTime.UtcNow
                  | error -> controller.HandleApiFailure error)
      }
  
      member this.UserButton:UIBarButtonItem =
          new UIBarButtonItem(UIImage.FromFile "UIButtonBarProfile.png", UIBarButtonItemStyle.Bordered, new EventHandler(fun (s:obj) (e:EventArgs) -> 
  