anchor.diff:      open MovescountContrib.Lib.MovescountClient
       open MovescountContrib.Lib.Utils
       open DDay.iCal
  +
  +    let (|Regex|_|) pattern input =
  +        let m = Regex.Match(input, pattern)
  +        if m.Success then Some(List.tail [ for g in m.Groups -> g.Value ])
  +        else None
   
       let getTrainingPlan email password =
           async {
  
positive.code: 
          iCal.AddProperty("X-WR-CALNAME", calName)
          iCal.AddProperty("X-WR-CALDESC", calDescription)
  
          plan.ScheduledMoves |>
              Seq.iter(fun m ->
                  let event = iCal.Create<Event>()
                  event.Properties.Remove("SEQUENCE") |> ignore
                  event.IsAllDay <- true
                  event.Start <- new iCalDateTime(m.Day.Date)
                  event.Description <- m.Description
                  event.Summary <- getEventTitle m
                  event.UID <- (m.ID.ToString())
  
negative.code:             return JsonConvert.DeserializeObject<TrainingPlan>(jsonString, settings)
          }
  
      let getStartTime (move:ScheduledMove) =
          match move.Description with
          | Regex @"(\d{2}):(\d{2})" [hourStr; minuteStr] ->
              let hours = Convert.ToDouble(hourStr)
              let minutes = Convert.ToDouble(minuteStr)
              Some( (move.Day.AddHours(hours).AddMinutes(minutes)) )
          | _ -> None
  
      let getTrainingPlanCal email password =
          let plan = (getTrainingPlan email password) |> Async.RunSynchronously
          let iCal = new iCalendar()
  