anchor.diff:                  let statusSpan = statusCell.Elements("span").Last()
                   if statusSpan <> null && statusSpan.InnerText.Contains(" mins late") then
                       match statusSpan.InnerText.Replace(" mins late", "") |> parseInt with
  -                    | Some delayMins -> Delayed (hasDeparted, delayMins), due + { Hours = 0; Minutes = delayMins } |> Some
  +                    | Some delayMins -> Delayed (hasDeparted, delayMins), due + Time.FromMinutes(delayMins) |> Some
                       | _ -> raise <| ParseError(sprintf "Invalid status:\n%s" statusCell.OuterHtml, null)
                   else
                       OnTime hasDeparted, None
  
positive.code:                 let statusSpan = statusCell.Element("span")
                  if statusSpan <> null && statusSpan.InnerText.Contains(" mins late") then
                      match statusSpan.InnerText.Replace(" mins late", "") |> parseInt with
                      | Some delayMins -> Status.Delayed delayMins, due + { Hours = 0; Minutes = delayMins } |> Some
                      | _ -> raise <| ParseError(sprintf "Invalid status:\n%s" statusCell.OuterHtml, null)
                  else
                      Status.OnTime, None
  
negative.code:                 let hours = time.Substring(0, pos) |> parseInt
                  let minutes = time.Substring(pos+1) |> parseInt
                  match hours, minutes with
                  | Some hours, Some minutes -> Time.FromHoursAndMinutes(hours, minutes)
                  | _ -> raise <| ParseError(sprintf "Invalid time:\n%s" cell.OuterHtml, null)
              else raise <| ParseError(sprintf "Invalid time:\n%s" cell.OuterHtml, null)
  
  