// File: /workspace/github_cpp_makefile_star2_O1/ArashPartow[P]exprtk-extras/exprtk_miller_rabin_primality_test.cpp
// Function: void miller_rabin_probabilistic_primality_test<double>()
void miller_rabin_probabilistic_primality_test()
{
   typedef exprtk::symbol_table<T>         symbol_table_t;
   typedef exprtk::expression<T>           expression_t;
   typedef exprtk::parser<T>               parser_t;
   typedef exprtk::function_compositor<T>  compositor_t;
   typedef typename compositor_t::function function_t;

   T prime_numbers[] =
   {
      5083823,   5083879,   5083889,   5083909,   5083913,   5083927,   5083931,  5083957,
      5083973,   5083993,   5084017,   5084033,   5084069,   5084099,   5084111,  5084113,
      5084117,   5084129,   5084141,   5084147,   5084171,   5084179,   5084197,  5084213,
      5084221,   5084243,   5084249,   5084263,   5084269,   5084333,   5084371,  5084383,
      5084393,   5084399,   5084407,   5084423,   5084437,   5084447,   5084461,  5084473,
      5084477,   5084489,   5084501,   5084509,   5084531,   5084537,   5084543,  5084549,
      5084551,   5084557,   5084567,   5084593,   5084617,   5084627,   5084641,  5084671,
      5084689,   5084693,   5084711,   5084731,   5084743,   5084749,   5084753,  5084803,
      5084809,   5084813,   5084843,   5084851,   5084867,   5084869,   5084897,  5084903,
      6782807,   6782821,   6782827,   6782833,   6782869,   6782903,   6782911,  6782921,
      6782929,   6782933,   6782939,   6782959,   6782969,   6782977,   6783011,  6783031,
      6783047,   6783067,   6783083,   6783089,   6783097,   6783107,   6783131,  6783143,
      6783149,   6783151,   6783169,   6783193,   6783211,   6783223,   6783239,  6783241,
      6783253,   6783263,   6783299,   6783317,   6783331,   6783353,   6783421,  6783433,
      6783449,   6783457,   6783461,   6783467,   6783481,   6783521,   6783529,  6783533,
      9723667,   9723691,   9723697,   9723709,   9723713,   9723757,   9723761,  9723767,
      9723773,   9723797,   9723799,   9723803,   9723809,   9723821,   9723829,  9723841,
      9723851,   9723853,   9723869,   9723887,   9723893,   9723907,   9723913,  9723937,
      9723941,   9723943,   9723979,   9723997,   9724021,   9724061,   9724079,  9724087,
      9724097,   9724103,   9724129,   9724151,   9724171,   9724201,   9724207,  9724213,
      9724223,   9724241,   9724259,   9724277,   9724279,   9724283,   9724291,  9724327,
     10619129,  10619131,  10619137,  10619159,  10619177,  10619179,  10619209, 10619243,
     10619251,  10619263,  10619291,  10619303,  10619327,  10619341,  10619381, 10619393,
     10619431,  10619489,  10619501,  10619503,  10619513,  10619563,  10619573, 10619591,
     10619599,  10619617,  10619621,  10619641,  10619647,  10619669,  10619681, 10619711,
     10619723,  10619729,  10619731,  10619737,  10619759,  10619773,  10619783, 10619801,
     10619863,  10619893,  10619897,  10619899,  10619911,  10619923,  10619927, 10619957,
     10619971,  10619989,  10620007,  10620023,  10620041,  10620067,  10620131, 10620133,
     10620139,  10620143,  10620149,  10620151,  10620157,  10620163,  10620179, 10620199,
     10748671,  10748687,  10748693,  10748701,  10748707,  10748713,  10748747, 10748767,
     10748779,  10748783,  10748791,  10748807,  10748809,  10748827,  10748849, 10748863,
     10748867,  10748869,  10748873,  10748893,  10748897,  10748917,  10748921, 10748923,
     10748951,  10748953,  10748957,  10748963,  10748987,  10748999,  10749001, 10749023,
     10749029,  10749059,  10749061,  10749071,  10749077,  10749107,  10749121, 10749143,
     10749161,  10749163,  10749173,  10749191,  10749197,  10749199,  10749241, 10749251,
     10749259,  10749283,  10749313,  10749317,  10749337,  10749367,  10749371, 10749373,
     10749379,  10749391,  10749433,  10749437,  10749449,  10749461,  10749493, 10749581,
     10749587,  10749601,  10749617,  10749631,  10749659,  10749677,  10749679, 10749703,
     10749709,  10749719,  10749727,  10749743,  10749773,  10749779,  10749811, 10749821,
     10749833,  10749853,  10749857,  10749863,  10749881,  10749883,  10749889, 10749917,
     10749971,  10749983,  10749989,  10749997,  10750009,  10750021,  10750031, 10750037,
     10750049,  10750057,  10750073,  10750099,  10750127,  10750141,  10750147, 10750189,
     10750193,  10750249,  10750279,  10750303,  10750309,  10750319,  10750349, 10750373,
   };

   T composites[] =
   {
       199203677,  779234623,  843093203,  883543291, 1197162971,
      1282615157, 1552390397, 1765737859, 1878769589, 1993904873,
      2257133471, 2520523529, 2579094799, 2853450949, 2935025369,
      3095780533, 3164132249, 3408963511, 4260042859, 4608613981,
      4654875857, 5085931997, 7278175081, 7289187463, 9206112101
   };

   exprtk::rtl::io::println<T> println;
   random_uint<T>              random;

   symbol_table_t symbol_table;

   symbol_table.add_vector  ("prime_numbers"    , prime_numbers);
   symbol_table.add_vector  ("composite_numbers", composites   );
   symbol_table.add_function("println"          , println      );
   symbol_table.add_function("random"           , random       );

   compositor_t compositor(symbol_table);

   compositor.add(function_t()
      .name("modexp") // (base^exponent) mod m
      .var("b") // base
      .var("e") // exponent
      .var("m") // modulo
      .expression
      (
         " if (m == 1)                       "
         " {                                 "
         "    return [0];                    "
         " };                                "
         "                                   "
         " var result := 1;                  "
         " b %= m;                           "
         "                                   "
         " while (e > 0)                     "
         " {                                 "
         "    if ((e % 2) == 1)              "
         "    {                              "
         "       result := (result * b) % m; "
         "    };                             "
         "                                   "
         "    b := b^2 % m;                  "
         "    e := floor(e / 2);             "
         " };                                "
         "                                   "
         " result                            "
      ));

   compositor.add(function_t()
      .name("is_probable_prime")
      .var("n") // Number to test for primaility
      .var("k") // Number of iterations to perform
      .expression
      (
         " switch                                             "
         " {                                                  "
         "    case n <= 1       : return [false];             "
         "    case frac(n) != 0 : return [false];             "
         "    case n == 2       : return [true ];             "
         " };                                                 "
         "                                                    "
         " if (((n - 1) % 6 != 0) and ((n + 1) % 6 != 0))     "
         " {                                                  "
         "    return [false];                                 "
         " };                                                 "
         "                                                    "
         " var primes[25] :=                                  "
         "     {                                              "
         "        2,  3,  5,  7, 11, 13, 17, 19, 23,          "
         "       29, 31, 37, 41, 43, 47, 53, 59, 61,          "
         "       67, 71, 73, 79, 83, 89, 97                   "
         "     };                                             "
         "                                                    "
         " var upper_bound := min(n - 1, trunc(sqrt(n)) + 1); "
         "                                                    "
         " for (var i := 0; i < primes[]; i += 1)             "
         " {                                                  "
         "    if (primes[i] >= upper_bound)                   "
         "       return [true];                               "
         "    else if ((n % primes[i]) == 0)                  "
         "       return [false];                              "
         " };                                                 "
         "                                                    "
         " var s := n - 1;                                    "
         " var t := 0;                                        "
         "                                                    "
         " while ((s % 2) == 0)                               "
         " {                                                  "
         "    s := floor(s / 2);                              "
         "    t += 1;                                         "
         " };                                                 "
         "                                                    "
         " for (var trials := 0; trials < k; trials += 1)     "
         " {                                                  "
         "    var a := random(2, n - 2);                      "
         "    var x := modexp(a, s, n);                       "
         "                                                    "
         "    if ((x == 1) or (x == (n - 1)))                 "
         "    {                                               "
         "       continue;                                    "
         "    };                                              "
         "                                                    "
         "    for (var r := 1; r < t; r += 1)                 "
         "    {                                               "
         "       x := modexp(x, 2, n);                        "
         "                                                    "
         "       if (x == 1)                                  "
         "          return [false];                           "
         "       else if (x == (n - 1))                       "
         "          break;                                    "
         "    };                                              "
         "                                                    "
         "    if (x != (n - 1))                               "
         "    {                                               "
         "       return [false];                              "
         "    };                                              "
         " };                                                 "
         "                                                    "
         " return [true];                                     "
      ));

   const std::string miller_rabin_primality_test_program =
      "                                                     "
      " println('Testing prime numbers...');                "
      " for (var i := 0; i < prime_numbers[]; i += 1)       "
      " {                                                   "
      "    var n := prime_numbers[i];                       "
      "                                                     "
      "    if (is_probable_prime(n,1000))                   "
      "    {                                                "
      "       println(n, ' is correctly a prime number');   "
      "    }                                                "
      "    else                                             "
      "    {                                                "
      "       println(n, ' is NOT a prime number (error)'); "
      "    }                                                "
      " };                                                  "
      "                                                     "
      " println('Testing composite numbers...');            "
      " for (var i := 0; i < composite_numbers[]; i += 1)   "
      " {                                                   "
      "    var n := composite_numbers[i];                   "
      "                                                     "
      "    if (not(is_probable_prime(n,1000)))              "
      "    {                                                "
      "       println(n, ' is correctly a composite');      "
      "    }                                                "
      "    else                                             "
      "    {                                                "
      "       println(n, ' is a prime number (error)');     "
      "    }                                                "
      " };                                                  "
      "                                                     "
      " for (var i := 0; i < prime_numbers[]; i += 1)       "
      " {                                                   "
      "    for (var j := i; j < prime_numbers[]; j += 1)    "
      "    {                                                "
      "       var n := prime_numbers[i] * prime_numbers[j]; "
      "                                                     "
      "       if (not(is_probable_prime(n,1000)))           "
      "       {                                             "
      "          println(n, ' is correctly a composite');   "
      "       }                                             "
      "       else                                          "
      "       {                                             "
      "          println(n, ' is a prime number (error)');  "
      "       }                                             "
      "    }                                                "
      " };                                                  ";

   expression_t expression;
   expression.register_symbol_table(symbol_table);

   parser_t parser;
   parser.compile(miller_rabin_primality_test_program,expression);

   expression.value();
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x3498, %rsp           # imm = 0x3498
leaq 0x1c08fa(%rip), %rsi    # 0x2dce40
leaq 0x29d0(%rsp), %rdi
movl $0xac0, %edx            # imm = 0xAC0
callq 0x119060
leaq 0x1c13a1(%rip), %rsi    # 0x2dd900
leaq 0x1550(%rsp), %rdi
movl $0xc8, %edx
callq 0x119060
leaq 0x1630(%rsp), %r14
movq %r14, -0x10(%r14)
leaq 0x1ba385(%rip), %rsi    # 0x2d6909
leaq 0x1ba384(%rip), %rdx    # 0x2d690f
leaq 0x1620(%rsp), %rdi
callq 0x11d450
leaq 0x1d8(%rsp), %rdi
leaq 0x1620(%rsp), %rsi
callq 0x11d4e0
movq 0x1620(%rsp), %rdi
cmpq %r14, %rdi
je 0x11c5ca
movq 0x1630(%rsp), %rsi
incq %rsi
callq 0x119090
leaq 0x1620(%rsp), %rdi
callq 0x11d5e8
movq %rsp, %rdi
movl $0x1, %esi
callq 0x11d71c
leaq 0x250(%rsp), %r14
movq %r14, -0x10(%r14)
leaq 0x1ba319(%rip), %rsi    # 0x2d6910
leaq 0x1ba31f(%rip), %rdx    # 0x2d691d
leaq 0x240(%rsp), %rdi
callq 0x11d450
movq (%rsp), %rax
testq %rax, %rax
je 0x11c7f5
movq 0x8(%rax), %rbx
testq %rbx, %rbx
je 0x11c7f5
movq 0x248(%rsp), %rax
testq %rax, %rax
je 0x11c7f5
movq 0x240(%rsp), %rcx
movb (%rcx), %dl
andb $-0x21, %dl
addb $-0x41, %dl
cmpb $0x19, %dl
ja 0x11c7f5
cmpq $0x1, %rax
je 0x11c6a0
leaq -0x1(%rax), %rsi
movl $0x1, %edi
xorl %edx, %edx
movb (%rcx,%rdi), %r8b
cmpb $0x5f, %r8b
je 0x11c690
leal -0x30(%r8), %r9d
cmpb $0xa, %r9b
jb 0x11c690
movl %r8d, %r9d
andb $-0x21, %r9b
addb $-0x41, %r9b
cmpb $0x1a, %r9b
jb 0x11c690
cmpq %rsi, %rdi
jae 0x11c69b
cmpb $0x2e, %r8b
jne 0x11c69b
incq %rdi
cmpq %rax, %rdi
setae %dl
jne 0x11c660
testb $0x1, %dl
je 0x11c6c1
leaq 0x1f0(%rbx), %rdi
leaq 0x240(%rsp), %rsi
callq 0x120c48
addq $0x1f8, %rbx            # imm = 0x1F8
cmpq %rax, %rbx
sete %dl
testb $0x1, %dl
je 0x11c7f5
movq (%rsp), %rax
testq %rax, %rax
je 0x11c7cb
movq 0x8(%rax), %rbx
testq %rbx, %rbx
je 0x11c7cb
cmpq $0x0, 0x248(%rsp)
je 0x11c70c
leaq 0x240(%rsp), %rsi
movq %rbx, %rdi
callq 0x120cd2
addq $0x8, %rbx
cmpq %rax, %rbx
jne 0x11c7f5
cmpq $0x0, 0x248(%rsp)
je 0x11c743
movq (%rsp), %rax
movq 0x8(%rax), %rbx
leaq 0x188(%rbx), %rdi
leaq 0x240(%rsp), %rsi
callq 0x120f12
addq $0x190, %rbx            # imm = 0x190
cmpq %rax, %rbx
jne 0x11c7f5
cmpq $0x0, 0x248(%rsp)
je 0x11c776
movq (%rsp), %rax
movq 0x8(%rax), %rbx
leaq 0x150(%rbx), %rdi
leaq 0x240(%rsp), %rsi
callq 0x121152
addq $0x158, %rbx            # imm = 0x158
cmpq %rax, %rbx
jne 0x11c7f5
cmpq $0x0, 0x248(%rsp)
je 0x11c7a3
movq (%rsp), %rax
movq 0x8(%rax), %rbx
leaq 0x38(%rbx), %rdi
leaq 0x240(%rsp), %rsi
callq 0x121392
addq $0x40, %rbx
cmpq %rax, %rbx
jne 0x11c7f5
movq (%rsp), %rax
movq 0x8(%rax), %rbx
leaq 0x1f0(%rbx), %rdi
leaq 0x240(%rsp), %rsi
callq 0x120c48
addq $0x1f8, %rbx            # imm = 0x1F8
cmpq %rax, %rbx
jne 0x11c7f5
movq (%rsp), %rax
movl $0x150, %edi            # imm = 0x150
addq 0x8(%rax), %rdi
leaq 0x240(%rsp), %rsi
leaq 0x29d0(%rsp), %rdx
movl $0x158, %ecx            # imm = 0x158
xorl %r8d, %r8d
callq 0x1215d2
movq 0x240(%rsp), %rdi
cmpq %r14, %rdi
je 0x11c812
movq 0x250(%rsp), %rsi
incq %rsi
callq 0x119090
leaq 0x240(%rsp), %rdi
movq %r14, (%rdi)
leaq 0x1ba0fa(%rip), %rsi    # 0x2d691e
leaq 0x1ba104(%rip), %rdx    # 0x2d692f
callq 0x11d450
movq (%rsp), %rax
testq %rax, %rax
je 0x11ca1a
movq 0x8(%rax), %rbx
testq %rbx, %rbx
je 0x11ca1a
movq 0x248(%rsp), %rax
testq %rax, %rax
je 0x11ca1a
movq 0x240(%rsp), %rcx
movb (%rcx), %dl
andb $-0x21, %dl
addb $-0x41, %dl
cmpb $0x19, %dl
ja 0x11ca1a
cmpq $0x1, %rax
je 0x11c8c5
leaq -0x1(%rax), %rsi
movl $0x1, %edi
xorl %edx, %edx
movb (%rcx,%rdi), %r8b
cmpb $0x5f, %r8b
je 0x11c8b5
leal -0x30(%r8), %r9d
cmpb $0xa, %r9b
jb 0x11c8b5
movl %r8d, %r9d
andb $-0x21, %r9b
addb $-0x41, %r9b
cmpb $0x1a, %r9b
jb 0x11c8b5
cmpq %rsi, %rdi
jae 0x11c8c0
cmpb $0x2e, %r8b
jne 0x11c8c0
incq %rdi
cmpq %rax, %rdi
setae %dl
jne 0x11c885
testb $0x1, %dl
je 0x11c8e6
leaq 0x1f0(%rbx), %rdi
leaq 0x240(%rsp), %rsi
callq 0x120c48
addq $0x1f8, %rbx            # imm = 0x1F8
cmpq %rax, %rbx
sete %dl
testb $0x1, %dl
je 0x11ca1a
movq (%rsp), %rax
testq %rax, %rax
je 0x11c9f0
movq 0x8(%rax), %rbx
testq %rbx, %rbx
je 0x11c9f0
cmpq $0x0, 0x248(%rsp)
je 0x11c931
leaq 0x240(%rsp), %rsi
movq %rbx, %rdi
callq 0x120cd2
addq $0x8, %rbx
cmpq %rax, %rbx
jne 0x11ca1a
cmpq $0x0, 0x248(%rsp)
je 0x11c968
movq (%rsp), %rax
movq 0x8(%rax), %rbx
leaq 0x188(%rbx), %rdi
leaq 0x240(%rsp), %rsi
callq 0x120f12
addq $0x190, %rbx            # imm = 0x190
cmpq %rax, %rbx
jne 0x11ca1a
cmpq $0x0, 0x248(%rsp)
je 0x11c99b
movq (%rsp), %rax
movq 0x8(%rax), %rbx
leaq 0x150(%rbx), %rdi
leaq 0x240(%rsp), %rsi
callq 0x121152
addq $0x158, %rbx            # imm = 0x158
cmpq %rax, %rbx
jne 0x11ca1a
cmpq $0x0, 0x248(%rsp)
je 0x11c9c8
movq (%rsp), %rax
movq 0x8(%rax), %rbx
leaq 0x38(%rbx), %rdi
leaq 0x240(%rsp), %rsi
callq 0x121392
addq $0x40, %rbx
cmpq %rax, %rbx
jne 0x11ca1a
movq (%rsp), %rax
movq 0x8(%rax), %rbx
leaq 0x1f0(%rbx), %rdi
leaq 0x240(%rsp), %rsi
callq 0x120c48
addq $0x1f8, %rbx            # imm = 0x1F8
cmpq %rax, %rbx
jne 0x11ca1a
movq (%rsp), %rax
movl $0x150, %edi            # imm = 0x150
addq 0x8(%rax), %rdi
leaq 0x240(%rsp), %rsi
leaq 0x1550(%rsp), %rdx
movl $0x19, %ecx
xorl %r8d, %r8d
callq 0x1215d2
movq 0x240(%rsp), %rdi
cmpq %r14, %rdi
je 0x11ca37
movq 0x250(%rsp), %rsi
incq %rsi
callq 0x119090
leaq 0x240(%rsp), %rdi
movq %r14, (%rdi)
leaq 0x1b9ee7(%rip), %rsi    # 0x2d6930
leaq 0x1b9ee7(%rip), %rdx    # 0x2d6937
callq 0x11d450
movq %rsp, %rdi
leaq 0x240(%rsp), %rsi
leaq 0x1d8(%rsp), %rdx
callq 0x11d764
movq 0x240(%rsp), %rdi
cmpq %r14, %rdi
je 0x11ca8a
movq 0x250(%rsp), %rsi
incq %rsi
callq 0x119090
leaq 0x240(%rsp), %rdi
movq %r14, (%rdi)
leaq 0x1b9e9c(%rip), %rsi    # 0x2d6938
leaq 0x1b9e9b(%rip), %rdx    # 0x2d693e
callq 0x11d450
movq %rsp, %rdi
leaq 0x240(%rsp), %rsi
leaq 0x1620(%rsp), %rdx
callq 0x11d8ee
movq 0x240(%rsp), %rdi
cmpq %r14, %rdi
je 0x11cadd
movq 0x250(%rsp), %rsi
incq %rsi
callq 0x119090
leaq 0x240(%rsp), %rdi
movq %rsp, %rbx
movq %rbx, %rsi
callq 0x11da16
leaq 0xc28(%rsp), %rdi
callq 0x11db9e
leaq 0x98(%rsp), %rbp
movq %rbp, -0x10(%rbp)
leaq 0x1b9e2f(%rip), %rsi    # 0x2d693f
leaq 0x1b9e2e(%rip), %rdx    # 0x2d6945
leaq 0x88(%rsp), %rdi
callq 0x11d450
leaq 0xc28(%rsp), %rdi
leaq 0x88(%rsp), %rsi
callq 0x119550
leaq 0x18(%rsp), %rax
movq %rax, -0x10(%rax)
leaq 0x1b9dfd(%rip), %rsi    # 0x2d6946
leaq 0x1b9df7(%rip), %rdx    # 0x2d6947
leaq 0x8(%rsp), %rdi
callq 0x11d450
leaq 0xc68(%rsp), %r15
leaq 0x8(%rsp), %rsi
movq %r15, %rdi
callq 0x12d5de
leaq 0x38(%rsp), %rax
movq %rax, -0x10(%rax)
leaq 0x1bc59b(%rip), %rsi    # 0x2d911a
leaq 0x1bc595(%rip), %rdx    # 0x2d911b
leaq 0x28(%rsp), %rdi
callq 0x11d450
leaq 0x28(%rsp), %rsi
movq %r15, %rdi
callq 0x12d5de
leaq 0x58(%rsp), %r13
movq %r13, -0x10(%r13)
leaq 0x1b9d90(%rip), %rsi    # 0x2d693d
leaq 0x1b9d8a(%rip), %rdx    # 0x2d693e
leaq 0x48(%rsp), %rdi
callq 0x11d450
leaq 0x48(%rsp), %rsi
movq %r15, %rdi
callq 0x12d5de
leaq 0x78(%rsp), %r14
movq %r14, -0x10(%r14)
leaq 0x1b9d6d(%rip), %rsi    # 0x2d6948
leaq 0x1ba022(%rip), %rdx    # 0x2d6c04
leaq 0x68(%rsp), %rdi
callq 0x11d450
leaq 0xc48(%rsp), %r12
leaq 0x68(%rsp), %rsi
movq %r12, %rdi
callq 0x119550
leaq 0xb70(%rsp), %rdi
leaq 0xc28(%rsp), %rsi
callq 0x12573c
leaq 0xb78(%rsp), %rcx
cmpq %rax, %rcx
jne 0x11ccd5
leaq 0x240(%rsp), %rdi
leaq 0xc28(%rsp), %rsi
movq %r12, %rdx
movq %r15, %rcx
xorl %r8d, %r8d
callq 0x12449a
testb %al, %al
je 0x11ccd5
leaq 0xc28(%rsp), %rsi
movq 0x88(%rsi), %rax
movq %rax, %rcx
subq 0x68(%rsi), %rcx
shrq $0x3, %rcx
cmpq $0x1, %rax
adcq $-0x1, %rcx
movq 0x60(%rsi), %rax
movq 0x70(%rsi), %rdx
subq 0x78(%rsi), %rdx
subq 0x50(%rsi), %rax
sarq $0x5, %rdx
sarq $0x5, %rax
leaq (%rcx,%rcx,2), %rcx
shlq $0x8, %rcx
addq 0xba0(%rsp), %rcx
leaq (%rdx,%rdx,2), %rdx
shlq $0x4, %rdx
leaq (%rax,%rax,2), %rdi
shlq $0x4, %rdi
addq %rdx, %rdi
addq %rcx, %rdi
callq 0x12536c
movq (%rax), %r12
leaq 0xc28(%rsp), %rsi
leaq 0xb70(%rsp), %rdi
callq 0x1256c0
movq %r12, %rdi
movq %rax, %rsi
callq 0x1253e8
movq 0x68(%rsp), %rdi
cmpq %r14, %rdi
je 0x11ccec
movq 0x78(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x48(%rsp), %rdi
cmpq %r13, %rdi
je 0x11cd03
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x28(%rsp), %rdi
leaq 0x38(%rsp), %rax
cmpq %rax, %rdi
je 0x11cd1f
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x11cd3b
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x88(%rsp), %rdi
cmpq %rbp, %rdi
je 0x11cd58
movq 0x98(%rsp), %rsi
incq %rsi
callq 0x119090
movq %r15, %rdi
callq 0x12d878
leaq 0xc58(%rsp), %r14
movq -0x10(%r14), %rdi
cmpq %r14, %rdi
je 0x11cd81
movq 0xc58(%rsp), %rsi
incq %rsi
callq 0x119090
leaq 0xc38(%rsp), %rbp
movq -0x10(%rbp), %rdi
cmpq %rbp, %rdi
je 0x11cda2
movq 0xc38(%rsp), %rsi
incq %rsi
callq 0x119090
leaq 0xc28(%rsp), %rdi
callq 0x11db9e
leaq 0x88(%rsp), %rdi
leaq 0x98(%rsp), %rax
movq %rax, (%rdi)
leaq 0x1b9e3c(%rip), %rsi    # 0x2d6c05
leaq 0x1b9e46(%rip), %rdx    # 0x2d6c16
callq 0x11d450
leaq 0xc28(%rsp), %rdi
leaq 0x88(%rsp), %rsi
callq 0x119550
leaq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
movq %rax, (%rdi)
leaq 0x1b99da(%rip), %rsi    # 0x2d67d8
leaq 0x1b99d4(%rip), %rdx    # 0x2d67d9
callq 0x11d450
leaq 0xc68(%rsp), %r15
leaq 0x8(%rsp), %rsi
movq %r15, %rdi
callq 0x12d5de
leaq 0x28(%rsp), %rdi
leaq 0x38(%rsp), %rax
movq %rax, (%rdi)
leaq 0x1b991d(%rip), %rsi    # 0x2d6750
leaq 0x1b9917(%rip), %rdx    # 0x2d6751
callq 0x11d450
leaq 0x28(%rsp), %rsi
movq %r15, %rdi
callq 0x12d5de
leaq 0x48(%rsp), %rdi
movq %r13, (%rdi)
leaq 0x1b9dbc(%rip), %rsi    # 0x2d6c17
leaq 0x1baae9(%rip), %rdx    # 0x2d794b
callq 0x11d450
leaq 0xc48(%rsp), %r12
leaq 0x48(%rsp), %rsi
movq %r12, %rdi
callq 0x119550
leaq 0xc28(%rsp), %rsi
leaq 0xb70(%rsp), %rdi
callq 0x12573c
leaq 0xb78(%rsp), %rcx
cmpq %rax, %rcx
jne 0x11cf50
leaq 0x240(%rsp), %rdi
leaq 0xc28(%rsp), %rsi
movq %r12, %rdx
movq %r15, %rcx
xorl %r8d, %r8d
callq 0x12449a
testb %al, %al
je 0x11cf50
leaq 0xc28(%rsp), %rsi
movq 0x88(%rsi), %rax
movq %rax, %rcx
subq 0x68(%rsi), %rcx
shrq $0x3, %rcx
cmpq $0x1, %rax
adcq $-0x1, %rcx
movq 0x60(%rsi), %rax
movq 0x70(%rsi), %rdx
subq 0x78(%rsi), %rdx
subq 0x50(%rsi), %rax
sarq $0x5, %rdx
sarq $0x5, %rax
leaq (%rcx,%rcx,2), %rcx
shlq $0x8, %rcx
addq 0xba0(%rsp), %rcx
leaq (%rdx,%rdx,2), %rdx
shlq $0x4, %rdx
leaq (%rax,%rax,2), %rdi
shlq $0x4, %rdi
addq %rdx, %rdi
addq %rcx, %rdi
callq 0x12536c
movq (%rax), %r12
leaq 0xc28(%rsp), %rsi
leaq 0xb70(%rsp), %rdi
callq 0x1256c0
movq %r12, %rdi
movq %rax, %rsi
callq 0x1253e8
movq 0x48(%rsp), %rdi
cmpq %r13, %rdi
je 0x11cf67
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x28(%rsp), %rdi
leaq 0x38(%rsp), %rax
cmpq %rax, %rdi
je 0x11cf83
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x11cf9f
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x88(%rsp), %rdi
leaq 0x98(%rsp), %rax
cmpq %rax, %rdi
je 0x11cfc4
movq 0x98(%rsp), %rsi
incq %rsi
callq 0x119090
movq %r15, %rdi
callq 0x12d878
movq 0xc48(%rsp), %rdi
cmpq %r14, %rdi
je 0x11cfe9
movq 0xc58(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0xc28(%rsp), %rdi
cmpq %rbp, %rdi
je 0x11d006
movq 0xc38(%rsp), %rsi
incq %rsi
callq 0x119090
leaq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
movq %rax, (%rdi)
leaq 0x1ba932(%rip), %rsi    # 0x2d794c
leaq 0x1bb2e6(%rip), %rdx    # 0x2d8307
callq 0x11d450
leaq 0x28(%rsp), %rdi
callq 0x11dc6a
movq 0x30(%rsp), %rcx
movq 0x38(%rsp), %rax
subq %rcx, %rax
je 0x11d08b
sarq $0x3, %rax
cmpq $0x1, %rax
movq %rax, %rsi
adcq $0x0, %rsi
cmpq %rbx, %rcx
je 0x11d098
movq (%rsp), %rdx
cmpq (%rcx), %rdx
je 0x11d098
addq $0x8, %rcx
movl $0x1, %edi
subq %rsi, %rdi
xorl %esi, %esi
cmpq %rsi, %rdi
je 0x11d08b
decq %rsi
cmpq %rbx, %rcx
je 0x11d083
leaq 0x8(%rcx), %r8
cmpq (%rcx), %rdx
movq %r8, %rcx
jne 0x11d06a
negq %rsi
cmpq %rax, %rsi
jb 0x11d098
leaq 0x30(%rsp), %rdi
movq %rsp, %rsi
callq 0x12daea
leaq 0x88(%rsp), %rdi
movl $0x7f, %esi
callq 0x11dd04
leaq 0xc28(%rsp), %rdi
leaq 0x88(%rsp), %rsi
callq 0x11de04
leaq 0x188(%rsp), %rdi
callq 0x12dcd0
leaq 0x158(%rsp), %rdi
callq 0x12dcd0
leaq 0x128(%rsp), %rdi
callq 0x12dcd0
leaq 0xf8(%rsp), %rdi
callq 0x12dcd0
leaq 0xc8(%rsp), %rdi
callq 0x12dcd0
leaq 0x98(%rsp), %rdi
callq 0x12dcd0
leaq 0xc28(%rsp), %rdi
leaq 0x8(%rsp), %rsi
leaq 0x28(%rsp), %rdx
callq 0x11e628
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdi
movq (%rdi), %rax
callq *0x18(%rax)
leaq 0xc28(%rsp), %rdi
callq 0x11effa
leaq 0x28(%rsp), %rdi
callq 0x11f2bc
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x11d166
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x119090
leaq 0x240(%rsp), %rdi
callq 0x11f30a
movq %rsp, %rdi
callq 0x11f36c
leaq 0x230(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x11d19c
movq 0x230(%rsp), %rsi
incq %rsi
callq 0x119090
leaq 0x2c490d(%rip), %rax    # 0x3e1ab0
leaq 0x208(%rsp), %rcx
movq %rax, -0x30(%rcx)
movq -0x10(%rcx), %rdi
cmpq %rcx, %rdi
je 0x11d1c8
movq 0x208(%rsp), %rsi
incq %rsi
callq 0x119090
addq $0x3498, %rsp           # imm = 0x3498
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x11d26d
jmp 0x11d26d
jmp 0x11d1fb
movq %rax, %rbx
leaq 0x88(%rsp), %rdi
callq 0x11e5e0
jmp 0x11d2ed
movq %rax, %rbx
jmp 0x11d2ed
movq %rax, %rbx
jmp 0x11d2f7
jmp 0x11d25f
jmp 0x11d20f
movq %rax, %rbx
jmp 0x11d336
jmp 0x11d219
movq %rax, %rbx
jmp 0x11d352
jmp 0x11d223
movq %rax, %rbx
jmp 0x11d36e
jmp 0x11d257
jmp 0x11d25f
jmp 0x11d231
movq %rax, %rbx
jmp 0x11d3a2
jmp 0x11d23b
movq %rax, %rbx
jmp 0x11d3b9
jmp 0x11d245
movq %rax, %rbx
jmp 0x11d3d5
jmp 0x11d24f
movq %rax, %rbx
jmp 0x11d3f1
movq %rax, %rbx
jmp 0x11d40e
movq %rax, %rbx
jmp 0x11d41b
jmp 0x11d29a
jmp 0x11d26d
jmp 0x11d29a
movq %rax, %rbx
movq 0x240(%rsp), %rdi
cmpq %r14, %rdi
je 0x11d428
movq 0x250(%rsp), %rsi
incq %rsi
callq 0x119090
jmp 0x11d428
jmp 0x11d29a
jmp 0x11d29a
movq %rax, %rbx
jmp 0x11d428
jmp 0x11d2a4
movq %rax, %rbx
jmp 0x11d430
movq %rax, %rbx
movq 0x1620(%rsp), %rdi
cmpq %r14, %rdi
je 0x11d43d
movq 0x1630(%rsp), %rsi
incq %rsi
callq 0x119090
jmp 0x11d43d
movq %rax, %rbx
jmp 0x11d43d
movq %rax, %rbx
leaq 0xc28(%rsp), %rdi
callq 0x11effa
leaq 0x28(%rsp), %rdi
callq 0x11f2bc
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x11d41b
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x119090
jmp 0x11d41b
movq %rax, %rbx
movq 0x48(%rsp), %rdi
cmpq %r13, %rdi
je 0x11d336
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x28(%rsp), %rdi
leaq 0x38(%rsp), %rax
cmpq %rax, %rdi
je 0x11d352
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x11d36e
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x88(%rsp), %rdi
leaq 0x98(%rsp), %rax
cmpq %rax, %rdi
jne 0x11d3fe
jmp 0x11d40e
movq %rax, %rbx
movq 0x68(%rsp), %rdi
cmpq %r14, %rdi
je 0x11d3a2
movq 0x78(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x48(%rsp), %rdi
cmpq %r13, %rdi
je 0x11d3b9
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x28(%rsp), %rdi
leaq 0x38(%rsp), %rax
cmpq %rax, %rdi
je 0x11d3d5
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x11d3f1
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x119090
movq 0x88(%rsp), %rdi
cmpq %rbp, %rdi
je 0x11d40e
movq 0x98(%rsp), %rsi
incq %rsi
callq 0x119090
leaq 0xc28(%rsp), %rdi
callq 0x11dc2a
leaq 0x240(%rsp), %rdi
callq 0x11f30a
movq %rsp, %rdi
callq 0x11f36c
leaq 0x1d8(%rsp), %rdi
callq 0x11f404
movq %rbx, %rdi
callq 0x119300