open Mctypes
open Mathext
open Mc_ext
node abs(a : float) returns (o : float)
let
  o = if (<=.)(0.000000, a) then a else ~-.(a)
tel

node sign(a : float) returns (o : float)
let
  o =
    if (>.)(a, 0.000000)
    then 1.000000
    else if (=)(0.000000, a) then 0.000000 else ~-.(1.000000)
tel

node myarctan(y : float; x : float) returns (atan : float)
var a_2 : float; o_2 : float; a : float; o : float; l6 : float; l4 : bool;
    l1 : float;
let
  a_2 = x;
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a = y;
  o =
    if (>.)(a, 0.000000)
    then 1.000000
    else if (=)(0.000000, a) then 0.000000 else ~-.(1.000000);
  atan =
    if l4
    then if (<.)(x, 0.000000) then (+.)(Mctypes.pi, l1) else l1
    else (Mctypes.pi /. 2.000000) *. o;
  l6 = if l4 then (/.)(y, x) else 0.000000 -> pre l6;
  l4 = (>.)(o_2, 0.100000);
  l1 = Mathext.atanr(l6)
tel

node missiontrackequalsprevious(previousone : Mctypes.tmissiontrack;
                                 actualone : Mctypes.tmissiontrack)
returns (equal : bool)
var a_6 : float; o_6 : float; a_5 : float; o_5 : float; a_4 : float;
    o_4 : float; a_3 : float; o_3 : float; a_2 : float; o_2 : float;
    a : float; o : float;
let
  a_6 = actualone.Mctypes.m_pos.Mctypes.y;
  o_6 = if (<=.)(0.000000, a_6) then a_6 else ~-.(a_6);
  a_5 = actualone.Mctypes.m_pos.Mctypes.x;
  o_5 = if (<=.)(0.000000, a_5) then a_5 else ~-.(a_5);
  a_4 = previousone.Mctypes.m_pos.Mctypes.y;
  o_4 = if (<=.)(0.000000, a_4) then a_4 else ~-.(a_4);
  a_3 = previousone.Mctypes.m_pos.Mctypes.x;
  o_3 = if (<=.)(0.000000, a_3) then a_3 else ~-.(a_3);
  a_2 =
    (-.)
    (previousone.Mctypes.m_pos.Mctypes.y, actualone.Mctypes.m_pos.Mctypes.y);
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a =
    (-.)
    (previousone.Mctypes.m_pos.Mctypes.x, actualone.Mctypes.m_pos.Mctypes.x);
  o = if (<=.)(0.000000, a) then a else ~-.(a);
  equal =
    (or)
    ((&)
     (not((=)(0, previousone.Mctypes.m_id)),
       (=)(previousone.Mctypes.m_id, actualone.Mctypes.m_id)),
      (&)
      ((&)((<.)(o, 100.000000), (<.)(o_2, 100.000000)),
        not
        ((&)
         ((&)
          ((&)((<.)(o_3, 0.100000), (<.)(o_4, 0.100000)),
            (<.)(o_5, 0.100000)),
           (<.)(o_6, 0.100000)))
          )
        )

tel

node calctrackvisible1(position : Mctypes.tposition; speed : Mctypes.tspeed)
returns (trackvisible : bool)
var a_4 : float; o_4 : float; a_3 : float; o_3 : float; a_2 : float;
    o_2 : float; a : float; o : float;
let
  a_4 = speed.Mctypes.sy;
  o_4 = if (<=.)(0.000000, a_4) then a_4 else ~-.(a_4);
  a_3 = speed.Mctypes.sx;
  o_3 = if (<=.)(0.000000, a_3) then a_3 else ~-.(a_3);
  a_2 = position.Mctypes.y;
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a = position.Mctypes.x;
  o = if (<=.)(0.000000, a) then a else ~-.(a);
  trackvisible =
    not
    ((&)
     ((&)((&)((<.)(o, 0.001000), (<.)(o_2, 0.001000)), (<.)(o_3, 0.001000)),
       (<.)(o_4, 0.001000)))

tel

node missiontrackexist1(acc_tracknumber : int;
                         missiontrack : Mctypes.tmissiontrack;
                         previousmissiontrack : Mctypes.tmissiontrack)
returns (tracknumbertoset : int)
var previousone : Mctypes.tmissiontrack; actualone : Mctypes.tmissiontrack;
    a_6 : float; o_6 : float; a_5 : float; o_5 : float; a_4 : float;
    o_4 : float; a_3 : float; o_3 : float; a_2 : float; o_2 : float;
    a : float; o : float; equal : bool;
let
  previousone = missiontrack;
  actualone = previousmissiontrack;
  a_6 = actualone.Mctypes.m_pos.Mctypes.y;
  o_6 = if (<=.)(0.000000, a_6) then a_6 else ~-.(a_6);
  a_5 = actualone.Mctypes.m_pos.Mctypes.x;
  o_5 = if (<=.)(0.000000, a_5) then a_5 else ~-.(a_5);
  a_4 = previousone.Mctypes.m_pos.Mctypes.y;
  o_4 = if (<=.)(0.000000, a_4) then a_4 else ~-.(a_4);
  a_3 = previousone.Mctypes.m_pos.Mctypes.x;
  o_3 = if (<=.)(0.000000, a_3) then a_3 else ~-.(a_3);
  a_2 =
    (-.)
    (previousone.Mctypes.m_pos.Mctypes.y, actualone.Mctypes.m_pos.Mctypes.y);
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a =
    (-.)
    (previousone.Mctypes.m_pos.Mctypes.x, actualone.Mctypes.m_pos.Mctypes.x);
  o = if (<=.)(0.000000, a) then a else ~-.(a);
  equal =
    (or)
    ((&)
     (not((=)(0, previousone.Mctypes.m_id)),
       (=)(previousone.Mctypes.m_id, actualone.Mctypes.m_id)),
      (&)
      ((&)((<.)(o, 100.000000), (<.)(o_2, 100.000000)),
        not
        ((&)
         ((&)
          ((&)((<.)(o_3, 0.100000), (<.)(o_4, 0.100000)),
            (<.)(o_5, 0.100000)),
           (<.)(o_6, 0.100000)))
          )
        )
      ;
  tracknumbertoset =
    if (&)(equal, not((=)(0, previousmissiontrack.Mctypes.m_tracknumber)))
    then previousmissiontrack.Mctypes.m_tracknumber
    else acc_tracknumber
tel

node missiontrackequalsprevious_orig(previousone : Mctypes.tmissiontrack;
                                      actualone : Mctypes.tmissiontrack)
returns (equal : bool)
var a_6 : float; o_6 : float; a_5 : float; o_5 : float; a_4 : float;
    o_4 : float; a_3 : float; o_3 : float; a_2 : float; o_2 : float;
    a : float; o : float; l43 : bool;
let
  a_6 = actualone.Mctypes.m_pos.Mctypes.y;
  o_6 = if (<=.)(0.000000, a_6) then a_6 else ~-.(a_6);
  a_5 = actualone.Mctypes.m_pos.Mctypes.x;
  o_5 = if (<=.)(0.000000, a_5) then a_5 else ~-.(a_5);
  a_4 = previousone.Mctypes.m_pos.Mctypes.y;
  o_4 = if (<=.)(0.000000, a_4) then a_4 else ~-.(a_4);
  a_3 = previousone.Mctypes.m_pos.Mctypes.x;
  o_3 = if (<=.)(0.000000, a_3) then a_3 else ~-.(a_3);
  a_2 =
    (-.)
    (previousone.Mctypes.m_pos.Mctypes.y, actualone.Mctypes.m_pos.Mctypes.y);
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a =
    (-.)
    (previousone.Mctypes.m_pos.Mctypes.x, actualone.Mctypes.m_pos.Mctypes.x);
  o = if (<=.)(0.000000, a) then a else ~-.(a);
  l43 = not((=)(previousone.Mctypes.m_tracknumber, 0));
  equal =
    (&)
    (l43,
      (or)
      ((&)
       ((&)(l43, not((=)(0, previousone.Mctypes.m_id))),
         (=)(previousone.Mctypes.m_id, actualone.Mctypes.m_id)),
        (&)
        ((&)((<.)(o, 100.000000), (<.)(o_2, 100.000000)),
          not
          ((&)
           ((&)
            ((&)((<.)(o_3, 0.100000), (<.)(o_4, 0.100000)),
              (<.)(o_5, 0.100000)),
             (<.)(o_6, 0.100000)))
            )
          )
        )

tel

node util_radtodeg(input1 : float) returns (output1 : float)
let
  output1 = (/.)(input1, (2.000000 *. Mctypes.pi)) *. 360.000000
tel

node util_degtorad(input1 : float) returns (output1 : float)
let
  output1 = (/.)((2.000000 *. Mctypes.pi) *. input1, 360.000000)
tel

node calctrackangle(speed : Mctypes.tspeed;
                     speedabs : Mctypes.tmetresseconde)
returns (trackangle : float)
var a_2 : float; o_2 : float; a : float; o : float; input1 : float;
    output1 : float; l51 : bool; l48 : float; l47 : float;
let
  a_2 = l47;
  o_2 =
    if (>.)(a_2, 0.000000)
    then 1.000000
    else if (=)(0.000000, a_2) then 0.000000 else ~-.(1.000000);
  a =
    Mathext.asinr((/.)(speed.Mctypes.sy, if l51 then 1.000000 else speedabs));
  o =
    if (>.)(a, 0.000000)
    then 1.000000
    else if (=)(0.000000, a) then 0.000000 else ~-.(1.000000);
  input1 = if l51 then 0.000000 else Mathext.acosr(l47) *. l48;
  output1 = (/.)(input1, (2.000000 *. Mctypes.pi)) *. 360.000000;
  trackangle = output1 *. l48 *. o;
  l51 = (<.)(speedabs, 0.010000);
  l48 = o_2;
  l47 = (/.)(speed.Mctypes.sx, if l51 then 1.000000 else speedabs)
tel

node calctrackvisible(position : Mctypes.tposition)
returns (trackvisible : bool)
var a_2 : float; o_2 : float; a : float; o : float;
let
  a_2 = position.Mctypes.y;
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a = position.Mctypes.x;
  o = if (<=.)(0.000000, a) then a else ~-.(a);
  trackvisible = not((&)((<.)(o, 0.001000), (<.)(o_2, 0.001000)))
tel

node missiontrackexist(missiontrack : Mctypes.tmissiontrack;
                        previousmissiontrack : Mctypes.tmissiontrack;
                        acc_tracknumber : int)
returns (tracknumbertoset : int)
var previousone : Mctypes.tmissiontrack; actualone : Mctypes.tmissiontrack;
    a_6 : float; o_6 : float; a_5 : float; o_5 : float; a_4 : float;
    o_4 : float; a_3 : float; o_3 : float; a_2 : float; o_2 : float;
    a : float; o : float; equal : bool;
let
  previousone = missiontrack;
  actualone = previousmissiontrack;
  a_6 = actualone.Mctypes.m_pos.Mctypes.y;
  o_6 = if (<=.)(0.000000, a_6) then a_6 else ~-.(a_6);
  a_5 = actualone.Mctypes.m_pos.Mctypes.x;
  o_5 = if (<=.)(0.000000, a_5) then a_5 else ~-.(a_5);
  a_4 = previousone.Mctypes.m_pos.Mctypes.y;
  o_4 = if (<=.)(0.000000, a_4) then a_4 else ~-.(a_4);
  a_3 = previousone.Mctypes.m_pos.Mctypes.x;
  o_3 = if (<=.)(0.000000, a_3) then a_3 else ~-.(a_3);
  a_2 =
    (-.)
    (previousone.Mctypes.m_pos.Mctypes.y, actualone.Mctypes.m_pos.Mctypes.y);
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a =
    (-.)
    (previousone.Mctypes.m_pos.Mctypes.x, actualone.Mctypes.m_pos.Mctypes.x);
  o = if (<=.)(0.000000, a) then a else ~-.(a);
  equal =
    (or)
    ((&)
     (not((=)(0, previousone.Mctypes.m_id)),
       (=)(previousone.Mctypes.m_id, actualone.Mctypes.m_id)),
      (&)
      ((&)((<.)(o, 100.000000), (<.)(o_2, 100.000000)),
        not
        ((&)
         ((&)
          ((&)((<.)(o_3, 0.100000), (<.)(o_4, 0.100000)),
            (<.)(o_5, 0.100000)),
           (<.)(o_6, 0.100000)))
          )
        )
      ;
  tracknumbertoset =
    if equal
    then previousmissiontrack.Mctypes.m_tracknumber
    else acc_tracknumber
tel

node calculatevrdivd(vr : float; d : float) returns (result : float)
var l13 : float; l11 : bool;
let
  result = if l11 then l13 else 0.000000;
  l13 = if l11 then (/.)(vr, d) else 0.000000 -> pre l13;
  l11 = (>.)(d, 0.100000)
tel

node trackalowerprioritythanb(a : Mctypes.tmissiontrack;
                               b : Mctypes.tmissiontrack)
returns (prioritary : bool)
var vr_2 : float; d_2 : float; l13_2 : float; l11_2 : bool; result_2 : float;
    vr : float; d : float; l13 : float; l11 : bool; result : float;
let
  vr_2 = b.Mctypes.m_sr;
  d_2 = b.Mctypes.m_d;
  result_2 = if l11_2 then l13_2 else 0.000000;
  l13_2 = if l11_2 then (/.)(vr_2, d_2) else 0.000000 -> pre l13_2;
  l11_2 = (>.)(d_2, 0.100000);
  vr = a.Mctypes.m_sr;
  d = a.Mctypes.m_d;
  result = if l11 then l13 else 0.000000;
  l13 = if l11 then (/.)(vr, d) else 0.000000 -> pre l13;
  l11 = (>.)(d, 0.100000);
  prioritary =
    (or)
    ((or)
     ((=)(a.Mctypes.m_targettype, Mctypes.Ttargettype_friend),
       not(a.Mctypes.m_detectedbyradar)),
      (&)
      ((&)(a.Mctypes.m_detectedbyradar, (<.)(result, result_2)),
        b.Mctypes.m_detectedbyradar))

tel

node comparespeeds(speed1 : Mctypes.tspeed; speed2 : Mctypes.tspeed)
returns (equal : bool)
var a_2 : float; o_2 : float; a : float; o : float;
let
  a_2 = (-.)(speed1.Mctypes.sy, speed2.Mctypes.sy);
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a = (-.)(speed1.Mctypes.sx, speed2.Mctypes.sx);
  o = if (<=.)(0.000000, a) then a else ~-.(a);
  equal = (&)((<.)(o, 1.000000), (<.)(o_2, 1.000000))
tel

node calculateprioritizedtracknb(missiontrack : Mctypes.tmissiontrack)
returns (prioritizedtracknb : int)
let
  prioritizedtracknb =
    if (&)
       (not
        ((=)(missiontrack.Mctypes.m_targettype, Mctypes.Ttargettype_friend)),
         not((=)(missiontrack.Mctypes.m_priority, 0)))
    then missiontrack.Mctypes.m_tracknumber
    else 0
tel

node sortreals(a : float; b : float) returns (newa : float; newb : float)
var l2 : bool;
let
  l2 = (<.)(a, b);
  newb = if l2 then a else b;
  newa = if l2 then b else a
tel

node comparepositions(pos1 : Mctypes.tposition; pos2 : Mctypes.tposition)
returns (equal : bool)
var a_2 : float; o_2 : float; a : float; o : float;
let
  a_2 = (-.)(pos1.Mctypes.y, pos2.Mctypes.y);
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a = (-.)(pos1.Mctypes.x, pos2.Mctypes.x);
  o = if (<=.)(0.000000, a) then a else ~-.(a);
  equal = (&)((<.)(o, 0.100000), (<.)(o_2, 0.100000))
tel

node comparetracks(pos1 : Mctypes.tposition; pos2 : Mctypes.tposition;
                    v1 : Mctypes.tspeed; v2 : Mctypes.tspeed)
returns (equal : bool)
var speed1 : Mctypes.tspeed; speed2 : Mctypes.tspeed; a_2_2 : float;
    o_2_2 : float; a_3 : float; o_3 : float; equal_3 : bool;
    pos1_2 : Mctypes.tposition; pos2_2 : Mctypes.tposition; a_2 : float;
    o_2 : float; a : float; o : float; equal_2 : bool;
let
  speed1 = v1;
  speed2 = v2;
  a_2_2 = (-.)(speed1.Mctypes.sy, speed2.Mctypes.sy);
  o_2_2 = if (<=.)(0.000000, a_2_2) then a_2_2 else ~-.(a_2_2);
  a_3 = (-.)(speed1.Mctypes.sx, speed2.Mctypes.sx);
  o_3 = if (<=.)(0.000000, a_3) then a_3 else ~-.(a_3);
  equal_3 = (&)((<.)(o_3, 1.000000), (<.)(o_2_2, 1.000000));
  pos1_2 = pos1;
  pos2_2 = pos2;
  a_2 = (-.)(pos1_2.Mctypes.y, pos2_2.Mctypes.y);
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a = (-.)(pos1_2.Mctypes.x, pos2_2.Mctypes.x);
  o = if (<=.)(0.000000, a) then a else ~-.(a);
  equal_2 = (&)((<.)(o, 0.100000), (<.)(o_2, 0.100000));
  equal = (&)(equal_2, equal_3)
tel

node setmissiontracknumber(missiontrack : Mctypes.tmissiontrack at r;
                            number : int)
returns (newmissiontrack : Mctypes.tmissiontrack at r)
let
  newmissiontrack = {missiontrack with .Mctypes.m_tracknumber = number}
tel

node missiontrackisnull(missiontrack : Mctypes.tmissiontrack)
returns (isnull : bool)
var pos1 : Mctypes.tposition; pos2 : Mctypes.tposition; v1 : Mctypes.tspeed;
    v2 : Mctypes.tspeed; speed1 : Mctypes.tspeed; speed2 : Mctypes.tspeed;
    a_2_2 : float; o_2_2 : float; a_3 : float; o_3 : float; equal_3 : bool;
    pos1_2 : Mctypes.tposition; pos2_2 : Mctypes.tposition; a_2 : float;
    o_2 : float; a : float; o : float; equal_2 : bool; equal : bool;
let
  pos1 = missiontrack.Mctypes.m_pos;
  pos2 = Mctypes.kInitPosition;
  v1 = missiontrack.Mctypes.m_speed;
  v2 = Mctypes.kInitSpeed;
  speed1 = v1;
  speed2 = v2;
  a_2_2 = (-.)(speed1.Mctypes.sy, speed2.Mctypes.sy);
  o_2_2 = if (<=.)(0.000000, a_2_2) then a_2_2 else ~-.(a_2_2);
  a_3 = (-.)(speed1.Mctypes.sx, speed2.Mctypes.sx);
  o_3 = if (<=.)(0.000000, a_3) then a_3 else ~-.(a_3);
  equal_3 = (&)((<.)(o_3, 1.000000), (<.)(o_2_2, 1.000000));
  pos1_2 = pos1;
  pos2_2 = pos2;
  a_2 = (-.)(pos1_2.Mctypes.y, pos2_2.Mctypes.y);
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a = (-.)(pos1_2.Mctypes.x, pos2_2.Mctypes.x);
  o = if (<=.)(0.000000, a) then a else ~-.(a);
  equal_2 = (&)((<.)(o, 0.100000), (<.)(o_2, 0.100000));
  equal = (&)(equal_2, equal_3);
  isnull = equal
tel

node calculatemissiontracknumber(previousmissiontracks : Mctypes.tmissiontracksarray;
                                  missiontrack : Mctypes.tmissiontrack at r;
                                  currenttracknumber : int)
returns (newmissiontrack : Mctypes.tmissiontrack at r; newtracknumber : int)
var missiontrack_3 : Mctypes.tmissiontrack at r; number : int;
    newmissiontrack_2 : Mctypes.tmissiontrack at r;
    missiontrack_2 : Mctypes.tmissiontrack; pos1 : Mctypes.tposition;
    pos2 : Mctypes.tposition; v1 : Mctypes.tspeed; v2 : Mctypes.tspeed;
    speed1 : Mctypes.tspeed; speed2 : Mctypes.tspeed; a_2_2 : float;
    o_2_2 : float; a_3 : float; o_3 : float; equal_3 : bool;
    pos1_2 : Mctypes.tposition; pos2_2 : Mctypes.tposition; a_2 : float;
    o_2 : float; a : float; o : float; equal_2 : bool; equal : bool;
    isnull : bool; setnewtracknumber : bool; previoustracknumber : int;
let
  missiontrack_3 = missiontrack;
  number = if setnewtracknumber then newtracknumber else previoustracknumber;
  newmissiontrack_2 = {missiontrack_3 with .Mctypes.m_tracknumber = number};
  missiontrack_2 = missiontrack;
  pos1 = missiontrack_2.Mctypes.m_pos;
  pos2 = Mctypes.kInitPosition;
  v1 = missiontrack_2.Mctypes.m_speed;
  v2 = Mctypes.kInitSpeed;
  speed1 = v1;
  speed2 = v2;
  a_2_2 = (-.)(speed1.Mctypes.sy, speed2.Mctypes.sy);
  o_2_2 = if (<=.)(0.000000, a_2_2) then a_2_2 else ~-.(a_2_2);
  a_3 = (-.)(speed1.Mctypes.sx, speed2.Mctypes.sx);
  o_3 = if (<=.)(0.000000, a_3) then a_3 else ~-.(a_3);
  equal_3 = (&)((<.)(o_3, 1.000000), (<.)(o_2_2, 1.000000));
  pos1_2 = pos1;
  pos2_2 = pos2;
  a_2 = (-.)(pos1_2.Mctypes.y, pos2_2.Mctypes.y);
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a = (-.)(pos1_2.Mctypes.x, pos2_2.Mctypes.x);
  o = if (<=.)(0.000000, a) then a else ~-.(a);
  equal_2 = (&)((<.)(o, 0.100000), (<.)(o_2, 0.100000));
  equal = (&)(equal_2, equal_3);
  isnull = equal;
  setnewtracknumber = (&)((=)(previoustracknumber, 0), not(isnull));
  newtracknumber =
    if setnewtracknumber
    then (+)(currenttracknumber, 1)
    else currenttracknumber;
  previoustracknumber =
    fold<<Mctypes.ksizemissiontracksarray>> missiontrackexist
      <(missiontrack)>(previousmissiontracks, 0);
  newmissiontrack = newmissiontrack_2
tel

node calculatetracktargettypefromid(id : int)
returns (targettype : Mctypes.ttargettype)
let
  targettype =
    if (=)(0, id)
    then Mctypes.Ttargettype_unknown
    else if (<=)(id, 500)
         then Mctypes.Ttargettype_friend
         else Mctypes.Ttargettype_foe

tel

node myderivative(inv : float; period : float) returns (o : float)
var a_2 : float; o_3 : float; a : float; o_2 : float; l2 : float;
let
  a_2 = inv;
  o_3 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a = l2;
  o_2 = if (<=.)(0.000000, a) then a else ~-.(a);
  l2 = 0.000000 fby 0.000000 fby inv;
  o =
    if (or)((<.)(o_2, 0.100000), (<.)(o_3, 0.100000))
    then 0.000000
    else 0.000000 -> (/.)((-.)(inv, l2), 2.000000 *. period)
tel

node calculatetrackspeedfrompos(position : Mctypes.tposition)
returns (speed : Mctypes.tspeed)
var inv_2 : float; period_2 : float; a_2_2 : float; o_3_2 : float;
    a_3 : float; o_2_2 : float; l2_2 : float; o_4 : float; inv : float;
    period : float; a_2 : float; o_3 : float; a : float; o_2 : float;
    l2 : float; o : float;
let
  inv_2 = position.Mctypes.y;
  period_2 = Mctypes.t;
  a_2_2 = inv_2;
  o_3_2 = if (<=.)(0.000000, a_2_2) then a_2_2 else ~-.(a_2_2);
  a_3 = l2_2;
  o_2_2 = if (<=.)(0.000000, a_3) then a_3 else ~-.(a_3);
  l2_2 = 0.000000 fby 0.000000 fby inv_2;
  o_4 =
    if (or)((<.)(o_2_2, 0.100000), (<.)(o_3_2, 0.100000))
    then 0.000000
    else 0.000000 -> (/.)((-.)(inv_2, l2_2), 2.000000 *. period_2);
  inv = position.Mctypes.x;
  period = Mctypes.t;
  a_2 = inv;
  o_3 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a = l2;
  o_2 = if (<=.)(0.000000, a) then a else ~-.(a);
  l2 = 0.000000 fby 0.000000 fby inv;
  o =
    if (or)((<.)(o_2, 0.100000), (<.)(o_3, 0.100000))
    then 0.000000
    else 0.000000 -> (/.)((-.)(inv, l2), 2.000000 *. period);
  speed = { Mctypes.sx = o; Mctypes.sy = o_4 }
tel

node selectdetectedtrack(index : int; tracks : Mctypes.ttracksarray;
                          defaulttrack : Mctypes.ttrack)
returns (trackselected : Mctypes.ttrack)
let
  trackselected = tracks.[index] default defaulttrack
tel

node setmissiontrackpriority(missiontrack : Mctypes.tmissiontrack at r;
                              priority : int)
returns (newmissiontrack : Mctypes.tmissiontrack at r)
let
  newmissiontrack =
    {missiontrack with .Mctypes.m_priority =
      if missiontrack.Mctypes.m_detectedbyradar then priority else 0}
tel

node sortblockmissiontrack(a : Mctypes.tmissiontrack;
                            b : Mctypes.tmissiontrack)
returns (newa : Mctypes.tmissiontrack; newb : Mctypes.tmissiontrack)
var missiontrack : Mctypes.tmissiontrack; pos1 : Mctypes.tposition;
    pos2 : Mctypes.tposition; v1 : Mctypes.tspeed; v2 : Mctypes.tspeed;
    speed1 : Mctypes.tspeed; speed2 : Mctypes.tspeed; a_2_2 : float;
    o_2_2 : float; a_3 : float; o_3 : float; equal_3 : bool;
    pos1_2 : Mctypes.tposition; pos2_2 : Mctypes.tposition; a_2 : float;
    o_2 : float; a_4 : float; o : float; equal_2 : bool; equal : bool;
    isnull : bool; l7 : bool;
let
  missiontrack = a;
  pos1 = missiontrack.Mctypes.m_pos;
  pos2 = Mctypes.kInitPosition;
  v1 = missiontrack.Mctypes.m_speed;
  v2 = Mctypes.kInitSpeed;
  speed1 = v1;
  speed2 = v2;
  a_2_2 = (-.)(speed1.Mctypes.sy, speed2.Mctypes.sy);
  o_2_2 = if (<=.)(0.000000, a_2_2) then a_2_2 else ~-.(a_2_2);
  a_3 = (-.)(speed1.Mctypes.sx, speed2.Mctypes.sx);
  o_3 = if (<=.)(0.000000, a_3) then a_3 else ~-.(a_3);
  equal_3 = (&)((<.)(o_3, 1.000000), (<.)(o_2_2, 1.000000));
  pos1_2 = pos1;
  pos2_2 = pos2;
  a_2 = (-.)(pos1_2.Mctypes.y, pos2_2.Mctypes.y);
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a_4 = (-.)(pos1_2.Mctypes.x, pos2_2.Mctypes.x);
  o = if (<=.)(0.000000, a_4) then a_4 else ~-.(a_4);
  equal_2 = (&)((<.)(o, 0.100000), (<.)(o_2, 0.100000));
  equal = (&)(equal_2, equal_3);
  isnull = equal;
  l7 = isnull;
  newb = if l7 then a else b;
  newa = if l7 then b else a
tel

node sortblockpriorities(a : Mctypes.tmissiontrack;
                          b : Mctypes.tmissiontrack)
returns (newa : Mctypes.tmissiontrack; newb : Mctypes.tmissiontrack)
var a_2 : Mctypes.tmissiontrack; b_2 : Mctypes.tmissiontrack; vr_2 : float;
    d_2 : float; l13_2 : float; l11_2 : bool; result_2 : float; vr : float;
    d : float; l13 : float; l11 : bool; result : float; prioritary : bool;
    l25 : bool;
let
  a_2 = a;
  b_2 = b;
  vr_2 = b_2.Mctypes.m_sr;
  d_2 = b_2.Mctypes.m_d;
  result_2 = if l11_2 then l13_2 else 0.000000;
  l13_2 = if l11_2 then (/.)(vr_2, d_2) else 0.000000 -> pre l13_2;
  l11_2 = (>.)(d_2, 0.100000);
  vr = a_2.Mctypes.m_sr;
  d = a_2.Mctypes.m_d;
  result = if l11 then l13 else 0.000000;
  l13 = if l11 then (/.)(vr, d) else 0.000000 -> pre l13;
  l11 = (>.)(d, 0.100000);
  prioritary =
    (or)
    ((or)
     ((=)(a_2.Mctypes.m_targettype, Mctypes.Ttargettype_friend),
       not(a_2.Mctypes.m_detectedbyradar)),
      (&)
      ((&)(a_2.Mctypes.m_detectedbyradar, (<.)(result, result_2)),
        b_2.Mctypes.m_detectedbyradar))
      ;
  l25 = prioritary;
  newb = if l25 then a else b;
  newa = if l25 then b else a
tel

node position_equal(p1 : Mctypes.tposition; p2 : Mctypes.tposition)
returns (res : bool)
let
  res = (&)((=)(p1.Mctypes.x, p2.Mctypes.x), (=)(p1.Mctypes.y, p2.Mctypes.y))
tel

node speed_equal(s1 : Mctypes.tspeed; s2 : Mctypes.tspeed)
returns (res : bool)
let
  res =
    (&)((=)(s1.Mctypes.sx, s2.Mctypes.sx), (=)(s1.Mctypes.sy, s2.Mctypes.sy))
tel

node convertifftracktomissiontrack(ifftrack : Mctypes.tifftrack)
returns (missiontrack : Mctypes.tmissiontrack)
var position_2 : Mctypes.tposition; a_2_3 : float; o_2_3 : float;
    a_4 : float; o_5 : float; trackvisible : bool; id : int;
    targettype : Mctypes.ttargettype; p1_2 : Mctypes.tposition;
    p2_2 : Mctypes.tposition; res_2 : bool; position : Mctypes.tposition;
    inv_2 : float; period_2 : float; a_2_2 : float; o_3_2 : float;
    a_3 : float; o_2_2 : float; l2_2 : float; o_4 : float; inv : float;
    period : float; a_2 : float; o_3 : float; a : float; o_2 : float;
    l2 : float; o : float; speed : Mctypes.tspeed; p1 : Mctypes.tposition;
    p2 : Mctypes.tposition; res : bool;
let
  position_2 = ifftrack.Mctypes.i_pos;
  a_2_3 = position_2.Mctypes.y;
  o_2_3 = if (<=.)(0.000000, a_2_3) then a_2_3 else ~-.(a_2_3);
  a_4 = position_2.Mctypes.x;
  o_5 = if (<=.)(0.000000, a_4) then a_4 else ~-.(a_4);
  trackvisible = not((&)((<.)(o_5, 0.001000), (<.)(o_2_3, 0.001000)));
  id = ifftrack.Mctypes.i_id;
  targettype =
    if (=)(0, id)
    then Mctypes.Ttargettype_unknown
    else if (<=)(id, 500)
         then Mctypes.Ttargettype_friend
         else Mctypes.Ttargettype_foe
      ;
  p1_2 = ifftrack.Mctypes.i_pos;
  p2_2 = Mctypes.kInitPosition;
  res_2 =
    (&)
    ((=)(p1_2.Mctypes.x, p2_2.Mctypes.x),
      (=)(p1_2.Mctypes.y, p2_2.Mctypes.y));
  position = ifftrack.Mctypes.i_pos;
  inv_2 = position.Mctypes.y;
  period_2 = Mctypes.t;
  a_2_2 = inv_2;
  o_3_2 = if (<=.)(0.000000, a_2_2) then a_2_2 else ~-.(a_2_2);
  a_3 = l2_2;
  o_2_2 = if (<=.)(0.000000, a_3) then a_3 else ~-.(a_3);
  l2_2 = 0.000000 fby 0.000000 fby inv_2;
  o_4 =
    if (or)((<.)(o_2_2, 0.100000), (<.)(o_3_2, 0.100000))
    then 0.000000
    else 0.000000 -> (/.)((-.)(inv_2, l2_2), 2.000000 *. period_2);
  inv = position.Mctypes.x;
  period = Mctypes.t;
  a_2 = inv;
  o_3 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a = l2;
  o_2 = if (<=.)(0.000000, a) then a else ~-.(a);
  l2 = 0.000000 fby 0.000000 fby inv;
  o =
    if (or)((<.)(o_2, 0.100000), (<.)(o_3, 0.100000))
    then 0.000000
    else 0.000000 -> (/.)((-.)(inv, l2), 2.000000 *. period);
  speed = { Mctypes.sx = o; Mctypes.sy = o_4 };
  p1 = Mctypes.kInitPosition;
  p2 = ifftrack.Mctypes.i_pos;
  res = (&)((=)(p1.Mctypes.x, p2.Mctypes.x), (=)(p1.Mctypes.y, p2.Mctypes.y));
  missiontrack =
    { Mctypes.m_pos =
      ifftrack.Mctypes.i_pos;
      Mctypes.m_speed =
      if res then Mctypes.kInitSpeed else speed;
      Mctypes.m_id =
      ifftrack.Mctypes.i_id;
      Mctypes.m_priority =
      0;
      Mctypes.m_d =
      0.000000;
      Mctypes.m_sabs =
      0.000000;
      Mctypes.m_sr =
      0.000000;
      Mctypes.m_detectedbyradar =
      false;
      Mctypes.m_detectedbyiff =
      not((&)(res_2, (=)(ifftrack.Mctypes.i_id, 0)));
      Mctypes.m_tracknumber =
      0;
      Mctypes.m_targettype =
      targettype;
      Mctypes.m_isvisible =
      trackvisible;
      Mctypes.m_angle =
      0.000000 }
tel

node convertrdrtracktomissiontrack(rdrtrack : Mctypes.trdrtrack)
returns (missiontrack : Mctypes.tmissiontrack)
var speed : Mctypes.tspeed; speedabs : Mctypes.tmetresseconde; a_2_2 : float;
    o_2_2 : float; a_3 : float; o_3 : float; input1 : float; output1 : float;
    l51 : bool; l48 : float; l47 : float; trackangle : float;
    position : Mctypes.tposition; a_2 : float; o_2 : float; a : float;
    o : float; trackvisible : bool; s1 : Mctypes.tspeed; s2 : Mctypes.tspeed;
    res_2 : bool; p1 : Mctypes.tposition; p2 : Mctypes.tposition; res : bool;
let
  speed = rdrtrack.Mctypes.r_s;
  speedabs = rdrtrack.Mctypes.r_sabs;
  a_2_2 = l47;
  o_2_2 =
    if (>.)(a_2_2, 0.000000)
    then 1.000000
    else if (=)(0.000000, a_2_2) then 0.000000 else ~-.(1.000000);
  a_3 =
    Mathext.asinr((/.)(speed.Mctypes.sy, if l51 then 1.000000 else speedabs));
  o_3 =
    if (>.)(a_3, 0.000000)
    then 1.000000
    else if (=)(0.000000, a_3) then 0.000000 else ~-.(1.000000);
  input1 = if l51 then 0.000000 else Mathext.acosr(l47) *. l48;
  output1 = (/.)(input1, (2.000000 *. Mctypes.pi)) *. 360.000000;
  trackangle = output1 *. l48 *. o_3;
  l51 = (<.)(speedabs, 0.010000);
  l48 = o_2_2;
  l47 = (/.)(speed.Mctypes.sx, if l51 then 1.000000 else speedabs);
  position = rdrtrack.Mctypes.r_pos;
  a_2 = position.Mctypes.y;
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a = position.Mctypes.x;
  o = if (<=.)(0.000000, a) then a else ~-.(a);
  trackvisible = not((&)((<.)(o, 0.001000), (<.)(o_2, 0.001000)));
  s1 = rdrtrack.Mctypes.r_s;
  s2 = Mctypes.kInitSpeed;
  res_2 =
    (&)((=)(s1.Mctypes.sx, s2.Mctypes.sx), (=)(s1.Mctypes.sy, s2.Mctypes.sy));
  p1 = rdrtrack.Mctypes.r_pos;
  p2 = Mctypes.kInitPosition;
  res = (&)((=)(p1.Mctypes.x, p2.Mctypes.x), (=)(p1.Mctypes.y, p2.Mctypes.y));
  missiontrack =
    { Mctypes.m_pos =
      rdrtrack.Mctypes.r_pos;
      Mctypes.m_speed =
      rdrtrack.Mctypes.r_s;
      Mctypes.m_id =
      0;
      Mctypes.m_priority =
      0;
      Mctypes.m_d =
      rdrtrack.Mctypes.r_d;
      Mctypes.m_sabs =
      rdrtrack.Mctypes.r_sabs;
      Mctypes.m_sr =
      rdrtrack.Mctypes.r_sr;
      Mctypes.m_detectedbyradar =
      not
      ((&)
       ((&)
        ((&)((&)(res, res_2), (=)(rdrtrack.Mctypes.r_d, 0.000000)),
          (=)(rdrtrack.Mctypes.r_sabs, 0.000000)),
         (=)(rdrtrack.Mctypes.r_sr, 0.000000)))
        ;
      Mctypes.m_detectedbyiff =
      false;
      Mctypes.m_tracknumber =
      0;
      Mctypes.m_targettype =
      Mctypes.Ttargettype_unknown;
      Mctypes.m_isvisible =
      trackvisible;
      Mctypes.m_angle =
      trackangle }
tel

node vectnorme(a : float; b : float) returns (c : float)
let
  c = Mathext.sqrtr((+.)(a *. a, b *. b))
tel

node extracttrackposxy(track : Mctypes.ttrack)
returns (x : Mctypes.tmetres; y : Mctypes.tmetres)
let
  y = track.Mctypes.t_pos.Mctypes.y;
  x = track.Mctypes.t_pos.Mctypes.x
tel

node elaboraterdrtrack(track : Mctypes.ttrack)
returns (rdrtrack : Mctypes.trdrtrack)
var position : Mctypes.tposition; inv_2 : float; period_2 : float;
    a_2_2 : float; o_3_2 : float; a_3 : float; o_2_2 : float; l2_2 : float;
    o_4 : float; inv : float; period : float; a_2_3 : float; o_3 : float;
    a_4 : float; o_2 : float; l2 : float; o : float; speed : Mctypes.tspeed;
    a_2 : float; b_2 : float; c_2 : float; a : float; b : float; c : float;
    track_2 : Mctypes.ttrack; x_2 : Mctypes.tmetres; y_2 : Mctypes.tmetres;
    d : float; v : float; vr : float; vx : float; vy : float; x : float;
    y : float; l142 : Mctypes.tspeed;
let
  position = { Mctypes.x = x; Mctypes.y = y };
  inv_2 = position.Mctypes.y;
  period_2 = Mctypes.t;
  a_2_2 = inv_2;
  o_3_2 = if (<=.)(0.000000, a_2_2) then a_2_2 else ~-.(a_2_2);
  a_3 = l2_2;
  o_2_2 = if (<=.)(0.000000, a_3) then a_3 else ~-.(a_3);
  l2_2 = 0.000000 fby 0.000000 fby inv_2;
  o_4 =
    if (or)((<.)(o_2_2, 0.100000), (<.)(o_3_2, 0.100000))
    then 0.000000
    else 0.000000 -> (/.)((-.)(inv_2, l2_2), 2.000000 *. period_2);
  inv = position.Mctypes.x;
  period = Mctypes.t;
  a_2_3 = inv;
  o_3 = if (<=.)(0.000000, a_2_3) then a_2_3 else ~-.(a_2_3);
  a_4 = l2;
  o_2 = if (<=.)(0.000000, a_4) then a_4 else ~-.(a_4);
  l2 = 0.000000 fby 0.000000 fby inv;
  o =
    if (or)((<.)(o_2, 0.100000), (<.)(o_3, 0.100000))
    then 0.000000
    else 0.000000 -> (/.)((-.)(inv, l2), 2.000000 *. period);
  speed = { Mctypes.sx = o; Mctypes.sy = o_4 };
  a_2 = x;
  b_2 = y;
  c_2 = Mathext.sqrtr((+.)(a_2 *. a_2, b_2 *. b_2));
  a = vx;
  b = vy;
  c = Mathext.sqrtr((+.)(a *. a, b *. b));
  track_2 = track;
  y_2 = track_2.Mctypes.t_pos.Mctypes.y;
  x_2 = track_2.Mctypes.t_pos.Mctypes.x;
  switch ((=)(d, 0.000000))
    | true
       do
      vr = 0.000000
    | false
      var xnorm : float; ynorm : float; do

      ynorm = (/.)(y, d);
      xnorm = (/.)(x, d);
      vr = ~-.((+.)(vx *. xnorm, vy *. ynorm))
  end;
  (x, y) = (x_2, y_2);
  rdrtrack =
    { Mctypes.r_pos =
      { Mctypes.x = x; Mctypes.y = y };
      Mctypes.r_s =
      { Mctypes.sx = vx; Mctypes.sy = vy };
      Mctypes.r_d =
      d;
      Mctypes.r_sabs =
      v;
      Mctypes.r_sr =
      vr };
  v = c;
  d = c_2;
  vy = l142.Mctypes.sy;
  vx = l142.Mctypes.sx;
  l142 = speed
tel

node risingEdge(re_Input : bool) returns (re_Output : bool)
let
  re_Output = (&)(not(re_Input -> pre re_Input), re_Input)
tel

node statecmd(onoffbuttonpressed : bool; currentstate : Mctypes.tsensorstate)
returns (onoffcmd : bool)
let
  automaton
    state Off
       do
      onoffcmd = false
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_OFF)) then On
    state On
       do
      onoffcmd = true
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_ON)) then Off
  end
tel

node mc_rdrstatecmd(rdronoffbutton : bool;
                     currentrdrstate : Mctypes.tsensorstate)
returns (rdronoffcmd : bool)
var onoffbuttonpressed : bool; currentstate : Mctypes.tsensorstate;
    onoffcmd : bool; re_Input : bool; re_Output : bool;
let
  onoffbuttonpressed = re_Output;
  currentstate = currentrdrstate;
  automaton
    state Off
       do
      onoffcmd = false
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_OFF)) then On
    state On
       do
      onoffcmd = true
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_ON)) then Off
  end;
  re_Input = rdronoffbutton;
  re_Output = (&)(not(re_Input -> pre re_Input), re_Input);
  rdronoffcmd = onoffcmd
tel

node mc_iffstatecmd(iffonoffbutton : bool;
                     currentiffstate : Mctypes.tsensorstate)
returns (iffonoffcmd : bool)
var onoffbuttonpressed : bool; currentstate : Mctypes.tsensorstate;
    onoffcmd : bool; re_Input : bool; re_Output : bool;
let
  onoffbuttonpressed = re_Output;
  currentstate = currentiffstate;
  automaton
    state Off
       do
      onoffcmd = false
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_OFF)) then On
    state On
       do
      onoffcmd = true
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_ON)) then Off
  end;
  re_Input = iffonoffbutton;
  re_Output = (&)(not(re_Input -> pre re_Input), re_Input);
  iffonoffcmd = onoffcmd
tel

node rdrmodecmd(currentstate : Mctypes.tsensorstate;
                 modebuttonpressed : bool; currentmode : Mctypes.trdrmode)
returns (modecmd : bool)
let
  automaton
    state Wide
       do
      modecmd = false
      unless
      | (&)
        (modebuttonpressed,
          (&)
          ((=)(currentstate, Mctypes.TState_ON),
            (=)(currentmode, Mctypes.TRdrMode_WIDE)))
           then Narrow
    state Narrow
       do
      modecmd = true
      unless
      | (&)
        (modebuttonpressed,
          (&)
          ((=)(currentstate, Mctypes.TState_ON),
            (=)(currentmode, Mctypes.TRdrMode_NARROW)))
           then Wide
  end
tel

node mc_rdrmodecmd(currentrdrstate : Mctypes.tsensorstate;
                    rdrmodebutton : bool; currentrdrmode : Mctypes.trdrmode)
returns (rdrmodecmd : bool)
var currentstate : Mctypes.tsensorstate; modebuttonpressed : bool;
    currentmode : Mctypes.trdrmode; modecmd : bool; re_Input : bool;
    re_Output : bool;
let
  currentstate = currentrdrstate;
  modebuttonpressed = re_Output;
  currentmode = currentrdrmode;
  automaton
    state Wide
       do
      modecmd = false
      unless
      | (&)
        (modebuttonpressed,
          (&)
          ((=)(currentstate, Mctypes.TState_ON),
            (=)(currentmode, Mctypes.TRdrMode_WIDE)))
           then Narrow
    state Narrow
       do
      modecmd = true
      unless
      | (&)
        (modebuttonpressed,
          (&)
          ((=)(currentstate, Mctypes.TState_ON),
            (=)(currentmode, Mctypes.TRdrMode_NARROW)))
           then Wide
  end;
  re_Input = rdrmodebutton;
  re_Output = (&)(not(re_Input -> pre re_Input), re_Input);
  rdrmodecmd = modecmd
tel

node radar_mode(modecmd : bool) returns (mode : Mctypes.trdrmode)
let
  mode = if modecmd then Mctypes.TRdrMode_NARROW else Mctypes.TRdrMode_WIDE
tel

node radar_state(onoffcmd : bool; failure : bool)
returns (initializing : bool; st : Mctypes.tsensorstate)
var x : bool;
let
  initializing = (&)((=)(st, Mctypes.TState_OFF), onoffcmd);
  x = false fby false fby false fby false fby false fby onoffcmd;
  st =
    if failure
    then Mctypes.TState_FAIL
    else if if onoffcmd then x else false
         then Mctypes.TState_ON
         else Mctypes.TState_OFF

tel

node radar_tracks(st : Mctypes.tsensorstate; tracks : Mctypes.ttracksarray;
                   rdrdetectedtracks : Mctypes.tdetectedrdrtracksarray)
returns (rdrtracks : Mctypes.trdrtracksarray)
var l22 : Mctypes.ttrack^Mctypes.ksizerdrtracksarray;
    l30 : Mctypes.trdrtrack^Mctypes.ksizerdrtracksarray;
let
  rdrtracks =
    if (=)(st, Mctypes.TState_ON) then l30 else Mctypes.kinitrdrtrackarray;
  l30 = map<<Mctypes.ksizerdrtracksarray>> elaboraterdrtrack<()>(l22);
  l22 =
    map<<Mctypes.ksizerdrtracksarray>> selectdetectedtrack
      <()>(rdrdetectedtracks, tracks^Mctypes.ksizerdrtracksarray,
            Mctypes.kinittrack^Mctypes.ksizerdrtracksarray)
tel

node radar(onoffcmd : bool; modecmd : bool; failure : bool;
            rdrdetectedtracks : Mctypes.tdetectedrdrtracksarray;
            tracks : Mctypes.ttracksarray)
returns (initializing : bool; st : Mctypes.tsensorstate;
          mode : Mctypes.trdrmode; rdrtracks : Mctypes.trdrtracksarray)
var onoffcmd_2 : bool; failure_2 : bool; x : bool; initializing_2 : bool;
    st_3 : Mctypes.tsensorstate; modecmd_2 : bool; mode_2 : Mctypes.trdrmode;
    st_2 : Mctypes.tsensorstate; tracks_2 : Mctypes.ttracksarray;
    rdrdetectedtracks_2 : Mctypes.tdetectedrdrtracksarray;
    l22 : Mctypes.ttrack^Mctypes.ksizerdrtracksarray;
    l30 : Mctypes.trdrtrack^Mctypes.ksizerdrtracksarray;
    rdrtracks_2 : Mctypes.trdrtracksarray;
let
  onoffcmd_2 = onoffcmd;
  failure_2 = failure;
  initializing_2 = (&)((=)(st_3, Mctypes.TState_OFF), onoffcmd_2);
  x = false fby false fby false fby false fby false fby onoffcmd_2;
  st_3 =
    if failure_2
    then Mctypes.TState_FAIL
    else if if onoffcmd_2 then x else false
         then Mctypes.TState_ON
         else Mctypes.TState_OFF
      ;
  modecmd_2 = modecmd;
  mode_2 =
    if modecmd_2 then Mctypes.TRdrMode_NARROW else Mctypes.TRdrMode_WIDE;
  st_2 = st;
  tracks_2 = tracks;
  rdrdetectedtracks_2 = rdrdetectedtracks;
  rdrtracks_2 =
    if (=)(st_2, Mctypes.TState_ON) then l30 else Mctypes.kinitrdrtrackarray;
  l30 = map<<Mctypes.ksizerdrtracksarray>> elaboraterdrtrack<()>(l22);
  l22 =
    map<<Mctypes.ksizerdrtracksarray>> selectdetectedtrack
      <()>(rdrdetectedtracks_2, tracks_2^Mctypes.ksizerdrtracksarray,
            Mctypes.kinittrack^Mctypes.ksizerdrtracksarray);
  rdrtracks = rdrtracks_2;
  mode = mode_2;
  (initializing, st) = (initializing_2, st_3)
tel

node iff_state(onoffcmd : bool; failure : bool)
returns (initializing : bool; st : Mctypes.tsensorstate)
var x : bool;
let
  initializing = (&)((=)(st, Mctypes.TState_OFF), onoffcmd);
  x = false fby false fby false fby false fby false fby onoffcmd;
  st =
    if failure
    then Mctypes.TState_FAIL
    else if if onoffcmd then x else false
         then Mctypes.TState_ON
         else Mctypes.TState_OFF

tel

node ifftrack_of_track(track : Mctypes.ttrack)
returns (ifftrack : Mctypes.tifftrack)
let
  ifftrack =
    { Mctypes.i_pos =
      track.Mctypes.t_pos;
      Mctypes.i_id =
      track.Mctypes.t_id }
tel

node iff_tracks(st : Mctypes.tsensorstate; tracks : Mctypes.ttracksarray;
                 iffdetectedtracks : Mctypes.tdetectedifftracksarray)
returns (ifftracks : Mctypes.tifftracksarray)
var l34 : Mctypes.ttrack^Mctypes.ksizeifftracksarray;
    l40 : Mctypes.tifftracksarray;
let
  l34 =
    map<<Mctypes.ksizeifftracksarray>> selectdetectedtrack
      <()>(iffdetectedtracks, tracks^Mctypes.ksizeifftracksarray,
            Mctypes.kinittrack^Mctypes.ksizeifftracksarray);
  l40 = map<<Mctypes.ksizeifftracksarray>> ifftrack_of_track<()>(l34);
  ifftracks =
    if (=)(st, Mctypes.TState_ON) then l40 else Mctypes.kinitifftrackarray
tel

node iff(tracks : Mctypes.ttracksarray; failure : bool;
          iffdetectedtracks : Mctypes.tdetectedifftracksarray;
          onoffcmd : bool)
returns (st : Mctypes.tsensorstate; ifftracks : Mctypes.tifftracksarray;
          initializing : bool)
var onoffcmd_2 : bool; failure_2 : bool; x : bool; initializing_2 : bool;
    st_3 : Mctypes.tsensorstate; st_2 : Mctypes.tsensorstate;
    tracks_2 : Mctypes.ttracksarray;
    iffdetectedtracks_2 : Mctypes.tdetectedifftracksarray;
    l34 : Mctypes.ttrack^Mctypes.ksizeifftracksarray;
    l40 : Mctypes.tifftracksarray; ifftracks_2 : Mctypes.tifftracksarray;
let
  onoffcmd_2 = onoffcmd;
  failure_2 = failure;
  initializing_2 = (&)((=)(st_3, Mctypes.TState_OFF), onoffcmd_2);
  x = false fby false fby false fby false fby false fby onoffcmd_2;
  st_3 =
    if failure_2
    then Mctypes.TState_FAIL
    else if if onoffcmd_2 then x else false
         then Mctypes.TState_ON
         else Mctypes.TState_OFF
      ;
  st_2 = st;
  tracks_2 = tracks;
  iffdetectedtracks_2 = iffdetectedtracks;
  l34 =
    map<<Mctypes.ksizeifftracksarray>> selectdetectedtrack
      <()>(iffdetectedtracks_2, tracks_2^Mctypes.ksizeifftracksarray,
            Mctypes.kinittrack^Mctypes.ksizeifftracksarray);
  l40 = map<<Mctypes.ksizeifftracksarray>> ifftrack_of_track<()>(l34);
  ifftracks_2 =
    if (=)(st_2, Mctypes.TState_ON) then l40 else Mctypes.kinitifftrackarray;
  ifftracks = ifftracks_2;
  (initializing, st) = (initializing_2, st_3)
tel

node advrandr(min : float; max : float) returns (output1 : float)
let
  output1 = (+.)((-.)(max, min) *. Mc_ext.rand(), min)
tel

node advrandi(min : int; max : int; step : int) returns (output1 : int)
var l8 : int;
let
  l8 = if not((=)(0, step)) then step else 1;
  output1 =
    (/)
    ((+)
     (Mc_ext.int_of_float
      (Mc_ext.float_of_int((-)(max, min)) *. Mc_ext.rand()), min), l8 * l8)
tel

node createtracks_createonetrack_init_rand()
returns (sloperadinit : float; speedinit : float; xmeterinit : float;
          ymeterinit : float; idinit : int)
var min_5 : int; max_5 : int; step : int; l8 : int; output1_5 : int;
    min_4 : float; max_4 : float; output1_4 : float; min_3 : float;
    max_3 : float; output1_3 : float; min_2 : float; max_2 : float;
    output1_2 : float; min : float; max : float; output1 : float;
let
  min_5 = 0;
  max_5 = 1000;
  step = 10;
  l8 = if not((=)(0, step)) then step else 1;
  output1_5 =
    (/)
    ((+)
     (Mc_ext.int_of_float
      (Mc_ext.float_of_int((-)(max_5, min_5)) *. Mc_ext.rand()), min_5),
      l8 * l8);
  min_4 = 0.000000;
  max_4 = 360.000000;
  output1_4 = (+.)((-.)(max_4, min_4) *. Mc_ext.rand(), min_4);
  min_3 = ~-.(10.000000);
  max_3 = 10.000000;
  output1_3 = (+.)((-.)(max_3, min_3) *. Mc_ext.rand(), min_3);
  min_2 = ~-.(10.000000);
  max_2 = 10.000000;
  output1_2 = (+.)((-.)(max_2, min_2) *. Mc_ext.rand(), min_2);
  min = 250.000000;
  max = 1000.000000;
  output1 = (+.)((-.)(max, min) *. Mc_ext.rand(), min);
  speedinit = output1 *. Mctypes.t;
  ymeterinit = Mctypes.nm *. output1_2;
  xmeterinit = output1_3 *. Mctypes.nm;
  sloperadinit = (/.)((2.000000 *. Mctypes.pi) *. output1_4, 360.000000);
  idinit = output1_5
tel

node createtracks_createonetrack_rand(res : bool)
returns (track : Mctypes.ttrack)
var min_5 : int; max_5 : int; step : int; l8 : int; output1_5 : int;
    min_4 : float; max_4 : float; output1_4 : float; min_3 : float;
    max_3 : float; output1_3 : float; min_2 : float; max_2 : float;
    output1_2 : float; min : float; max : float; output1 : float;
    sloperadinit : float; speedinit : float; xmeterinit : float;
    ymeterinit : float; idinit : int; id : int; sloperad : float;
    speedt : float; x0 : float; y0 : float; l9 : float; l18 : float;
let
  min_5 = 0;
  max_5 = 1000;
  step = 10;
  l8 = if not((=)(0, step)) then step else 1;
  output1_5 =
    (/)
    ((+)
     (Mc_ext.int_of_float
      (Mc_ext.float_of_int((-)(max_5, min_5)) *. Mc_ext.rand()), min_5),
      l8 * l8);
  min_4 = 0.000000;
  max_4 = 360.000000;
  output1_4 = (+.)((-.)(max_4, min_4) *. Mc_ext.rand(), min_4);
  min_3 = ~-.(10.000000);
  max_3 = 10.000000;
  output1_3 = (+.)((-.)(max_3, min_3) *. Mc_ext.rand(), min_3);
  min_2 = ~-.(10.000000);
  max_2 = 10.000000;
  output1_2 = (+.)((-.)(max_2, min_2) *. Mc_ext.rand(), min_2);
  min = 250.000000;
  max = 1000.000000;
  output1 = (+.)((-.)(max, min) *. Mc_ext.rand(), min);
  speedinit = output1 *. Mctypes.t;
  ymeterinit = Mctypes.nm *. output1_2;
  xmeterinit = output1_3 *. Mctypes.nm;
  sloperadinit = (/.)((2.000000 *. Mctypes.pi) *. output1_4, 360.000000);
  idinit = output1_5;
  (sloperad, speedt, x0, y0, id) =
    if res
    then (sloperadinit, speedinit, xmeterinit, ymeterinit, idinit)
    else (0.000000, 0.000000, 0.000000, 0.000000, 0) fby
           (sloperad, speedt, x0, y0, id)
      ;
  l18 = y0 -> (+.)(Mathext.sinr(sloperad) *. speedt, y0 -> pre l18);
  l9 = x0 -> (+.)(x0 -> pre l9, speedt *. Mathext.cosr(sloperad));
  track =
    { Mctypes.t_pos =
      { Mctypes.x = l9; Mctypes.y = l18 };
      Mctypes.t_id =
      id }
tel

node createtracks_rand(res : bool) returns (tracks : Mctypes.ttracksarray)
let
  tracks =
    map<<Mctypes.ksizetracksarray>> createtracks_createonetrack_rand
      <()>(res^Mctypes.ksizetracksarray)
tel

node createalltracks(res : bool) returns (tracks : Mctypes.ttracksarray)
let
  reset
    var res_2 : bool; tracks_2 : Mctypes.ttracksarray; in

    res_2 = res;
    tracks_2 =
      map<<Mctypes.ksizetracksarray>> createtracks_createonetrack_rand
        <()>(res_2^Mctypes.ksizetracksarray);
    tracks = tracks_2
  every res
tel

node fusionrdrifftracks(iffmissiontrack : Mctypes.tmissiontrack at r1;
                         rdrmissiontrack : Mctypes.tmissiontrack at r2)
returns (newiffmissiontrack : Mctypes.tmissiontrack at r1;
          newrdrmissiontrack : Mctypes.tmissiontrack at r2)
var pos1 : Mctypes.tposition; pos2 : Mctypes.tposition; v1 : Mctypes.tspeed;
    v2 : Mctypes.tspeed; speed1 : Mctypes.tspeed; speed2 : Mctypes.tspeed;
    a_2_2 : float; o_2_2 : float; a_3 : float; o_3 : float; equal_3 : bool;
    pos1_2 : Mctypes.tposition; pos2_2 : Mctypes.tposition; a_2 : float;
    o_2 : float; a : float; o : float; equal_2 : bool; equal : bool;
    l90 : bool;
let
  pos1 = rdrmissiontrack.Mctypes.m_pos;
  pos2 = iffmissiontrack.Mctypes.m_pos;
  v1 = rdrmissiontrack.Mctypes.m_speed;
  v2 = iffmissiontrack.Mctypes.m_speed;
  speed1 = v1;
  speed2 = v2;
  a_2_2 = (-.)(speed1.Mctypes.sy, speed2.Mctypes.sy);
  o_2_2 = if (<=.)(0.000000, a_2_2) then a_2_2 else ~-.(a_2_2);
  a_3 = (-.)(speed1.Mctypes.sx, speed2.Mctypes.sx);
  o_3 = if (<=.)(0.000000, a_3) then a_3 else ~-.(a_3);
  equal_3 = (&)((<.)(o_3, 1.000000), (<.)(o_2_2, 1.000000));
  pos1_2 = pos1;
  pos2_2 = pos2;
  a_2 = (-.)(pos1_2.Mctypes.y, pos2_2.Mctypes.y);
  o_2 = if (<=.)(0.000000, a_2) then a_2 else ~-.(a_2);
  a = (-.)(pos1_2.Mctypes.x, pos2_2.Mctypes.x);
  o = if (<=.)(0.000000, a) then a else ~-.(a);
  equal_2 = (&)((<.)(o, 0.100000), (<.)(o_2, 0.100000));
  equal = (&)(equal_2, equal_3);
  newrdrmissiontrack =
    if l90
    then { ({ ({ ({rdrmissiontrack with .Mctypes.m_id =
              iffmissiontrack.Mctypes.m_id}) with .Mctypes.m_detectedbyiff =
             iffmissiontrack.Mctypes.m_detectedbyiff}) with .Mctypes.m_tracknumber =
            0}) with .Mctypes.m_targettype =
           iffmissiontrack.Mctypes.m_targettype}
    else rdrmissiontrack;
  l90 = equal;
  newiffmissiontrack =
    if l90 then Mctypes.kinitmissiontrack else iffmissiontrack
tel

node mc_tracks_fusion_onerdrwithifftracks(rdrtrack : Mctypes.tmissiontrack at r1;
                                           ifftracks : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray at r2)
returns (fusionnedrdrtrack : Mctypes.tmissiontrack at r1;
          fusionnedifftracks : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray at r2)
let
  (fusionnedifftracks, fusionnedrdrtrack) =
    mapfold<<Mctypes.ksizeifftracksarray>> fusionrdrifftracks
      <()>(ifftracks, rdrtrack)
tel

node mc_tracks_fusion(rdrtracks : Mctypes.trdrtracksarray;
                       ifftracks : Mctypes.tifftracksarray)
returns (missiontracks : Mctypes.tmissiontracksarray)
var mergedrdrtracks : Mctypes.tmissiontrack^Mctypes.ksizerdrtracksarray;
    mergedifftracks : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray;
    l140 : Mctypes.tmissiontrack^Mctypes.ksizerdrtracksarray at rdr;
    l139 : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray at iff;
let
  missiontracks = mergedrdrtracks @ mergedifftracks;
  (mergedrdrtracks, mergedifftracks) =
    mapfold<<Mctypes.ksizerdrtracksarray>> mc_tracks_fusion_onerdrwithifftracks
      <()>(l140, l139);
  init<<rdr>> l140 =
    map<<Mctypes.ksizerdrtracksarray>> convertrdrtracktomissiontrack
      <()>(rdrtracks);
  init<<iff>> l139 =
    map<<Mctypes.ksizeifftracksarray>> convertifftracktomissiontrack
      <()>(ifftracks)
tel

node prio_tracknumbernotinarray(missiontracktracknumber : int;
                                 prioritytrack : int; acc : bool)
returns (notinarray : bool)
let
  notinarray = (&)(acc, not((=)(missiontracktracknumber, prioritytrack)))
tel

node prio_selecthighestprioritynotinpriorityarray(missiontrack : Mctypes.tmissiontrack;
                                                   prioritiesarray : Mctypes.tpriorityList;
                                                   accprioritymissiontrack : Mctypes.tmissiontrack at r)
returns (prioritymissiontrack : Mctypes.tmissiontrack at r)
var a : Mctypes.tmissiontrack; b : Mctypes.tmissiontrack; vr_2 : float;
    d_2 : float; l13_2 : float; l11_2 : bool; result_2 : float; vr : float;
    d : float; l13 : float; l11 : bool; result : float; prioritary : bool;
    missiontracknotinpriorittiesarray : bool;
    missiontrackhashigherprioritythanacc : bool;
let
  a = missiontrack;
  b = accprioritymissiontrack;
  vr_2 = b.Mctypes.m_sr;
  d_2 = b.Mctypes.m_d;
  result_2 = if l11_2 then l13_2 else 0.000000;
  l13_2 = if l11_2 then (/.)(vr_2, d_2) else 0.000000 -> pre l13_2;
  l11_2 = (>.)(d_2, 0.100000);
  vr = a.Mctypes.m_sr;
  d = a.Mctypes.m_d;
  result = if l11 then l13 else 0.000000;
  l13 = if l11 then (/.)(vr, d) else 0.000000 -> pre l13;
  l11 = (>.)(d, 0.100000);
  prioritary =
    (or)
    ((or)
     ((=)(a.Mctypes.m_targettype, Mctypes.Ttargettype_friend),
       not(a.Mctypes.m_detectedbyradar)),
      (&)
      ((&)(a.Mctypes.m_detectedbyradar, (<.)(result, result_2)),
        b.Mctypes.m_detectedbyradar))
      ;
  missiontrackhashigherprioritythanacc = not(prioritary);
  missiontracknotinpriorittiesarray =
    fold<<4>> prio_tracknumbernotinarray
      <()>(missiontrack.Mctypes.m_tracknumber^4, prioritiesarray, true);
  prioritymissiontrack =
    if (&)
       (missiontracknotinpriorittiesarray,
         missiontrackhashigherprioritythanacc)
    then missiontrack
    else accprioritymissiontrack
tel

node prio_selectprioritarymissiontracks(missiontracks : Mctypes.tmissiontracksarray;
                                         prioritiesarray : Mctypes.tpriorityList at prio;
                                         indexpriority : int)
returns (newprioritiesarray : Mctypes.tpriorityList at prio)
var initmtrack : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority : Mctypes.tmissiontrack at r;
let
  newprioritiesarray =
    [prioritiesarray with [indexpriority] =
      missiontrackwithhighestpriority.Mctypes.m_tracknumber];
  init<<r>> initmtrack = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks, prioritiesarray^Mctypes.ksizemissiontracksarray,
            initmtrack)
tel

node prio_setpriorityinmissiontrack(prioritytracknumber : int;
                                     priorityindex : int;
                                     missiontrack : Mctypes.tmissiontrack at r)
returns (missiontrackwithprio : Mctypes.tmissiontrack at r)
var priority : int;
    newmissiontrack : Mctypes.tmissiontrack at r;
    missiontrack_copy : Mctypes.tmissiontrack;
let
  missiontrack_copy = missiontrack;
  priority = (+)(priorityindex, 1);
  newmissiontrack =
    {missiontrack with .Mctypes.m_priority =
      if missiontrack.Mctypes.m_detectedbyradar then priority else 0};
  missiontrackwithprio =
    if (=)(prioritytracknumber, missiontrack.Mctypes.m_tracknumber)
    then newmissiontrack
    else missiontrack_copy
tel

node prio_setpriorityinmissiontrackarray(priorityarray : Mctypes.tpriorityList;
                                          missiontrack : Mctypes.tmissiontrack at r)
returns (missiontrackwithprio : Mctypes.tmissiontrack at r)
let
  missiontrackwithprio =
    foldi<<4>> prio_setpriorityinmissiontrack
      <()>(priorityarray, missiontrack)
tel

(*
node mc_tracks_prio(missiontracks : Mctypes.tmissiontracksarray at r)
returns (missiontrackswithprio : Mctypes.tmissiontracksarray at r)
var missiontracks_5 : Mctypes.tmissiontracksarray;
    prioritiesarray_4 : Mctypes.tpriorityList at prio; indexpriority_4 : int;
    initmtrack_4 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_4 : Mctypes.tmissiontrack at r;
    newprioritiesarray_4 : Mctypes.tpriorityList at prio;
    missiontracks_4 : Mctypes.tmissiontracksarray;
    prioritiesarray_3 : Mctypes.tpriorityList at prio; indexpriority_3 : int;
    initmtrack_3 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_3 : Mctypes.tmissiontrack at r;
    newprioritiesarray_3 : Mctypes.tpriorityList at prio;
    missiontracks_3 : Mctypes.tmissiontracksarray;
    prioritiesarray_2 : Mctypes.tpriorityList at prio; indexpriority_2 : int;
    initmtrack_2 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_2 : Mctypes.tmissiontrack at r;
    newprioritiesarray_2 : Mctypes.tpriorityList at prio;
    missiontracks_2 : Mctypes.tmissiontracksarray;
    prioritiesarray : Mctypes.tpriorityList at prio; indexpriority : int;
    initmtrack : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority : Mctypes.tmissiontrack at r;
    newprioritiesarray : Mctypes.tpriorityList at prio;
    initprio : Mctypes.tpriorityList at prio;
    prioritytracknumbers : Mctypes.tpriorityList at prio;
let
  missiontracks_5 = missiontracks;
  prioritiesarray_4 = newprioritiesarray_3;
  indexpriority_4 = 3;
  newprioritiesarray_4 =
    [prioritiesarray_4 with [indexpriority_4] =
      missiontrackwithhighestpriority_4.Mctypes.m_tracknumber];
  init<<r>> initmtrack_4 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_4 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_5,
            prioritiesarray_4^Mctypes.ksizemissiontracksarray, initmtrack_4);
  missiontracks_4 = missiontracks;
  prioritiesarray_3 = newprioritiesarray_2;
  indexpriority_3 = 2;
  newprioritiesarray_3 =
    [prioritiesarray_3 with [indexpriority_3] =
      missiontrackwithhighestpriority_3.Mctypes.m_tracknumber];
  init<<r>> initmtrack_3 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_3 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_4,
            prioritiesarray_3^Mctypes.ksizemissiontracksarray, initmtrack_3);
  missiontracks_3 = missiontracks;
  prioritiesarray_2 = newprioritiesarray;
  indexpriority_2 = 1;
  newprioritiesarray_2 =
    [prioritiesarray_2 with [indexpriority_2] =
      missiontrackwithhighestpriority_2.Mctypes.m_tracknumber];
  init<<r>> initmtrack_2 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_2 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_3,
            prioritiesarray_2^Mctypes.ksizemissiontracksarray, initmtrack_2);
  missiontracks_2 = missiontracks;
  prioritiesarray = initprio;
  indexpriority = 0;
  newprioritiesarray =
    [prioritiesarray with [indexpriority] =
      missiontrackwithhighestpriority.Mctypes.m_tracknumber];
  init<<r>> initmtrack = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_2, prioritiesarray^Mctypes.ksizemissiontracksarray,
            initmtrack);
  missiontrackswithprio =
    map<<Mctypes.ksizemissiontracksarray>> prio_setpriorityinmissiontrackarray
      <(prioritytracknumbers)>(missiontracks);
  init<<prio>> initprio = 0^4;
  prioritytracknumbers = newprioritiesarray_4
tel
*)

node mc_tracks_tracknumber(withouttracknb : Mctypes.tmissiontracksarray at r)
returns (withtracknumber : Mctypes.tmissiontracksarray at r)
var l81 : int;
let
  (withtracknumber, l81) =
    mapfold<<Mctypes.ksizemissiontracksarray>> calculatemissiontracknumber
      <(Mctypes.kinitmissiontrackarray -> pre withtracknumber)>(withouttracknb,
                                                                 0 -> pre l81)
tel

(*
node mc_tracks(rdrtracks : Mctypes.trdrtracksarray;
                ifftracks : Mctypes.tifftracksarray)
returns (missiontracks : Mctypes.tmissiontracksarray)
var missiontracks_6 : Mctypes.tmissiontracksarray at r;
    missiontracks_5 : Mctypes.tmissiontracksarray;
    prioritiesarray_4 : Mctypes.tpriorityList at prio; indexpriority_4 : int;
    initmtrack_4 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_4 : Mctypes.tmissiontrack at r;
    newprioritiesarray_4 : Mctypes.tpriorityList at prio;
    missiontracks_4 : Mctypes.tmissiontracksarray;
    prioritiesarray_3 : Mctypes.tpriorityList at prio; indexpriority_3 : int;
    initmtrack_3 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_3 : Mctypes.tmissiontrack at r;
    newprioritiesarray_3 : Mctypes.tpriorityList at prio;
    missiontracks_3 : Mctypes.tmissiontracksarray;
    prioritiesarray_2 : Mctypes.tpriorityList at prio; indexpriority_2 : int;
    initmtrack_2 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_2 : Mctypes.tmissiontrack at r;
    newprioritiesarray_2 : Mctypes.tpriorityList at prio;
    missiontracks_2_2 : Mctypes.tmissiontracksarray;
    prioritiesarray : Mctypes.tpriorityList at prio; indexpriority : int;
    initmtrack : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority : Mctypes.tmissiontrack at r;
    newprioritiesarray : Mctypes.tpriorityList at prio;
    initprio : Mctypes.tpriorityList at prio;
    prioritytracknumbers : Mctypes.tpriorityList at prio;
    missiontrackswithprio : Mctypes.tmissiontracksarray at r;
    withouttracknb : Mctypes.tmissiontracksarray at r; l81 : int;
    withtracknumber : Mctypes.tmissiontracksarray at r;
    rdrtracks_2 : Mctypes.trdrtracksarray;
    ifftracks_2 : Mctypes.tifftracksarray;
    mergedrdrtracks : Mctypes.tmissiontrack^Mctypes.ksizerdrtracksarray;
    mergedifftracks : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray;
    l140 : Mctypes.tmissiontrack^Mctypes.ksizerdrtracksarray at rdr;
    l139 : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray at iff;
    missiontracks_2 : Mctypes.tmissiontracksarray;
    fused_tracks : Mctypes.tmissiontracksarray at r;
let
  missiontracks_6 = withtracknumber;
  missiontracks_5 = missiontracks_6;
  prioritiesarray_4 = newprioritiesarray_3;
  indexpriority_4 = 3;
  newprioritiesarray_4 =
    [prioritiesarray_4 with [indexpriority_4] =
      missiontrackwithhighestpriority_4.Mctypes.m_tracknumber];
  init<<r>> initmtrack_4 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_4 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_5,
            prioritiesarray_4^Mctypes.ksizemissiontracksarray, initmtrack_4);
  missiontracks_4 = missiontracks_6;
  prioritiesarray_3 = newprioritiesarray_2;
  indexpriority_3 = 2;
  newprioritiesarray_3 =
    [prioritiesarray_3 with [indexpriority_3] =
      missiontrackwithhighestpriority_3.Mctypes.m_tracknumber];
  init<<r>> initmtrack_3 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_3 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_4,
            prioritiesarray_3^Mctypes.ksizemissiontracksarray, initmtrack_3);
  missiontracks_3 = missiontracks_6;
  prioritiesarray_2 = newprioritiesarray;
  indexpriority_2 = 1;
  newprioritiesarray_2 =
    [prioritiesarray_2 with [indexpriority_2] =
      missiontrackwithhighestpriority_2.Mctypes.m_tracknumber];
  init<<r>> initmtrack_2 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_2 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_3,
            prioritiesarray_2^Mctypes.ksizemissiontracksarray, initmtrack_2);
  missiontracks_2_2 = missiontracks_6;
  prioritiesarray = initprio;
  indexpriority = 0;
  newprioritiesarray =
    [prioritiesarray with [indexpriority] =
      missiontrackwithhighestpriority.Mctypes.m_tracknumber];
  init<<r>> initmtrack = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_2_2,
            prioritiesarray^Mctypes.ksizemissiontracksarray, initmtrack);
  missiontrackswithprio =
    map<<Mctypes.ksizemissiontracksarray>> prio_setpriorityinmissiontrackarray
      <(prioritytracknumbers)>(missiontracks_6);
  init<<prio>> initprio = 0^4;
  prioritytracknumbers = newprioritiesarray_4;
  withouttracknb = fused_tracks;
  (withtracknumber, l81) =
    mapfold<<Mctypes.ksizemissiontracksarray>> calculatemissiontracknumber
      <(Mctypes.kinitmissiontrackarray -> pre withtracknumber)>(withouttracknb,
                                                                 0 -> pre l81);
  rdrtracks_2 = rdrtracks;
  ifftracks_2 = ifftracks;
  missiontracks_2 = mergedrdrtracks @ mergedifftracks;
  (mergedrdrtracks, mergedifftracks) =
    mapfold<<Mctypes.ksizerdrtracksarray>> mc_tracks_fusion_onerdrwithifftracks
      <()>(l140, l139);
  init<<rdr>> l140 =
    map<<Mctypes.ksizerdrtracksarray>> convertrdrtracktomissiontrack
      <()>(rdrtracks_2);
  init<<iff>> l139 =
    map<<Mctypes.ksizeifftracksarray>> convertifftracktomissiontrack
      <()>(ifftracks_2);
  init<<r>> fused_tracks = missiontracks_2;
  missiontracks = missiontrackswithprio
tel
*)

(*
node mc(currentrdrstate : Mctypes.tsensorstate;
         currentrdrmode : Mctypes.trdrmode;
         rdrtracks : Mctypes.trdrtracksarray; rdronoffbutton : bool;
         rdrmodebutton : bool; iffonoffbutton : bool;
         currentiffstate : Mctypes.tsensorstate;
         ifftracks : Mctypes.tifftracksarray)
returns (rdronoffcmd : bool; rdrmodecmd : bool;
          missiontracks : Mctypes.tmissiontracksarray; iffonoffcmd : bool)
var rdronoffbutton_2 : bool; currentrdrstate_3 : Mctypes.tsensorstate;
    onoffbuttonpressed_2 : bool; currentstate_3 : Mctypes.tsensorstate;
    onoffcmd_2 : bool; re_Input_3 : bool; re_Output_3 : bool;
    rdronoffcmd_2 : bool; currentrdrstate_2 : Mctypes.tsensorstate;
    rdrmodebutton_2 : bool; currentrdrmode_2 : Mctypes.trdrmode;
    currentstate_2 : Mctypes.tsensorstate; modebuttonpressed : bool;
    currentmode : Mctypes.trdrmode; modecmd : bool; re_Input_2 : bool;
    re_Output_2 : bool; rdrmodecmd_2 : bool; iffonoffbutton_2 : bool;
    currentiffstate_2 : Mctypes.tsensorstate; onoffbuttonpressed : bool;
    currentstate : Mctypes.tsensorstate; onoffcmd : bool; re_Input : bool;
    re_Output : bool; iffonoffcmd_2 : bool;
    rdrtracks_3 : Mctypes.trdrtracksarray;
    ifftracks_3 : Mctypes.tifftracksarray;
    missiontracks_6 : Mctypes.tmissiontracksarray at r;
    missiontracks_5 : Mctypes.tmissiontracksarray;
    prioritiesarray_4 : Mctypes.tpriorityList at prio; indexpriority_4 : int;
    initmtrack_4 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_4 : Mctypes.tmissiontrack at r;
    newprioritiesarray_4 : Mctypes.tpriorityList at prio;
    missiontracks_4 : Mctypes.tmissiontracksarray;
    prioritiesarray_3 : Mctypes.tpriorityList at prio; indexpriority_3 : int;
    initmtrack_3 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_3 : Mctypes.tmissiontrack at r;
    newprioritiesarray_3 : Mctypes.tpriorityList at prio;
    missiontracks_3 : Mctypes.tmissiontracksarray;
    prioritiesarray_2 : Mctypes.tpriorityList at prio; indexpriority_2 : int;
    initmtrack_2 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_2 : Mctypes.tmissiontrack at r;
    newprioritiesarray_2 : Mctypes.tpriorityList at prio;
    missiontracks_2_2 : Mctypes.tmissiontracksarray;
    prioritiesarray : Mctypes.tpriorityList at prio; indexpriority : int;
    initmtrack : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority : Mctypes.tmissiontrack at r;
    newprioritiesarray : Mctypes.tpriorityList at prio;
    initprio : Mctypes.tpriorityList at prio;
    prioritytracknumbers : Mctypes.tpriorityList at prio;
    missiontrackswithprio : Mctypes.tmissiontracksarray at r;
    withouttracknb : Mctypes.tmissiontracksarray at r; l81 : int;
    withtracknumber : Mctypes.tmissiontracksarray at r;
    rdrtracks_2 : Mctypes.trdrtracksarray;
    ifftracks_2 : Mctypes.tifftracksarray;
    mergedrdrtracks : Mctypes.tmissiontrack^Mctypes.ksizerdrtracksarray;
    mergedifftracks : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray;
    l140 : Mctypes.tmissiontrack^Mctypes.ksizerdrtracksarray at rdr;
    l139 : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray at iff;
    missiontracks_2 : Mctypes.tmissiontracksarray;
    fused_tracks : Mctypes.tmissiontracksarray at r;
    missiontracks_7 : Mctypes.tmissiontracksarray;
let
  rdronoffbutton_2 = rdronoffbutton;
  currentrdrstate_3 = currentrdrstate;
  onoffbuttonpressed_2 = re_Output_3;
  currentstate_3 = currentrdrstate_3;
  automaton
    state Off
       do
      onoffcmd_2 = false
      unless
      | (&)(onoffbuttonpressed_2, (=)(currentstate_3, Mctypes.TState_OFF)) then On
    state On
       do
      onoffcmd_2 = true
      unless
      | (&)(onoffbuttonpressed_2, (=)(currentstate_3, Mctypes.TState_ON)) then Off
  end;
  re_Input_3 = rdronoffbutton_2;
  re_Output_3 = (&)(not(re_Input_3 -> pre re_Input_3), re_Input_3);
  rdronoffcmd_2 = onoffcmd_2;
  currentrdrstate_2 = currentrdrstate;
  rdrmodebutton_2 = rdrmodebutton;
  currentrdrmode_2 = currentrdrmode;
  currentstate_2 = currentrdrstate_2;
  modebuttonpressed = re_Output_2;
  currentmode = currentrdrmode_2;
  automaton
    state Wide
       do
      modecmd = false
      unless
      | (&)
        (modebuttonpressed,
          (&)
          ((=)(currentstate_2, Mctypes.TState_ON),
            (=)(currentmode, Mctypes.TRdrMode_WIDE)))
           then Narrow
    state Narrow
       do
      modecmd = true
      unless
      | (&)
        (modebuttonpressed,
          (&)
          ((=)(currentstate_2, Mctypes.TState_ON),
            (=)(currentmode, Mctypes.TRdrMode_NARROW)))
           then Wide
  end;
  re_Input_2 = rdrmodebutton_2;
  re_Output_2 = (&)(not(re_Input_2 -> pre re_Input_2), re_Input_2);
  rdrmodecmd_2 = modecmd;
  iffonoffbutton_2 = iffonoffbutton;
  currentiffstate_2 = currentiffstate;
  onoffbuttonpressed = re_Output;
  currentstate = currentiffstate_2;
  automaton
    state Off
       do
      onoffcmd = false
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_OFF)) then On
    state On
       do
      onoffcmd = true
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_ON)) then Off
  end;
  re_Input = iffonoffbutton_2;
  re_Output = (&)(not(re_Input -> pre re_Input), re_Input);
  iffonoffcmd_2 = onoffcmd;
  rdrtracks_3 = rdrtracks;
  ifftracks_3 = ifftracks;
  missiontracks_6 = withtracknumber;
  missiontracks_5 = missiontracks_6;
  prioritiesarray_4 = newprioritiesarray_3;
  indexpriority_4 = 3;
  newprioritiesarray_4 =
    [prioritiesarray_4 with [indexpriority_4] =
      missiontrackwithhighestpriority_4.Mctypes.m_tracknumber];
  init<<r>> initmtrack_4 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_4 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_5,
            prioritiesarray_4^Mctypes.ksizemissiontracksarray, initmtrack_4);
  missiontracks_4 = missiontracks_6;
  prioritiesarray_3 = newprioritiesarray_2;
  indexpriority_3 = 2;
  newprioritiesarray_3 =
    [prioritiesarray_3 with [indexpriority_3] =
      missiontrackwithhighestpriority_3.Mctypes.m_tracknumber];
  init<<r>> initmtrack_3 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_3 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_4,
            prioritiesarray_3^Mctypes.ksizemissiontracksarray, initmtrack_3);
  missiontracks_3 = missiontracks_6;
  prioritiesarray_2 = newprioritiesarray;
  indexpriority_2 = 1;
  newprioritiesarray_2 =
    [prioritiesarray_2 with [indexpriority_2] =
      missiontrackwithhighestpriority_2.Mctypes.m_tracknumber];
  init<<r>> initmtrack_2 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_2 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_3,
            prioritiesarray_2^Mctypes.ksizemissiontracksarray, initmtrack_2);
  missiontracks_2_2 = missiontracks_6;
  prioritiesarray = initprio;
  indexpriority = 0;
  newprioritiesarray =
    [prioritiesarray with [indexpriority] =
      missiontrackwithhighestpriority.Mctypes.m_tracknumber];
  init<<r>> initmtrack = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_2_2,
            prioritiesarray^Mctypes.ksizemissiontracksarray, initmtrack);
  missiontrackswithprio =
    map<<Mctypes.ksizemissiontracksarray>> prio_setpriorityinmissiontrackarray
      <(prioritytracknumbers)>(missiontracks_6);
  init<<prio>> initprio = 0^4;
  prioritytracknumbers = newprioritiesarray_4;
  withouttracknb = fused_tracks;
  (withtracknumber, l81) =
    mapfold<<Mctypes.ksizemissiontracksarray>> calculatemissiontracknumber
      <(Mctypes.kinitmissiontrackarray -> pre withtracknumber)>(withouttracknb,
                                                                 0 -> pre l81);
  rdrtracks_2 = rdrtracks_3;
  ifftracks_2 = ifftracks_3;
  missiontracks_2 = mergedrdrtracks @ mergedifftracks;
  (mergedrdrtracks, mergedifftracks) =
    mapfold<<Mctypes.ksizerdrtracksarray>> mc_tracks_fusion_onerdrwithifftracks
      <()>(l140, l139);
  init<<rdr>> l140 =
    map<<Mctypes.ksizerdrtracksarray>> convertrdrtracktomissiontrack
      <()>(rdrtracks_2);
  init<<iff>> l139 =
    map<<Mctypes.ksizeifftracksarray>> convertifftracktomissiontrack
      <()>(ifftracks_2);
  init<<r>> fused_tracks = missiontracks_2;
  missiontracks_7 = missiontrackswithprio;
  missiontracks = missiontracks_7;
  iffonoffcmd = iffonoffcmd_2;
  rdrmodecmd = rdrmodecmd_2;
  rdronoffcmd = rdronoffcmd_2
tel
*)

node implies(a : bool; b : bool) returns (c : bool)
let
  c = (or)(not(a), b)
tel

node dv_detectedbyiff(missiontrack : Mctypes.tmissiontrack; accin : bool)
returns (accout : bool)
let
  accout = (&)(accin, not(not((=)(missiontrack.Mctypes.m_tracknumber, 0))))
tel

node dv_sametracknumber(missiontrack1 : Mctypes.tmissiontrack;
                         missiontrack2 : Mctypes.tmissiontrack; accin : bool)
returns (accout : bool)
let
  accout =
    (or)
    (accin,
      (&)
      ((=)
       (missiontrack1.Mctypes.m_tracknumber,
         missiontrack2.Mctypes.m_tracknumber),
        not((=)(missiontrack2.Mctypes.m_tracknumber, 0))))

tel

node dv_tracknumberexist(missiontrack : Mctypes.tmissiontrack;
                          missiontracks : Mctypes.tmissiontracksarray;
                          accin : bool)
returns (accout : bool)
var l36 : bool;
let
  l36 =
    fold<<Mctypes.ksizemissiontracksarray>> dv_sametracknumber
      <()>(missiontrack^Mctypes.ksizemissiontracksarray, missiontracks,
            false);
  accout = (or)(accin, l36)
tel

node dv_proof1(currentrdrstate : Mctypes.tsensorstate; rdronoffbutton : bool;
                rdronoffcmd : bool)
returns (proof1 : bool)
var a : bool; b : bool; c : bool; re_Input : bool; re_Output : bool;
let
  a = (&)(re_Output, (=)(currentrdrstate, Mctypes.TState_FAIL));
  b = (=)(rdronoffcmd, false -> pre rdronoffcmd);
  c = (or)(not(a), b);
  re_Input = rdronoffbutton;
  re_Output = (&)(not(re_Input -> pre re_Input), re_Input);
  proof1 = c
tel

node dv_proof2(ifftracks : Mctypes.tifftracksarray;
                missiontracks : Mctypes.tmissiontracksarray)
returns (proof2 : bool)
var a : bool; b : bool; c : bool; l33 : bool;
let
  a = (=)(ifftracks, Mctypes.kinitifftrackarray);
  b = l33;
  c = (or)(not(a), b);
  l33 =
    fold<<Mctypes.ksizemissiontracksarray>> dv_detectedbyiff
      <()>(missiontracks, true);
  proof2 = c
tel

node dv_proof3(missiontracks : Mctypes.tmissiontracksarray)
returns (proof3 : bool)
var l33 : bool;
let
  l33 =
    fold<<Mctypes.ksizemissiontracksarray>> dv_tracknumberexist
      <()>(missiontracks, missiontracks^Mctypes.ksizemissiontracksarray,
            false);
  proof3 = not(l33)
tel

(*
node dv_observer(currentrdrstate : Mctypes.tsensorstate;
                  currentrdrmode : Mctypes.trdrmode;
                  rdrtracks : Mctypes.trdrtracksarray; rdronoffbutton : bool;
                  rdrmodebutton : bool; iffonoffbutton : bool;
                  currentiffstate : Mctypes.tsensorstate;
                  ifftracks : Mctypes.tifftracksarray)
returns (proof1 : bool; proof2 : bool; proof3 : bool)
var currentrdrstate_4 : Mctypes.tsensorstate;
    currentrdrmode_3 : Mctypes.trdrmode;
    rdrtracks_4 : Mctypes.trdrtracksarray; rdronoffbutton_3 : bool;
    rdrmodebutton_3 : bool; iffonoffbutton_3 : bool;
    currentiffstate_3 : Mctypes.tsensorstate;
    ifftracks_4 : Mctypes.tifftracksarray; rdronoffbutton_2_2 : bool;
    currentrdrstate_3 : Mctypes.tsensorstate; onoffbuttonpressed_2 : bool;
    currentstate_3 : Mctypes.tsensorstate; onoffcmd_2 : bool;
    re_Input_3 : bool; re_Output_3 : bool; rdronoffcmd_2 : bool;
    currentrdrstate_2_2 : Mctypes.tsensorstate; rdrmodebutton_2 : bool;
    currentrdrmode_2 : Mctypes.trdrmode;
    currentstate_2 : Mctypes.tsensorstate; modebuttonpressed : bool;
    currentmode : Mctypes.trdrmode; modecmd : bool; re_Input_2 : bool;
    re_Output_2 : bool; rdrmodecmd_2 : bool; iffonoffbutton_2 : bool;
    currentiffstate_2 : Mctypes.tsensorstate; onoffbuttonpressed : bool;
    currentstate : Mctypes.tsensorstate; onoffcmd : bool; re_Input_4 : bool;
    re_Output_4 : bool; iffonoffcmd_2 : bool;
    rdrtracks_3 : Mctypes.trdrtracksarray;
    ifftracks_3 : Mctypes.tifftracksarray;
    missiontracks_6 : Mctypes.tmissiontracksarray at r;
    missiontracks_5 : Mctypes.tmissiontracksarray;
    prioritiesarray_4 : Mctypes.tpriorityList at prio; indexpriority_4 : int;
    initmtrack_4 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_4 : Mctypes.tmissiontrack at r;
    newprioritiesarray_4 : Mctypes.tpriorityList at prio;
    missiontracks_4 : Mctypes.tmissiontracksarray;
    prioritiesarray_3 : Mctypes.tpriorityList at prio; indexpriority_3 : int;
    initmtrack_3 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_3 : Mctypes.tmissiontrack at r;
    newprioritiesarray_3 : Mctypes.tpriorityList at prio;
    missiontracks_3 : Mctypes.tmissiontracksarray;
    prioritiesarray_2 : Mctypes.tpriorityList at prio; indexpriority_2 : int;
    initmtrack_2 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_2 : Mctypes.tmissiontrack at r;
    newprioritiesarray_2 : Mctypes.tpriorityList at prio;
    missiontracks_2_2 : Mctypes.tmissiontracksarray;
    prioritiesarray : Mctypes.tpriorityList at prio; indexpriority : int;
    initmtrack : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority : Mctypes.tmissiontrack at r;
    newprioritiesarray : Mctypes.tpriorityList at prio;
    initprio : Mctypes.tpriorityList at prio;
    prioritytracknumbers : Mctypes.tpriorityList at prio;
    missiontrackswithprio : Mctypes.tmissiontracksarray at r;
    withouttracknb : Mctypes.tmissiontracksarray at r; l81 : int;
    withtracknumber : Mctypes.tmissiontracksarray at r;
    rdrtracks_2 : Mctypes.trdrtracksarray;
    ifftracks_2_2 : Mctypes.tifftracksarray;
    mergedrdrtracks : Mctypes.tmissiontrack^Mctypes.ksizerdrtracksarray;
    mergedifftracks : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray;
    l140 : Mctypes.tmissiontrack^Mctypes.ksizerdrtracksarray at rdr;
    l139 : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray at iff;
    missiontracks_2_3 : Mctypes.tmissiontracksarray;
    fused_tracks : Mctypes.tmissiontracksarray at r;
    missiontracks_7 : Mctypes.tmissiontracksarray; rdronoffcmd_3 : bool;
    rdrmodecmd : bool; missiontracks_8 : Mctypes.tmissiontracksarray;
    iffonoffcmd : bool; currentrdrstate_2 : Mctypes.tsensorstate;
    rdronoffbutton_2 : bool; rdronoffcmd : bool; a_2 : bool; b_2 : bool;
    c_2 : bool; re_Input : bool; re_Output : bool; proof1_2 : bool;
    ifftracks_2 : Mctypes.tifftracksarray;
    missiontracks_2 : Mctypes.tmissiontracksarray; a : bool; b : bool;
    c : bool; l33_2 : bool; proof2_2 : bool;
    missiontracks : Mctypes.tmissiontracksarray; l33 : bool; proof3_2 : bool;
    l3 : Mctypes.tmissiontracksarray; l1 : bool; l4 : bool; l5 : bool;
let
  currentrdrstate_4 = currentrdrstate;
  currentrdrmode_3 = currentrdrmode;
  rdrtracks_4 = rdrtracks;
  rdronoffbutton_3 = rdronoffbutton;
  rdrmodebutton_3 = rdrmodebutton;
  iffonoffbutton_3 = iffonoffbutton;
  currentiffstate_3 = currentiffstate;
  ifftracks_4 = ifftracks;
  rdronoffbutton_2_2 = rdronoffbutton_3;
  currentrdrstate_3 = currentrdrstate_4;
  onoffbuttonpressed_2 = re_Output_3;
  currentstate_3 = currentrdrstate_3;
  automaton
    state Off
       do
      onoffcmd_2 = false
      unless
      | (&)(onoffbuttonpressed_2, (=)(currentstate_3, Mctypes.TState_OFF)) then On
    state On
       do
      onoffcmd_2 = true
      unless
      | (&)(onoffbuttonpressed_2, (=)(currentstate_3, Mctypes.TState_ON)) then Off
  end;
  re_Input_3 = rdronoffbutton_2_2;
  re_Output_3 = (&)(not(re_Input_3 -> pre re_Input_3), re_Input_3);
  rdronoffcmd_2 = onoffcmd_2;
  currentrdrstate_2_2 = currentrdrstate_4;
  rdrmodebutton_2 = rdrmodebutton_3;
  currentrdrmode_2 = currentrdrmode_3;
  currentstate_2 = currentrdrstate_2_2;
  modebuttonpressed = re_Output_2;
  currentmode = currentrdrmode_2;
  automaton
    state Wide
       do
      modecmd = false
      unless
      | (&)
        (modebuttonpressed,
          (&)
          ((=)(currentstate_2, Mctypes.TState_ON),
            (=)(currentmode, Mctypes.TRdrMode_WIDE)))
           then Narrow
    state Narrow
       do
      modecmd = true
      unless
      | (&)
        (modebuttonpressed,
          (&)
          ((=)(currentstate_2, Mctypes.TState_ON),
            (=)(currentmode, Mctypes.TRdrMode_NARROW)))
           then Wide
  end;
  re_Input_2 = rdrmodebutton_2;
  re_Output_2 = (&)(not(re_Input_2 -> pre re_Input_2), re_Input_2);
  rdrmodecmd_2 = modecmd;
  iffonoffbutton_2 = iffonoffbutton_3;
  currentiffstate_2 = currentiffstate_3;
  onoffbuttonpressed = re_Output_4;
  currentstate = currentiffstate_2;
  automaton
    state Off
       do
      onoffcmd = false
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_OFF)) then On
    state On
       do
      onoffcmd = true
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_ON)) then Off
  end;
  re_Input_4 = iffonoffbutton_2;
  re_Output_4 = (&)(not(re_Input_4 -> pre re_Input_4), re_Input_4);
  iffonoffcmd_2 = onoffcmd;
  rdrtracks_3 = rdrtracks_4;
  ifftracks_3 = ifftracks_4;
  missiontracks_6 = withtracknumber;
  missiontracks_5 = missiontracks_6;
  prioritiesarray_4 = newprioritiesarray_3;
  indexpriority_4 = 3;
  newprioritiesarray_4 =
    [prioritiesarray_4 with [indexpriority_4] =
      missiontrackwithhighestpriority_4.Mctypes.m_tracknumber];
  init<<r>> initmtrack_4 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_4 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_5,
            prioritiesarray_4^Mctypes.ksizemissiontracksarray, initmtrack_4);
  missiontracks_4 = missiontracks_6;
  prioritiesarray_3 = newprioritiesarray_2;
  indexpriority_3 = 2;
  newprioritiesarray_3 =
    [prioritiesarray_3 with [indexpriority_3] =
      missiontrackwithhighestpriority_3.Mctypes.m_tracknumber];
  init<<r>> initmtrack_3 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_3 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_4,
            prioritiesarray_3^Mctypes.ksizemissiontracksarray, initmtrack_3);
  missiontracks_3 = missiontracks_6;
  prioritiesarray_2 = newprioritiesarray;
  indexpriority_2 = 1;
  newprioritiesarray_2 =
    [prioritiesarray_2 with [indexpriority_2] =
      missiontrackwithhighestpriority_2.Mctypes.m_tracknumber];
  init<<r>> initmtrack_2 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_2 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_3,
            prioritiesarray_2^Mctypes.ksizemissiontracksarray, initmtrack_2);
  missiontracks_2_2 = missiontracks_6;
  prioritiesarray = initprio;
  indexpriority = 0;
  newprioritiesarray =
    [prioritiesarray with [indexpriority] =
      missiontrackwithhighestpriority.Mctypes.m_tracknumber];
  init<<r>> initmtrack = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_2_2,
            prioritiesarray^Mctypes.ksizemissiontracksarray, initmtrack);
  missiontrackswithprio =
    map<<Mctypes.ksizemissiontracksarray>> prio_setpriorityinmissiontrackarray
      <(prioritytracknumbers)>(missiontracks_6);
  init<<prio>> initprio = 0^4;
  prioritytracknumbers = newprioritiesarray_4;
  withouttracknb = fused_tracks;
  (withtracknumber, l81) =
    mapfold<<Mctypes.ksizemissiontracksarray>> calculatemissiontracknumber
      <(Mctypes.kinitmissiontrackarray -> pre withtracknumber)>(withouttracknb,
                                                                 0 -> pre l81);
  rdrtracks_2 = rdrtracks_3;
  ifftracks_2_2 = ifftracks_3;
  missiontracks_2_3 = mergedrdrtracks @ mergedifftracks;
  (mergedrdrtracks, mergedifftracks) =
    mapfold<<Mctypes.ksizerdrtracksarray>> mc_tracks_fusion_onerdrwithifftracks
      <()>(l140, l139);
  init<<rdr>> l140 =
    map<<Mctypes.ksizerdrtracksarray>> convertrdrtracktomissiontrack
      <()>(rdrtracks_2);
  init<<iff>> l139 =
    map<<Mctypes.ksizeifftracksarray>> convertifftracktomissiontrack
      <()>(ifftracks_2_2);
  init<<r>> fused_tracks = missiontracks_2_3;
  missiontracks_7 = missiontrackswithprio;
  missiontracks_8 = missiontracks_7;
  iffonoffcmd = iffonoffcmd_2;
  rdrmodecmd = rdrmodecmd_2;
  rdronoffcmd_3 = rdronoffcmd_2;
  currentrdrstate_2 = currentrdrstate;
  rdronoffbutton_2 = rdronoffbutton;
  rdronoffcmd = l1;
  a_2 = (&)(re_Output, (=)(currentrdrstate_2, Mctypes.TState_FAIL));
  b_2 = (=)(rdronoffcmd, false -> pre rdronoffcmd);
  c_2 = (or)(not(a_2), b_2);
  re_Input = rdronoffbutton_2;
  re_Output = (&)(not(re_Input -> pre re_Input), re_Input);
  proof1_2 = c_2;
  ifftracks_2 = ifftracks;
  missiontracks_2 = l3;
  a = (=)(ifftracks_2, Mctypes.kinitifftrackarray);
  b = l33_2;
  c = (or)(not(a), b);
  l33_2 =
    fold<<Mctypes.ksizemissiontracksarray>> dv_detectedbyiff
      <()>(missiontracks_2, true);
  proof2_2 = c;
  missiontracks = l3;
  l33 =
    fold<<Mctypes.ksizemissiontracksarray>> dv_tracknumberexist
      <()>(missiontracks, missiontracks^Mctypes.ksizemissiontracksarray,
            false);
  proof3_2 = not(l33);
  proof3 = proof3_2;
  proof2 = proof2_2;
  proof1 = proof1_2;
  (l1, l4, l3, l5) =
    (rdronoffcmd_3, rdrmodecmd, missiontracks_8, iffonoffcmd)
tel
*)

node fighterdebug(res : bool; rdronoffclicked : bool; iffonoffclicked : bool)
returns (missiontracks : Mctypes.tmissiontracksarray)
var onoffcmd_4 : bool; modecmd_3 : bool; failure_3 : bool;
    rdrdetectedtracks : Mctypes.tdetectedrdrtracksarray;
    tracks_4 : Mctypes.ttracksarray; onoffcmd_2_3 : bool; failure_2_2 : bool;
    x_2 : bool; initializing_2_2 : bool; st_3_2 : Mctypes.tsensorstate;
    modecmd_2 : bool; mode_2 : Mctypes.trdrmode;
    st_2_2 : Mctypes.tsensorstate; tracks_2_2 : Mctypes.ttracksarray;
    rdrdetectedtracks_2 : Mctypes.tdetectedrdrtracksarray;
    l22 : Mctypes.ttrack^Mctypes.ksizerdrtracksarray;
    l30 : Mctypes.trdrtrack^Mctypes.ksizerdrtracksarray;
    rdrtracks_2_2 : Mctypes.trdrtracksarray; initializing_3 : bool;
    st_4 : Mctypes.tsensorstate; mode : Mctypes.trdrmode;
    rdrtracks_4 : Mctypes.trdrtracksarray; tracks_3 : Mctypes.ttracksarray;
    failure : bool; iffdetectedtracks : Mctypes.tdetectedifftracksarray;
    onoffcmd_3 : bool; onoffcmd_2_2 : bool; failure_2 : bool; x : bool;
    initializing_2 : bool; st_3 : Mctypes.tsensorstate;
    st_2 : Mctypes.tsensorstate; tracks_2 : Mctypes.ttracksarray;
    iffdetectedtracks_2 : Mctypes.tdetectedifftracksarray;
    l34 : Mctypes.ttrack^Mctypes.ksizeifftracksarray;
    l40 : Mctypes.tifftracksarray; ifftracks_2_2 : Mctypes.tifftracksarray;
    st : Mctypes.tsensorstate; ifftracks_4 : Mctypes.tifftracksarray;
    initializing : bool; currentrdrstate : Mctypes.tsensorstate;
    currentrdrmode : Mctypes.trdrmode; rdrtracks : Mctypes.trdrtracksarray;
    rdronoffbutton : bool; rdrmodebutton : bool; iffonoffbutton : bool;
    currentiffstate : Mctypes.tsensorstate;
    ifftracks : Mctypes.tifftracksarray; rdronoffbutton_2 : bool;
    currentrdrstate_3 : Mctypes.tsensorstate; onoffbuttonpressed_2 : bool;
    currentstate_3 : Mctypes.tsensorstate; onoffcmd_2 : bool;
    re_Input_3 : bool; re_Output_3 : bool; rdronoffcmd_2 : bool;
    currentrdrstate_2 : Mctypes.tsensorstate; rdrmodebutton_2 : bool;
    currentrdrmode_2 : Mctypes.trdrmode;
    currentstate_2 : Mctypes.tsensorstate; modebuttonpressed : bool;
    currentmode : Mctypes.trdrmode; modecmd : bool; re_Input_2 : bool;
    re_Output_2 : bool; rdrmodecmd_2 : bool; iffonoffbutton_2 : bool;
    currentiffstate_2 : Mctypes.tsensorstate; onoffbuttonpressed : bool;
    currentstate : Mctypes.tsensorstate; onoffcmd : bool; re_Input : bool;
    re_Output : bool; iffonoffcmd_2 : bool;
    rdrtracks_3 : Mctypes.trdrtracksarray;
    ifftracks_3 : Mctypes.tifftracksarray;
    missiontracks_6 : Mctypes.tmissiontracksarray at r;
    missiontracks_5 : Mctypes.tmissiontracksarray;
    prioritiesarray_4 : Mctypes.tpriorityList at prio; indexpriority_4 : int;
    initmtrack_4 : Mctypes.tmissiontrack at mt4;
    missiontrackwithhighestpriority_4 : Mctypes.tmissiontrack at mt4;
    newprioritiesarray_4 : Mctypes.tpriorityList at prio;
    missiontracks_4 : Mctypes.tmissiontracksarray;
    prioritiesarray_3 : Mctypes.tpriorityList at prio; indexpriority_3 : int;
    initmtrack_3 : Mctypes.tmissiontrack at mt3;
    missiontrackwithhighestpriority_3 : Mctypes.tmissiontrack at mt3;
    newprioritiesarray_3 : Mctypes.tpriorityList at prio;
    missiontracks_3 : Mctypes.tmissiontracksarray;
    prioritiesarray_2 : Mctypes.tpriorityList at prio; indexpriority_2 : int;
    initmtrack_2 : Mctypes.tmissiontrack at mt2;
    missiontrackwithhighestpriority_2 : Mctypes.tmissiontrack at mt2;
    newprioritiesarray_2 : Mctypes.tpriorityList at prio;
    missiontracks_2_2 : Mctypes.tmissiontracksarray;
    prioritiesarray : Mctypes.tpriorityList at prio; indexpriority : int;
    initmtrack : Mctypes.tmissiontrack at mt;
    missiontrackwithhighestpriority : Mctypes.tmissiontrack at mt;
    newprioritiesarray : Mctypes.tpriorityList at prio;
    initprio : Mctypes.tpriorityList at prio;
    prioritytracknumbers : Mctypes.tpriorityList at prio;
    missiontrackswithprio : Mctypes.tmissiontracksarray at r;
    withouttracknb : Mctypes.tmissiontracksarray at r; l81 : int;
    withtracknumber : Mctypes.tmissiontracksarray at r;
    rdrtracks_2 : Mctypes.trdrtracksarray;
    ifftracks_2 : Mctypes.tifftracksarray;
    mergedrdrtracks : Mctypes.tmissiontrack^Mctypes.ksizerdrtracksarray;
    mergedifftracks : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray;
    l140 : Mctypes.tmissiontrack^Mctypes.ksizerdrtracksarray at rdr;
    l139 : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray at iff;
    missiontracks_2 : Mctypes.tmissiontracksarray;
    fused_tracks : Mctypes.tmissiontracksarray at r;
    missiontracks_7 : Mctypes.tmissiontracksarray; rdronoffcmd : bool;
    rdrmodecmd : bool; missiontracks_8 : Mctypes.tmissiontracksarray;
    iffonoffcmd : bool; l4 : Mctypes.trdrtracksarray; l3 : Mctypes.trdrmode;
    l6 : Mctypes.tifftracksarray; l5 : Mctypes.tsensorstate; l12 : bool;
    l11 : bool; l10 : bool; l172 : Mctypes.tsensorstate;
    l179 : Mctypes.ttracksarray; l200 : bool; l201 : bool;
let
  onoffcmd_4 = false -> pre l10;
  modecmd_3 = false -> pre l11;
  failure_3 = false;
  rdrdetectedtracks = [0, 1, 2, 3, 4];
  tracks_4 = l179;
  onoffcmd_2_3 = onoffcmd_4;
  failure_2_2 = failure_3;
  initializing_2_2 = (&)((=)(st_3_2, Mctypes.TState_OFF), onoffcmd_2_3);
  x_2 = false fby false fby false fby false fby false fby onoffcmd_2_3;
  st_3_2 =
    if failure_2_2
    then Mctypes.TState_FAIL
    else if if onoffcmd_2_3 then x_2 else false
         then Mctypes.TState_ON
         else Mctypes.TState_OFF
      ;
  modecmd_2 = modecmd_3;
  mode_2 =
    if modecmd_2 then Mctypes.TRdrMode_NARROW else Mctypes.TRdrMode_WIDE;
  st_2_2 = st_4;
  tracks_2_2 = tracks_4;
  rdrdetectedtracks_2 = rdrdetectedtracks;
  rdrtracks_2_2 =
    if (=)(st_2_2, Mctypes.TState_ON)
    then l30
    else Mctypes.kinitrdrtrackarray;
  l30 = map<<Mctypes.ksizerdrtracksarray>> elaboraterdrtrack<()>(l22);
  l22 =
    map<<Mctypes.ksizerdrtracksarray>> selectdetectedtrack
      <()>(rdrdetectedtracks_2, tracks_2_2^Mctypes.ksizerdrtracksarray,
            Mctypes.kinittrack^Mctypes.ksizerdrtracksarray);
  rdrtracks_4 = rdrtracks_2_2;
  mode = mode_2;
  (initializing_3, st_4) = (initializing_2_2, st_3_2);
  tracks_3 = l179;
  failure = false;
  iffdetectedtracks = [1, 2, 3];
  onoffcmd_3 = false -> pre l12;
  onoffcmd_2_2 = onoffcmd_3;
  failure_2 = failure;
  initializing_2 = (&)((=)(st_3, Mctypes.TState_OFF), onoffcmd_2_2);
  x = false fby false fby false fby false fby false fby onoffcmd_2_2;
  st_3 =
    if failure_2
    then Mctypes.TState_FAIL
    else if if onoffcmd_2_2 then x else false
         then Mctypes.TState_ON
         else Mctypes.TState_OFF
      ;
  st_2 = st;
  tracks_2 = tracks_3;
  iffdetectedtracks_2 = iffdetectedtracks;
  l34 =
    map<<Mctypes.ksizeifftracksarray>> selectdetectedtrack
      <()>(iffdetectedtracks_2, tracks_2^Mctypes.ksizeifftracksarray,
            Mctypes.kinittrack^Mctypes.ksizeifftracksarray);
  l40 = map<<Mctypes.ksizeifftracksarray>> ifftrack_of_track<()>(l34);
  ifftracks_2_2 =
    if (=)(st_2, Mctypes.TState_ON) then l40 else Mctypes.kinitifftrackarray;
  ifftracks_4 = ifftracks_2_2;
  (initializing, st) = (initializing_2, st_3);
  currentrdrstate = l172;
  currentrdrmode = l3;
  rdrtracks = l4;
  rdronoffbutton = rdronoffclicked;
  rdrmodebutton = false;
  iffonoffbutton = iffonoffclicked;
  currentiffstate = l5;
  ifftracks = l6;
  rdronoffbutton_2 = rdronoffbutton;
  currentrdrstate_3 = currentrdrstate;
  onoffbuttonpressed_2 = re_Output_3;
  currentstate_3 = currentrdrstate_3;
  automaton
    state Off
       do
      onoffcmd_2 = false
      unless
      | (&)(onoffbuttonpressed_2, (=)(currentstate_3, Mctypes.TState_OFF)) then On
    state On
       do
      onoffcmd_2 = true
      unless
      | (&)(onoffbuttonpressed_2, (=)(currentstate_3, Mctypes.TState_ON)) then Off
  end;
  re_Input_3 = rdronoffbutton_2;
  re_Output_3 = (&)(not(re_Input_3 -> pre re_Input_3), re_Input_3);
  rdronoffcmd_2 = onoffcmd_2;
  currentrdrstate_2 = currentrdrstate;
  rdrmodebutton_2 = rdrmodebutton;
  currentrdrmode_2 = currentrdrmode;
  currentstate_2 = currentrdrstate_2;
  modebuttonpressed = re_Output_2;
  currentmode = currentrdrmode_2;
  automaton
    state Wide
       do
      modecmd = false
      unless
      | (&)
        (modebuttonpressed,
          (&)
          ((=)(currentstate_2, Mctypes.TState_ON),
            (=)(currentmode, Mctypes.TRdrMode_WIDE)))
           then Narrow
    state Narrow
       do
      modecmd = true
      unless
      | (&)
        (modebuttonpressed,
          (&)
          ((=)(currentstate_2, Mctypes.TState_ON),
            (=)(currentmode, Mctypes.TRdrMode_NARROW)))
           then Wide
  end;
  re_Input_2 = rdrmodebutton_2;
  re_Output_2 = (&)(not(re_Input_2 -> pre re_Input_2), re_Input_2);
  rdrmodecmd_2 = modecmd;
  iffonoffbutton_2 = iffonoffbutton;
  currentiffstate_2 = currentiffstate;
  onoffbuttonpressed = re_Output;
  currentstate = currentiffstate_2;
  automaton
    state Off
       do
      onoffcmd = false
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_OFF)) then On
    state On
       do
      onoffcmd = true
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_ON)) then Off
  end;
  re_Input = iffonoffbutton_2;
  re_Output = (&)(not(re_Input -> pre re_Input), re_Input);
  iffonoffcmd_2 = onoffcmd;
  rdrtracks_3 = rdrtracks;
  ifftracks_3 = ifftracks;
  missiontracks_6 = withtracknumber;
  missiontracks_5 = missiontracks_6;
  prioritiesarray_4 = newprioritiesarray_3;
  indexpriority_4 = 3;
  newprioritiesarray_4 =
    [prioritiesarray_4 with [indexpriority_4] =
      missiontrackwithhighestpriority_4.Mctypes.m_tracknumber];
  init<<mt4>> initmtrack_4 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_4 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_5,
            prioritiesarray_4^Mctypes.ksizemissiontracksarray, initmtrack_4);
  missiontracks_4 = missiontracks_6;
  prioritiesarray_3 = newprioritiesarray_2;
  indexpriority_3 = 2;
  newprioritiesarray_3 =
    [prioritiesarray_3 with [indexpriority_3] =
      missiontrackwithhighestpriority_3.Mctypes.m_tracknumber];
  init<<mt3>> initmtrack_3 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_3 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_4,
            prioritiesarray_3^Mctypes.ksizemissiontracksarray, initmtrack_3);
  missiontracks_3 = missiontracks_6;
  prioritiesarray_2 = newprioritiesarray;
  indexpriority_2 = 1;
  newprioritiesarray_2 =
    [prioritiesarray_2 with [indexpriority_2] =
      missiontrackwithhighestpriority_2.Mctypes.m_tracknumber];
  init<<mt2>> initmtrack_2 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_2 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_3,
            prioritiesarray_2^Mctypes.ksizemissiontracksarray, initmtrack_2);
  missiontracks_2_2 = missiontracks_6;
  prioritiesarray = initprio;
  indexpriority = 0;
  newprioritiesarray =
    [prioritiesarray with [indexpriority] =
      missiontrackwithhighestpriority.Mctypes.m_tracknumber];
  init<<mt>> initmtrack = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_2_2,
            prioritiesarray^Mctypes.ksizemissiontracksarray, initmtrack);
  missiontrackswithprio =
    map<<Mctypes.ksizemissiontracksarray>> prio_setpriorityinmissiontrackarray
      <(prioritytracknumbers)>(missiontracks_6);
  init<<prio>> initprio = 0^4;
  prioritytracknumbers = newprioritiesarray_4;
  withouttracknb = fused_tracks;
  (withtracknumber, l81) =
    mapfold<<Mctypes.ksizemissiontracksarray>> calculatemissiontracknumber
      <(Mctypes.kinitmissiontrackarray -> pre withtracknumber)>(withouttracknb,
                                                                 0 -> pre l81);
  rdrtracks_2 = rdrtracks_3;
  ifftracks_2 = ifftracks_3;
  missiontracks_2 = mergedrdrtracks @ mergedifftracks;
  (mergedrdrtracks, mergedifftracks) =
    mapfold<<Mctypes.ksizerdrtracksarray>> mc_tracks_fusion_onerdrwithifftracks
      <()>(l140, l139);
  init<<rdr>> l140 =
    map<<Mctypes.ksizerdrtracksarray>> convertrdrtracktomissiontrack
      <()>(rdrtracks_2);
  init<<iff>> l139 =
    map<<Mctypes.ksizeifftracksarray>> convertifftracktomissiontrack
      <()>(ifftracks_2);
  init<<r>> fused_tracks = missiontracks_2;
  missiontracks_7 = missiontrackswithprio;
  missiontracks_8 = missiontracks_7;
  iffonoffcmd = iffonoffcmd_2;
  rdrmodecmd = rdrmodecmd_2;
  rdronoffcmd = rdronoffcmd_2;
  l179 = createalltracks(res);
  (l10, l11, missiontracks, l12) =
    (rdronoffcmd, rdrmodecmd, missiontracks_8, iffonoffcmd);
  (l5, l6, l200) = (st, ifftracks_4, initializing);
  (l201, l172, l3, l4) = (initializing_3, st_4, mode, rdrtracks_4)
tel

(*
node dv_fighterdebug(res : bool; rdronoffclicked : bool;
                      iffonoffclicked : bool)
returns (proof3 : bool)
var missiontracks_9 : Mctypes.tmissiontracksarray; l33 : bool;
    proof3_2 : bool; res_2 : bool; rdronoffclicked_2 : bool;
    iffonoffclicked_2 : bool; onoffcmd_4 : bool; modecmd_3 : bool;
    failure_3 : bool; rdrdetectedtracks : Mctypes.tdetectedrdrtracksarray;
    tracks_4 : Mctypes.ttracksarray; onoffcmd_2_3 : bool; failure_2_2 : bool;
    x_2 : bool; initializing_2_2 : bool; st_3_2 : Mctypes.tsensorstate;
    modecmd_2 : bool; mode_2 : Mctypes.trdrmode;
    st_2_2 : Mctypes.tsensorstate; tracks_2_2 : Mctypes.ttracksarray;
    rdrdetectedtracks_2 : Mctypes.tdetectedrdrtracksarray;
    l22 : Mctypes.ttrack^Mctypes.ksizerdrtracksarray;
    l30 : Mctypes.trdrtrack^Mctypes.ksizerdrtracksarray;
    rdrtracks_2_2 : Mctypes.trdrtracksarray; initializing_3 : bool;
    st_4 : Mctypes.tsensorstate; mode : Mctypes.trdrmode;
    rdrtracks_4 : Mctypes.trdrtracksarray; tracks_3 : Mctypes.ttracksarray;
    failure : bool; iffdetectedtracks : Mctypes.tdetectedifftracksarray;
    onoffcmd_3 : bool; onoffcmd_2_2 : bool; failure_2 : bool; x : bool;
    initializing_2 : bool; st_3 : Mctypes.tsensorstate;
    st_2 : Mctypes.tsensorstate; tracks_2 : Mctypes.ttracksarray;
    iffdetectedtracks_2 : Mctypes.tdetectedifftracksarray;
    l34 : Mctypes.ttrack^Mctypes.ksizeifftracksarray;
    l40 : Mctypes.tifftracksarray; ifftracks_2_2 : Mctypes.tifftracksarray;
    st : Mctypes.tsensorstate; ifftracks_4 : Mctypes.tifftracksarray;
    initializing : bool; currentrdrstate : Mctypes.tsensorstate;
    currentrdrmode : Mctypes.trdrmode; rdrtracks : Mctypes.trdrtracksarray;
    rdronoffbutton : bool; rdrmodebutton : bool; iffonoffbutton : bool;
    currentiffstate : Mctypes.tsensorstate;
    ifftracks : Mctypes.tifftracksarray; rdronoffbutton_2 : bool;
    currentrdrstate_3 : Mctypes.tsensorstate; onoffbuttonpressed_2 : bool;
    currentstate_3 : Mctypes.tsensorstate; onoffcmd_2 : bool;
    re_Input_3 : bool; re_Output_3 : bool; rdronoffcmd_2 : bool;
    currentrdrstate_2 : Mctypes.tsensorstate; rdrmodebutton_2 : bool;
    currentrdrmode_2 : Mctypes.trdrmode;
    currentstate_2 : Mctypes.tsensorstate; modebuttonpressed : bool;
    currentmode : Mctypes.trdrmode; modecmd : bool; re_Input_2 : bool;
    re_Output_2 : bool; rdrmodecmd_2 : bool; iffonoffbutton_2 : bool;
    currentiffstate_2 : Mctypes.tsensorstate; onoffbuttonpressed : bool;
    currentstate : Mctypes.tsensorstate; onoffcmd : bool; re_Input : bool;
    re_Output : bool; iffonoffcmd_2 : bool;
    rdrtracks_3 : Mctypes.trdrtracksarray;
    ifftracks_3 : Mctypes.tifftracksarray;
    missiontracks_6 : Mctypes.tmissiontracksarray at r;
    missiontracks_5 : Mctypes.tmissiontracksarray;
    prioritiesarray_4 : Mctypes.tpriorityList at prio; indexpriority_4 : int;
    initmtrack_4 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_4 : Mctypes.tmissiontrack at r;
    newprioritiesarray_4 : Mctypes.tpriorityList at prio;
    missiontracks_4 : Mctypes.tmissiontracksarray;
    prioritiesarray_3 : Mctypes.tpriorityList at prio; indexpriority_3 : int;
    initmtrack_3 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_3 : Mctypes.tmissiontrack at r;
    newprioritiesarray_3 : Mctypes.tpriorityList at prio;
    missiontracks_3 : Mctypes.tmissiontracksarray;
    prioritiesarray_2 : Mctypes.tpriorityList at prio; indexpriority_2 : int;
    initmtrack_2 : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority_2 : Mctypes.tmissiontrack at r;
    newprioritiesarray_2 : Mctypes.tpriorityList at prio;
    missiontracks_2_2 : Mctypes.tmissiontracksarray;
    prioritiesarray : Mctypes.tpriorityList at prio; indexpriority : int;
    initmtrack : Mctypes.tmissiontrack at r;
    missiontrackwithhighestpriority : Mctypes.tmissiontrack at r;
    newprioritiesarray : Mctypes.tpriorityList at prio;
    initprio : Mctypes.tpriorityList at prio;
    prioritytracknumbers : Mctypes.tpriorityList at prio;
    missiontrackswithprio : Mctypes.tmissiontracksarray at r;
    withouttracknb : Mctypes.tmissiontracksarray at r; l81 : int;
    withtracknumber : Mctypes.tmissiontracksarray at r;
    rdrtracks_2 : Mctypes.trdrtracksarray;
    ifftracks_2 : Mctypes.tifftracksarray;
    mergedrdrtracks : Mctypes.tmissiontrack^Mctypes.ksizerdrtracksarray;
    mergedifftracks : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray;
    l140 : Mctypes.tmissiontrack^Mctypes.ksizerdrtracksarray at rdr;
    l139 : Mctypes.tmissiontrack^Mctypes.ksizeifftracksarray at iff;
    missiontracks_2 : Mctypes.tmissiontracksarray;
    fused_tracks : Mctypes.tmissiontracksarray at r;
    missiontracks_7 : Mctypes.tmissiontracksarray; rdronoffcmd : bool;
    rdrmodecmd : bool; missiontracks_8 : Mctypes.tmissiontracksarray;
    iffonoffcmd : bool; l4 : Mctypes.trdrtracksarray; l3 : Mctypes.trdrmode;
    l6 : Mctypes.tifftracksarray; l5 : Mctypes.tsensorstate; l12 : bool;
    l11 : bool; l10 : bool; l172 : Mctypes.tsensorstate;
    l179 : Mctypes.ttracksarray; l200 : bool; l201 : bool;
    missiontracks : Mctypes.tmissiontracksarray;
let
  missiontracks_9 = missiontracks;
  l33 =
    fold<<Mctypes.ksizemissiontracksarray>> dv_tracknumberexist
      <()>(missiontracks_9, missiontracks_9^Mctypes.ksizemissiontracksarray,
            false);
  proof3_2 = not(l33);
  res_2 = res;
  rdronoffclicked_2 = rdronoffclicked;
  iffonoffclicked_2 = iffonoffclicked;
  onoffcmd_4 = false -> pre l10;
  modecmd_3 = false -> pre l11;
  failure_3 = false;
  rdrdetectedtracks = [0, 1, 2, 3, 4];
  tracks_4 = l179;
  onoffcmd_2_3 = onoffcmd_4;
  failure_2_2 = failure_3;
  initializing_2_2 = (&)((=)(st_3_2, Mctypes.TState_OFF), onoffcmd_2_3);
  x_2 = false fby false fby false fby false fby false fby onoffcmd_2_3;
  st_3_2 =
    if failure_2_2
    then Mctypes.TState_FAIL
    else if if onoffcmd_2_3 then x_2 else false
         then Mctypes.TState_ON
         else Mctypes.TState_OFF
      ;
  modecmd_2 = modecmd_3;
  mode_2 =
    if modecmd_2 then Mctypes.TRdrMode_NARROW else Mctypes.TRdrMode_WIDE;
  st_2_2 = st_4;
  tracks_2_2 = tracks_4;
  rdrdetectedtracks_2 = rdrdetectedtracks;
  rdrtracks_2_2 =
    if (=)(st_2_2, Mctypes.TState_ON)
    then l30
    else Mctypes.kinitrdrtrackarray;
  l30 = map<<Mctypes.ksizerdrtracksarray>> elaboraterdrtrack<()>(l22);
  l22 =
    map<<Mctypes.ksizerdrtracksarray>> selectdetectedtrack
      <()>(rdrdetectedtracks_2, tracks_2_2^Mctypes.ksizerdrtracksarray,
            Mctypes.kinittrack^Mctypes.ksizerdrtracksarray);
  rdrtracks_4 = rdrtracks_2_2;
  mode = mode_2;
  (initializing_3, st_4) = (initializing_2_2, st_3_2);
  tracks_3 = l179;
  failure = false;
  iffdetectedtracks = [1, 2, 3];
  onoffcmd_3 = false -> pre l12;
  onoffcmd_2_2 = onoffcmd_3;
  failure_2 = failure;
  initializing_2 = (&)((=)(st_3, Mctypes.TState_OFF), onoffcmd_2_2);
  x = false fby false fby false fby false fby false fby onoffcmd_2_2;
  st_3 =
    if failure_2
    then Mctypes.TState_FAIL
    else if if onoffcmd_2_2 then x else false
         then Mctypes.TState_ON
         else Mctypes.TState_OFF
      ;
  st_2 = st;
  tracks_2 = tracks_3;
  iffdetectedtracks_2 = iffdetectedtracks;
  l34 =
    map<<Mctypes.ksizeifftracksarray>> selectdetectedtrack
      <()>(iffdetectedtracks_2, tracks_2^Mctypes.ksizeifftracksarray,
            Mctypes.kinittrack^Mctypes.ksizeifftracksarray);
  l40 = map<<Mctypes.ksizeifftracksarray>> ifftrack_of_track<()>(l34);
  ifftracks_2_2 =
    if (=)(st_2, Mctypes.TState_ON) then l40 else Mctypes.kinitifftrackarray;
  ifftracks_4 = ifftracks_2_2;
  (initializing, st) = (initializing_2, st_3);
  currentrdrstate = l172;
  currentrdrmode = l3;
  rdrtracks = l4;
  rdronoffbutton = rdronoffclicked_2;
  rdrmodebutton = false;
  iffonoffbutton = iffonoffclicked_2;
  currentiffstate = l5;
  ifftracks = l6;
  rdronoffbutton_2 = rdronoffbutton;
  currentrdrstate_3 = currentrdrstate;
  onoffbuttonpressed_2 = re_Output_3;
  currentstate_3 = currentrdrstate_3;
  automaton
    state Off
       do
      onoffcmd_2 = false
      unless
      | (&)(onoffbuttonpressed_2, (=)(currentstate_3, Mctypes.TState_OFF)) then On
    state On
       do
      onoffcmd_2 = true
      unless
      | (&)(onoffbuttonpressed_2, (=)(currentstate_3, Mctypes.TState_ON)) then Off
  end;
  re_Input_3 = rdronoffbutton_2;
  re_Output_3 = (&)(not(re_Input_3 -> pre re_Input_3), re_Input_3);
  rdronoffcmd_2 = onoffcmd_2;
  currentrdrstate_2 = currentrdrstate;
  rdrmodebutton_2 = rdrmodebutton;
  currentrdrmode_2 = currentrdrmode;
  currentstate_2 = currentrdrstate_2;
  modebuttonpressed = re_Output_2;
  currentmode = currentrdrmode_2;
  automaton
    state Wide
       do
      modecmd = false
      unless
      | (&)
        (modebuttonpressed,
          (&)
          ((=)(currentstate_2, Mctypes.TState_ON),
            (=)(currentmode, Mctypes.TRdrMode_WIDE)))
           then Narrow
    state Narrow
       do
      modecmd = true
      unless
      | (&)
        (modebuttonpressed,
          (&)
          ((=)(currentstate_2, Mctypes.TState_ON),
            (=)(currentmode, Mctypes.TRdrMode_NARROW)))
           then Wide
  end;
  re_Input_2 = rdrmodebutton_2;
  re_Output_2 = (&)(not(re_Input_2 -> pre re_Input_2), re_Input_2);
  rdrmodecmd_2 = modecmd;
  iffonoffbutton_2 = iffonoffbutton;
  currentiffstate_2 = currentiffstate;
  onoffbuttonpressed = re_Output;
  currentstate = currentiffstate_2;
  automaton
    state Off
       do
      onoffcmd = false
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_OFF)) then On
    state On
       do
      onoffcmd = true
      unless
      | (&)(onoffbuttonpressed, (=)(currentstate, Mctypes.TState_ON)) then Off
  end;
  re_Input = iffonoffbutton_2;
  re_Output = (&)(not(re_Input -> pre re_Input), re_Input);
  iffonoffcmd_2 = onoffcmd;
  rdrtracks_3 = rdrtracks;
  ifftracks_3 = ifftracks;
  missiontracks_6 = withtracknumber;
  missiontracks_5 = missiontracks_6;
  prioritiesarray_4 = newprioritiesarray_3;
  indexpriority_4 = 3;
  newprioritiesarray_4 =
    [prioritiesarray_4 with [indexpriority_4] =
      missiontrackwithhighestpriority_4.Mctypes.m_tracknumber];
  init<<r>> initmtrack_4 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_4 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_5,
            prioritiesarray_4^Mctypes.ksizemissiontracksarray, initmtrack_4);
  missiontracks_4 = missiontracks_6;
  prioritiesarray_3 = newprioritiesarray_2;
  indexpriority_3 = 2;
  newprioritiesarray_3 =
    [prioritiesarray_3 with [indexpriority_3] =
      missiontrackwithhighestpriority_3.Mctypes.m_tracknumber];
  init<<r>> initmtrack_3 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_3 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_4,
            prioritiesarray_3^Mctypes.ksizemissiontracksarray, initmtrack_3);
  missiontracks_3 = missiontracks_6;
  prioritiesarray_2 = newprioritiesarray;
  indexpriority_2 = 1;
  newprioritiesarray_2 =
    [prioritiesarray_2 with [indexpriority_2] =
      missiontrackwithhighestpriority_2.Mctypes.m_tracknumber];
  init<<r>> initmtrack_2 = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority_2 =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_3,
            prioritiesarray_2^Mctypes.ksizemissiontracksarray, initmtrack_2);
  missiontracks_2_2 = missiontracks_6;
  prioritiesarray = initprio;
  indexpriority = 0;
  newprioritiesarray =
    [prioritiesarray with [indexpriority] =
      missiontrackwithhighestpriority.Mctypes.m_tracknumber];
  init<<r>> initmtrack = Mctypes.kinitmissiontrack;
  missiontrackwithhighestpriority =
    fold<<Mctypes.ksizemissiontracksarray>> prio_selecthighestprioritynotinpriorityarray
      <()>(missiontracks_2_2,
            prioritiesarray^Mctypes.ksizemissiontracksarray, initmtrack);
  missiontrackswithprio =
    map<<Mctypes.ksizemissiontracksarray>> prio_setpriorityinmissiontrackarray
      <(prioritytracknumbers)>(missiontracks_6);
  init<<prio>> initprio = 0^4;
  prioritytracknumbers = newprioritiesarray_4;
  withouttracknb = fused_tracks;
  (withtracknumber, l81) =
    mapfold<<Mctypes.ksizemissiontracksarray>> calculatemissiontracknumber
      <(Mctypes.kinitmissiontrackarray -> pre withtracknumber)>(withouttracknb,
                                                                 0 -> pre l81);
  rdrtracks_2 = rdrtracks_3;
  ifftracks_2 = ifftracks_3;
  missiontracks_2 = mergedrdrtracks @ mergedifftracks;
  (mergedrdrtracks, mergedifftracks) =
    mapfold<<Mctypes.ksizerdrtracksarray>> mc_tracks_fusion_onerdrwithifftracks
      <()>(l140, l139);
  init<<rdr>> l140 =
    map<<Mctypes.ksizerdrtracksarray>> convertrdrtracktomissiontrack
      <()>(rdrtracks_2);
  init<<iff>> l139 =
    map<<Mctypes.ksizeifftracksarray>> convertifftracktomissiontrack
      <()>(ifftracks_2);
  init<<r>> fused_tracks = missiontracks_2;
  missiontracks_7 = missiontrackswithprio;
  missiontracks_8 = missiontracks_7;
  iffonoffcmd = iffonoffcmd_2;
  rdrmodecmd = rdrmodecmd_2;
  rdronoffcmd = rdronoffcmd_2;
  l179 = createalltracks(res_2);
  (l10, l11, missiontracks, l12) =
    (rdronoffcmd, rdrmodecmd, missiontracks_8, iffonoffcmd);
  (l5, l6, l200) = (st, ifftracks_4, initializing);
  (l201, l172, l3, l4) = (initializing_3, st_4, mode, rdrtracks_4);
  proof3 = proof3_2
tel

node dv_debug(missiontracks : Mctypes.tmissiontracksarray)
returns (proof3 : bool)
var missiontracks_2 : Mctypes.tmissiontracksarray; l33 : bool;
    proof3_2 : bool;
let
  missiontracks_2 = missiontracks;
  l33 =
    fold<<Mctypes.ksizemissiontracksarray>> dv_tracknumberexist
      <()>(missiontracks_2, missiontracks_2^Mctypes.ksizemissiontracksarray,
            false);
  proof3_2 = not(l33);
  proof3 = proof3_2
tel
*)