#include <perms.h>
int _imp_mainep(int _imp_argc, char **_imp_argv) {
  typedef struct Ra {
    int A;
    int B[500 /*1:500*/];
  } Ra;
  typedef struct Era {
    int A;
    int B[4 /*1:4*/];
    _imp_string C;
  } Era;
  typedef struct Pointer {
    Pointer *Link;
    int A;
  } Pointer;
  typedef struct Cell {
    int A;
  } Cell;
  int X;
  int A;
  int J;
  int K;
  int Sub;
  Ra Reca;
  Ra Recb;
  Ra Recc[3 /*-1:1*/];
  int Int1[3 /*1:3*/][5 /*11:15*/];
  int Int2[5 /*1:5*/];
  _imp_string S1;
  _imp_string S2;
  _imp_string S3;
  _imp_string Sarray[11 /*100:110*/];
  int Error;
  Cell Sell;
  Cell *Pcell;
  Pointer *Ptr;
  static int Failures = 0;
  void Pass(void) { Printstring(_imp_str_literal("Pass: ")); }
  void Fail(void) {
    Printstring(_imp_str_literal("FAIL: "));
    Failures++;
  }
  auto void Inc(int D);
  void Inc2(int D) {
    void Inc3(int D) {
      void Inc4(int D) {
        void Inc5(int D) {
          if (D > 400) {
            Printstring(
                _imp_str_literal("Pass: Deeply recursed, nested routine."));
            Newline();
            return;
          }
          Inc(D + 1);
        }
        Inc5(D + 1);
      }
      Inc4(D + 1);
    }
    Inc3(D + 1);
  }
  void Inc(int D) { Inc2(D + 1); }
  void Params(int A, int *B, int C, int *D, _imp_string E, _imp_string *F,
              _imp_string G, _imp_string *H, int J, int K, _imp_string L,
              Ra Reca, Ra *Recb, Ra Recc) {
    int W;
    *B = A + C + *D;
    A = A * 10;
    *F = _imp_join(E, G);
    E = G;
    for (C = 1; C <= 5; C++) J = K;
    for (C = 1; C <= 5; C++) J = 6 - K;
    for (C = 11; C <= 15; C++) J = 20;
    *D = 0;
    for (W = 11; W <= 15; W++) *D = *D + J + J + J;
    *H = _imp_str_literal("");
    for (W = 100; W <= 110; W++) *H = _imp_join(*H, L);
    for (W = 0; W <= 10; W++) L = Tostring(W + 'A');
    *Recb = Reca;
    Reca = 0;
    for (W = -1; W <= 1; W++) {
      Recc = W;
      for (C = 1; C <= 500; C++) Recc = C;
    }
  }
  void Staticdata(int N, int *E) {
    int I;
    int Sum = 0;
    static int J = 1;
    static int K = 3;
    static _imp_string S = _imp_str_literal("1");
    static int Int[100 /*1:100*/] = {[0 ... 99] = 1};
    if (J != N || K != 3 * N || S != Tostring('0' + N)) *E = *E + 1;
    for (I = 1; I <= 100; I++) Sum += Int[I];
    if (Sum != 100 * N) *E = *E + 1;
    J++;
    K = J * 3;
    S = Tostring('0' + J);
    for (I = 1; I <= 100; I++) Int[I] = J;
  }
  void P5(int N, int *M) {
    if (!N) {
      *M = 0;
      return;
    }
    P5(N - 1, *M);
    *M = *M + 1;
  }
  void P2(int N, int *M) {
    *M = *M + 1;
    if (N == 1) return;
    *M = *M + 1;
    if (N == 2) return;
    *M = *M + 1;
    return;
    *M = *M + 1;
  }
  auto void P6(int N, int *M);
  void P7(int N, int *M) {
    int L;
    if (!N) return;
    L = N - 1;
    P6(L, *M);
    *M = *M + 1;
  }
  void P6(int N, int *M) {
    int K;
    if (!N) return;
    K = N - 1;
    P7(K, *M);
    *M = *M + 1;
  }
  int Sideeffect(int A) {
    J = A * 10;
    return (A);
  }
  int Factorial(int N) {
    if (N <= 0) return (1);
    return (N * Factorial(N - 1));
  }
  int /* boolean */ Even(int N) {
    if (N / 2 * 2 == N) return (1);
    return (0);
  }
  _imp_string *Smap(int Choice) {
    if (Choice == 2) return (&S2);
    if (Choice == 1) return (&S1);
    return (&Sarray[105]);
  }
  int *Intmap(void) {
    if (J < K) return (&J);
    if (J == K) return (&A);
    return (&K);
  }
  Openoutput(1, Cliparam());
  Selectoutput(1);
  X = 1;
  A = 0;
  Error = 0;
  {
    int X = 2;
    int Y;
    int B;
    B = A + 1;
    Y = X * 2;
    {
      int X = 5;
      int C;
      C = B + 1;
      if (Y == 4 && X == 5)
        Pass();
      else
        Fail();
      Printstring(_imp_str_literal("Nesting at level TWO."));
      Newline();
      {
        int Z;
        int D;
        D = C + 1;
        Z = 6;
        {
          int W;
          int E;
          E = D + 1;
          W = 7;
          {
            int V;
            int F;
            F = E + 1;
            V = W + X + Y + Z;
            {
              int T;
              int G;
              G = F + 1;
              T = V + X;
              if (T == 27 && V == 22 && W == 7 && X == 5 && G == 6)
                Pass();
              else
                Fail();
              Printstring(
                  _imp_str_literal("Scoping of variables at level SIX"));
              Newline();
            }
            if (V != 22) Error++;
          }
          if (W != 7) Error++;
        }
        if (Z != 6) Error++;
      }
      if (X != 5) Error++;
    }
    if (X != 2) Error++;
  }
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(
      _imp_str_literal("Scoping of variables on leaving nested blocks."));
  Newlines(3);
  K = 6;
  X = 5 * K;
  {
    int J;
    int Sum = 0;
    int Int[X];
    for (J = 1; J <= X; J++) {
      Int[J] = J;
      Sum += Int[J];
    }
    if (Sum == X * (X + 1) / 2)
      Pass();
    else
      Fail();
    Printstring(_imp_str_literal("'Dynamic' array bounds within a block."));
    Newline();
  }
  Newlines(2);
  for (J = 1; J <= 5; J++) Int2[J] = J;
  for (J = 0; J <= 10; J++) Sarray[100 + J] = Tostring('a' + J);
  Reca.A = 1000;
  for (K = 1; K <= 500; K++) Reca.B = K;
  Recb.A = 2000;
  for (K = 1; K <= 500; K++) Recb.B = 1;
  for (K = -1; K <= 1; K++) {
    for (A = 1; A <= 500; A++) Recc[K].B = 1;
    Recc[K].A = 10 + K;
  }
  J = 10;
  A = 20;
  S1 = _imp_str_literal("BACK");
  S3 = _imp_str_literal("NONSENSE");
  Params(J, X, 20, A, _imp_str_literal("FRONT"), S2, S1, S3, Int1, Int2, Sarray,
         Reca, Recb, Recc);
  Error = 0;
  if (J != 10) Error++;
  if (X != 50) Error++;
  if (S2 != _imp_str_literal("FRONTBACK")) Error++;
  if (S1 != _imp_str_literal("BACK")) Error++;
  if (S3 != _imp_str_literal("abcdefghijk")) Error++;
  if (A != 130) Error++;
  if (Reca.A != 1000) Error++;
  if (Recb.A != 1000) Error++;
  J = 0;
  for (K = 11; K <= 15; K++) J = J + Int1[1][K] + Int1[2][K] + Int1[3][K];
  if (J != 130) Error++;
  S1 = _imp_str_literal("");
  for (K = 100; K <= 110; K++) S1 = _imp_join(S1, Sarray[K]);
  if (S1 != _imp_str_literal("ABCDEFGHIJK")) Error++;
  J = 0;
  for (K = -1; K <= 1; K++) J += Recc[K].A;
  if (J) Error++;
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Value and %Name parameter passing."));
  Newline();
  Error = 0;
  K = 0;
  for (J = 1; J <= 3; J++) {
    P2(J, K);
    if (K != J * (J + 1) / 2) Error++;
  }
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(
      _imp_str_literal("Conditional and normal %RETURN from a routine."));
  Newline();
  Error = 0;
  if (Factorial(0) != 1) Error++;
  if (Factorial(4) != 24) Error++;
  if (Factorial(10) != 10 * Factorial(8) * 9) Error++;
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(
      _imp_str_literal("Conditional and normal %RESULT from a function."));
  Newline();
  A = Factorial(Factorial(Factorial(Factorial(3)) - 713) - 5032);
  if (A == 40320)
    Pass();
  else
    Fail();
  Printstring(
      _imp_str_literal("Nested function calls as parameter to a function."));
  Newline();
  P5(100, K);
  if (K == 100)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Simple recursion in routines."));
  Newline();
  K = 0;
  P7(100, K);
  if (K == 100)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Mutual recursion in routines."));
  Newline();
  K = Sideeffect(10);
  if (K == 10 && J == 100)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Side effects caused by functions."));
  Newline();
  Error = 0;
  for (J = 1; J <= 100; J++) Staticdata(J, Error);
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(
      _imp_str_literal("%OWN Data preserved between routine invocations."));
  Newline();
  Error = 0;
  if (Even(7)) Error++;
  if (!Even(30)) Error++;
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(
      _imp_str_literal("%Predicates successfully used in conditionals."));
  Newline();
  Inc(1);
  Newlines(2);
  J = 3;
  K = 4;
  A = 5;
  Error = 0;
  *Intmap() = 6;
  if (J != 6 || K != 4 || A != 5) Error++;
  *Intmap() = 6;
  if (J != 6 || 6 != K || A != 5) Error++;
  *Intmap() = 8;
  if (J != K || K != 6 || A != 8) Error++;
  if (*Intmap() != 8) Error++;
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(
      _imp_str_literal("Conditional and unconditional %RESULT in a MAP."));
  Newline();
  Error = 0;
  S1 = _imp_str_literal("ONE");
  S2 = _imp_str_literal("TWO");
  Sarray[105] = _imp_str_literal("Help");
  S3 = *Smap(1);
  if (S3 != _imp_str_literal("ONE")) {
    Error++;
    Write(1, 1);
  }
  if (S2 != *Smap(2)) {
    Error++;
    Write(2, 1);
  }
  *Smap(9) = _imp_str_literal("Dynamic");
  if (Sarray[105] != _imp_str_literal("Dynamic")) {
    Error++;
    Write(3, 1);
  }
  if (!Error)
    Pass();
  else
    Fail();
  Printstring(_imp_str_literal("Pointing at local %Strings using a MAP."));
  Newline();
  Selectoutput(0);
  Write(Failures, 1);
  Printstring(_imp_str_literal(" failure(s)"));
  Newline();
  exit(0);
  return (1);
}
