///|
fn main raise {
  // A BPMN choice allows automatic OR manual approval, not both.
  let xml =
    #|
    #|
    #|
    #|
    #|
    #|
    #|
  let model = @lens.parse_bpmn(xml)
  let net = model.to_petri_net()
  let single = @lens.CaseTrace::new("good", [
    @lens.LogEvent::new("g", "good", "manual", 0L, 1L),
  ])
  let double = @lens.CaseTrace::new("bad", [
    @lens.LogEvent::new("b1", "bad", "automatic", 0L, 1L),
    @lens.LogEvent::new("b2", "bad", "manual", 2L, 3L),
  ])
  assert_eq(single.align_net(net).cost, 0)
  assert_eq(double.align_net(net).cost, 1)
  let restored = @lens.parse_bpmn(model.to_bpmn()).to_petri_net()
  assert_eq(double.align_net(restored).cost, 1)
  println(
    "BPMN approval: exclusive choice preserved; illegal double approval costs 1",
  )
  println(@lens.model_alignment_to_json(double.align_net(net)).stringify())
}