// File: /workspace/github_cpp_makefile_star2_O3/ArashPartow[P]exprtk-extras/exprtk_sudoku_solver.cpp
// Function: void sudoku_solver<double>()
void sudoku_solver()
{
   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;

   std::vector<T> board =
   {
      0, 0, 0, 0, 0, 8, 2, 0, 5,
      0, 0, 0, 3, 2, 0, 0, 0, 8,
      0, 0, 0, 0, 0, 5, 6, 0, 0,
      0, 1, 0, 0, 4, 7, 0, 9, 3,
      0, 0, 0, 0, 0, 0, 0, 0, 0,
      8, 6, 0, 2, 3, 0, 0, 1, 0,
      0, 0, 6, 8, 0, 0, 0, 0, 0,
      5, 0, 0, 0, 7, 3, 0, 0, 0,
      4, 0, 3, 9, 0, 0, 0, 0, 0,
   };

   exprtk::rtl::io::package<T> io_package;

   symbol_table_t symbol_table;
   symbol_table.add_vector  ("board", board);
   symbol_table.add_function("print_digit",
                             [](T v) ->T
                             { printf(" %d ",static_cast<int>(v)); return 0; });
   symbol_table.add_package (io_package);

   compositor_t compositor(symbol_table);

   compositor.load_variables(true);
   compositor.load_vectors  (true);

   compositor.add(
      function_t("get_board")
      .vars("col", "row")
      .expression
      ( " board[row * sqrt(board[]) + col]; " ));

   compositor.add(
      function_t("set_board")
      .vars("col", "row", "value")
      .expression
      ( " board[row * sqrt(board[]) + col] := value; " ));

   compositor.add(
      function_t("display_board")
      .expression
      (
         " const var n := sqrt(board[]);                             "
         "                                                           "
         " for (var row := 0; row < n; row += 1)                     "
         " {                                                         "
         "    for (var col := 0; col < n; col += 1)                  "
         "    {                                                      "
         "       print_digit(get_board(col,row));                    "
         "                                                           "
         "       if ((col > 0) and (col < 8) and (col + 1) % 3 == 0) "
         "       {                                                   "
         "          print('|')                                       "
         "       }                                                   "
         "    };                                                     "
         "                                                           "
         "    println('');                                           "
         "                                                           "
         "    if ((row > 0) and (row < 8) and (row + 1) % 3 == 0)    "
         "    {                                                      "
         "       println('---------+---------+----------');          "
         "    }                                                      "
         " }                                                         "
      ));

   compositor.add(
      function_t("is_valid")
      .vars("col", "row", "num")
      .expression
      (
         " const var n := sqrt(board[]);                              "
         "                                                            "
         " for (var i := 0; i < n; i += 1)                            "
         " {                                                          "
         "    if (                                                    "
         "         (get_board(col, i  ) == num) or                    "
         "         (get_board(i  , row) == num)                       "
         "       )                                                    "
         "    {                                                       "
         "       return [false];                                      "
         "    }                                                       "
         " };                                                         "
         "                                                            "
         " var subgrid_row := row - floor(row % 3);                   "
         " var subgrid_col := col - floor(col % 3);                   "
         "                                                            "
         " for (var i := subgrid_row; i < subgrid_row + 3; i += 1)    "
         " {                                                          "
         "    for (var j := subgrid_col; j < subgrid_col + 3; j += 1) "
         "    {                                                       "
         "       if (get_board(j,i) == num)                           "
         "       {                                                    "
         "          return [false];                                   "
         "       }                                                    "
         "    }                                                       "
         " };                                                         "
         "                                                            "
         " return [true];                                             "
      ));

   compositor.add(
      function_t("solve_sudoku")
      .expression
      (
         " const var n := sqrt(board[]);                "
         "                                              "
         " for (var row := 0; row < n; row += 1)        "
         " {                                            "
         "    for (var col := 0; col < n; col += 1)     "
         "    {                                         "
         "       if (get_board(col, row) != 0)          "
         "       {                                      "
         "          continue;                           "
         "       }                                      "
         "                                              "
         "       for (var num := 1; num <= 9; num += 1) "
         "       {                                      "
         "          if (not(is_valid(col, row, num)))   "
         "          {                                   "
         "             continue;                        "
         "          }                                   "
         "                                              "
         "          set_board(col, row, num);           "
         "                                              "
         "          if (solve_sudoku())                 "
         "          {                                   "
         "             return [true];                   "
         "          };                                  "
         "                                              "
         "          set_board(col, row, 0);             "
         "       };                                     "
         "                                              "
         "       return [false];                        "
         "    }                                         "
         " };                                           "
         "                                              "
         " return [true];                               "
      ));

   const std::string sudoku_solver_program =
      " if (solve_sudoku())                           "
      " {                                             "
      "    println('Puzzle Solved!');                 "
      " }                                             "
      " else                                          "
      " {                                             "
      "    println('Error: Failed to solve puzzle.'); "
      " };                                            "
      "                                               "
      " display_board();                              ";

   expression_t expression;
   expression.register_symbol_table(symbol_table);

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

   expression.value();
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x15d8, %rsp           # imm = 0x15D8
leaq 0x19d383(%rip), %rsi    # 0x2b7840
leaq 0xbf0(%rsp), %rbx
movl $0x288, %edx            # imm = 0x288
movq %rbx, %rdi
callq 0x117060
leaq 0x90(%rsp), %rdi
leaq 0x2c8(%rsp), %rcx
movl $0x51, %edx
movq %rbx, %rsi
callq 0x11b5e4
leaq 0x1f8(%rsp), %rdi
callq 0x11b62a
leaq 0x28(%rsp), %rdi
movl $0x1, %esi
callq 0x11b70a
leaq 0xc00(%rsp), %r14
movq %r14, -0x10(%r14)
leaq 0x197447(%rip), %rsi    # 0x2b1965
leaq 0x197445(%rip), %rdx    # 0x2b196a
leaq 0xbf0(%rsp), %rdi
callq 0x11b54e
leaq 0x28(%rsp), %rdi
leaq 0xbf0(%rsp), %rsi
leaq 0x90(%rsp), %rdx
callq 0x11b752
movq 0xbf0(%rsp), %rdi
cmpq %r14, %rdi
je 0x11a569
movq 0xc00(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0xbf0(%rsp), %rdi
movq %r14, (%rdi)
leaq 0x1973da(%rip), %rsi    # 0x2b1955
leaq 0x1973de(%rip), %rdx    # 0x2b1960
callq 0x11b54e
leaq 0x5e8c(%rip), %rdx      # 0x12041a
leaq 0x28(%rsp), %rdi
leaq 0xbf0(%rsp), %rsi
callq 0x11b932
movq 0xbf0(%rsp), %rdi
cmpq %r14, %rdi
je 0x11a5bd
movq 0xc00(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0x1f8(%rsp), %rdi
leaq 0x28(%rsp), %rsi
callq 0x120434
leaq 0xbf0(%rsp), %rdi
leaq 0x28(%rsp), %rbx
movq %rbx, %rsi
callq 0x11ba88
movw $0x101, 0x15d0(%rsp)    # imm = 0x101
leaq 0xb8(%rsp), %rax
movq %rax, -0x10(%rax)
leaq 0x197360(%rip), %rsi    # 0x2b1961
leaq 0x197362(%rip), %rdx    # 0x2b196a
leaq 0xa8(%rsp), %rdi
callq 0x11b54e
leaq 0x2c8(%rsp), %rdi
leaq 0xa8(%rsp), %rsi
callq 0x11bc10
leaq 0x18(%rsp), %r13
movq %r13, -0x10(%r13)
leaq 0x197331(%rip), %rsi    # 0x2b196b
leaq 0x19732d(%rip), %rdx    # 0x2b196e
leaq 0x8(%rsp), %rdi
callq 0x11b54e
leaq 0x40(%rsp), %r14
movq %r14, -0x10(%r14)
leaq 0x197314(%rip), %rsi    # 0x2b196f
leaq 0x197310(%rip), %rdx    # 0x2b1972
leaq 0x30(%rsp), %rdi
callq 0x11b54e
leaq 0x308(%rsp), %r15
leaq 0x8(%rsp), %rsi
movq %r15, %rdi
callq 0x1297f8
leaq 0x30(%rsp), %rsi
movq %r15, %rdi
callq 0x1297f8
leaq 0x60(%rsp), %rbp
movq %rbp, -0x10(%rbp)
leaq 0x1972d5(%rip), %rsi    # 0x2b1973
leaq 0x1972f1(%rip), %rdx    # 0x2b1996
leaq 0x50(%rsp), %rdi
callq 0x11b54e
leaq 0x2e8(%rsp), %r12
leaq 0x50(%rsp), %rsi
movq %r12, %rdi
callq 0x117520
leaq 0x1520(%rsp), %rdi
leaq 0x2c8(%rsp), %rsi
callq 0x122692
leaq 0x1528(%rsp), %rcx
cmpq %rax, %rcx
jne 0x11a798
leaq 0xbf0(%rsp), %rdi
leaq 0x2c8(%rsp), %rsi
movq %r12, %rdx
movq %r15, %rcx
xorl %r8d, %r8d
callq 0x1213f8
testb %al, %al
je 0x11a798
leaq 0x2c8(%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 0x1550(%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 0x1222b6
movq (%rax), %r12
leaq 0x2c8(%rsp), %rsi
leaq 0x1520(%rsp), %rdi
callq 0x122616
movq %r12, %rdi
movq %rax, %rsi
callq 0x122332
movq 0x50(%rsp), %rdi
cmpq %rbp, %rdi
je 0x11a7af
movq 0x60(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x30(%rsp), %rdi
cmpq %r14, %rdi
je 0x11a7c6
movq 0x40(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x8(%rsp), %rdi
cmpq %r13, %rdi
je 0x11a7dd
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x117090
movq %r15, %rdi
callq 0x129a92
leaq 0x2f8(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x11a806
movq 0x2f8(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0x2d8(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x11a827
movq 0x2d8(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0xa8(%rsp), %rdi
leaq 0xb8(%rsp), %rax
cmpq %rax, %rdi
je 0x11a84c
movq 0xb8(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0xa8(%rsp), %rdi
leaq 0xb8(%rsp), %rax
movq %rax, (%rdi)
leaq 0x197131(%rip), %rsi    # 0x2b1997
leaq 0x197133(%rip), %rdx    # 0x2b19a0
callq 0x11b54e
leaq 0x2c8(%rsp), %rdi
leaq 0xa8(%rsp), %rsi
callq 0x11bc10
leaq 0x8(%rsp), %rdi
movq %r13, (%rdi)
leaq 0x1970d5(%rip), %rsi    # 0x2b196b
leaq 0x1970d1(%rip), %rdx    # 0x2b196e
callq 0x11b54e
leaq 0x30(%rsp), %rdi
movq %r14, (%rdi)
leaq 0x1970be(%rip), %rsi    # 0x2b196f
leaq 0x1970ba(%rip), %rdx    # 0x2b1972
callq 0x11b54e
leaq 0x50(%rsp), %rdi
movq %rbp, (%rdi)
leaq 0x1985f1(%rip), %rsi    # 0x2b2ebd
leaq 0x1985ef(%rip), %rdx    # 0x2b2ec2
callq 0x11b54e
leaq 0x308(%rsp), %r15
leaq 0x8(%rsp), %rsi
movq %r15, %rdi
callq 0x1297f8
leaq 0x30(%rsp), %rsi
movq %r15, %rdi
callq 0x1297f8
leaq 0x50(%rsp), %rsi
movq %r15, %rdi
callq 0x1297f8
leaq 0x80(%rsp), %rbp
movq %rbp, -0x10(%rbp)
leaq 0x197087(%rip), %rsi    # 0x2b19a1
leaq 0x1970ac(%rip), %rdx    # 0x2b19cd
leaq 0x70(%rsp), %rdi
callq 0x11b54e
leaq 0x2e8(%rsp), %r12
leaq 0x70(%rsp), %rsi
movq %r12, %rdi
callq 0x117520
leaq 0x2c8(%rsp), %rsi
leaq 0x1520(%rsp), %rdi
callq 0x122692
leaq 0x1528(%rsp), %rcx
cmpq %rax, %rcx
jne 0x11aa14
leaq 0xbf0(%rsp), %rdi
leaq 0x2c8(%rsp), %rsi
movq %r12, %rdx
movq %r15, %rcx
xorl %r8d, %r8d
callq 0x1213f8
testb %al, %al
je 0x11aa14
leaq 0x2c8(%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 0x1550(%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 0x1222b6
movq (%rax), %r12
leaq 0x2c8(%rsp), %rsi
leaq 0x1520(%rsp), %rdi
callq 0x122616
movq %r12, %rdi
movq %rax, %rsi
callq 0x122332
movq 0x70(%rsp), %rdi
cmpq %rbp, %rdi
je 0x11aa2e
movq 0x80(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x50(%rsp), %rdi
leaq 0x60(%rsp), %rax
cmpq %rax, %rdi
je 0x11aa4a
movq 0x60(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x30(%rsp), %rdi
cmpq %r14, %rdi
je 0x11aa61
movq 0x40(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x8(%rsp), %rdi
cmpq %r13, %rdi
je 0x11aa78
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x117090
movq %r15, %rdi
callq 0x129a92
movq 0x2e8(%rsp), %rdi
leaq 0x2f8(%rsp), %rax
cmpq %rax, %rdi
je 0x11aaa5
movq 0x2f8(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x2c8(%rsp), %rdi
leaq 0x2d8(%rsp), %rax
cmpq %rax, %rdi
je 0x11aaca
movq 0x2d8(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0xa8(%rsp), %rdi
leaq 0xb8(%rsp), %rax
cmpq %rax, %rdi
je 0x11aaef
movq 0xb8(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0xa8(%rsp), %rdi
leaq 0xb8(%rsp), %rax
movq %rax, (%rdi)
leaq 0x196ec5(%rip), %rsi    # 0x2b19ce
leaq 0x196ecb(%rip), %rdx    # 0x2b19db
callq 0x11b54e
leaq 0x2c8(%rsp), %rdi
leaq 0xa8(%rsp), %rsi
callq 0x11bc10
leaq 0x8(%rsp), %rdi
movq %r13, (%rdi)
leaq 0x196ea3(%rip), %rsi    # 0x2b19dc
leaq 0x197373(%rip), %rdx    # 0x2b1eb3
callq 0x11b54e
leaq 0x2e8(%rsp), %r12
leaq 0x8(%rsp), %rsi
movq %r12, %rdi
callq 0x117520
leaq 0x2c8(%rsp), %rsi
leaq 0x1520(%rsp), %rdi
callq 0x122692
leaq 0x308(%rsp), %r15
leaq 0x1528(%rsp), %rcx
cmpq %rax, %rcx
jne 0x11ac36
leaq 0xbf0(%rsp), %rdi
leaq 0x2c8(%rsp), %rsi
movq %r12, %rdx
movq %r15, %rcx
xorl %r8d, %r8d
callq 0x1213f8
testb %al, %al
je 0x11ac36
leaq 0x2c8(%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 0x1550(%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 0x1222b6
movq (%rax), %r12
leaq 0x2c8(%rsp), %rsi
leaq 0x1520(%rsp), %rdi
callq 0x122616
movq %r12, %rdi
movq %rax, %rsi
callq 0x122332
movq 0x8(%rsp), %rdi
cmpq %r13, %rdi
je 0x11ac4d
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x117090
movq %r15, %rdi
callq 0x129a92
movq 0x2e8(%rsp), %rdi
leaq 0x2f8(%rsp), %rax
cmpq %rax, %rdi
je 0x11ac7a
movq 0x2f8(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x2c8(%rsp), %rdi
leaq 0x2d8(%rsp), %rax
cmpq %rax, %rdi
je 0x11ac9f
movq 0x2d8(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0xa8(%rsp), %rdi
leaq 0xb8(%rsp), %rax
cmpq %rax, %rdi
je 0x11acc4
movq 0xb8(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0xa8(%rsp), %rdi
leaq 0xb8(%rsp), %rax
movq %rax, (%rdi)
leaq 0x1971d6(%rip), %rsi    # 0x2b1eb4
leaq 0x1971d7(%rip), %rdx    # 0x2b1ebc
callq 0x11b54e
leaq 0x2c8(%rsp), %rdi
leaq 0xa8(%rsp), %rsi
callq 0x11bc10
leaq 0x8(%rsp), %rdi
movq %r13, (%rdi)
leaq 0x196c5d(%rip), %rsi    # 0x2b196b
leaq 0x196c59(%rip), %rdx    # 0x2b196e
callq 0x11b54e
leaq 0x30(%rsp), %rdi
movq %r14, (%rdi)
leaq 0x196c46(%rip), %rsi    # 0x2b196f
leaq 0x196c42(%rip), %rdx    # 0x2b1972
callq 0x11b54e
leaq 0x50(%rsp), %rdi
leaq 0x60(%rsp), %rax
movq %rax, (%rdi)
leaq 0x197174(%rip), %rsi    # 0x2b1ebd
leaq 0x197170(%rip), %rdx    # 0x2b1ec0
callq 0x11b54e
leaq 0x308(%rsp), %r15
leaq 0x8(%rsp), %rsi
movq %r15, %rdi
callq 0x1297f8
leaq 0x30(%rsp), %rsi
movq %r15, %rdi
callq 0x1297f8
leaq 0x50(%rsp), %rsi
movq %r15, %rdi
callq 0x1297f8
leaq 0x70(%rsp), %rdi
movq %rbp, (%rdi)
leaq 0x19712e(%rip), %rsi    # 0x2b1ec1
leaq 0x1977b7(%rip), %rdx    # 0x2b2551
callq 0x11b54e
leaq 0x2e8(%rsp), %r12
leaq 0x70(%rsp), %rsi
movq %r12, %rdi
callq 0x117520
leaq 0x2c8(%rsp), %rsi
leaq 0x1520(%rsp), %rdi
callq 0x122692
leaq 0x1528(%rsp), %rcx
cmpq %rax, %rcx
jne 0x11ae88
leaq 0xbf0(%rsp), %rdi
leaq 0x2c8(%rsp), %rsi
movq %r12, %rdx
movq %r15, %rcx
xorl %r8d, %r8d
callq 0x1213f8
testb %al, %al
je 0x11ae88
leaq 0x2c8(%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 0x1550(%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 0x1222b6
movq (%rax), %r12
leaq 0x2c8(%rsp), %rsi
leaq 0x1520(%rsp), %rdi
callq 0x122616
movq %r12, %rdi
movq %rax, %rsi
callq 0x122332
movq 0x70(%rsp), %rdi
cmpq %rbp, %rdi
je 0x11aea2
movq 0x80(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x50(%rsp), %rdi
leaq 0x60(%rsp), %rax
cmpq %rax, %rdi
je 0x11aebe
movq 0x60(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x30(%rsp), %rdi
cmpq %r14, %rdi
je 0x11aed5
movq 0x40(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x8(%rsp), %rdi
cmpq %r13, %rdi
je 0x11aeec
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x117090
movq %r15, %rdi
callq 0x129a92
movq 0x2e8(%rsp), %rdi
leaq 0x2f8(%rsp), %rax
cmpq %rax, %rdi
je 0x11af19
movq 0x2f8(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x2c8(%rsp), %rdi
leaq 0x2d8(%rsp), %rax
cmpq %rax, %rdi
je 0x11af3e
movq 0x2d8(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0xa8(%rsp), %rdi
leaq 0xb8(%rsp), %rax
cmpq %rax, %rdi
je 0x11af63
movq 0xb8(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0xa8(%rsp), %rdi
leaq 0xb8(%rsp), %rax
movq %rax, (%rdi)
leaq 0x1975d5(%rip), %rsi    # 0x2b2552
leaq 0x1975da(%rip), %rdx    # 0x2b255e
callq 0x11b54e
leaq 0x2c8(%rsp), %rdi
leaq 0xa8(%rsp), %rsi
callq 0x11bc10
leaq 0x8(%rsp), %rdi
movq %r13, (%rdi)
leaq 0x1975b2(%rip), %rsi    # 0x2b255f
leaq 0x197b99(%rip), %rdx    # 0x2b2b4d
callq 0x11b54e
leaq 0x2e8(%rsp), %r12
leaq 0x8(%rsp), %rsi
movq %r12, %rdi
callq 0x117520
leaq 0x2c8(%rsp), %rsi
leaq 0x1520(%rsp), %rdi
callq 0x122692
leaq 0x308(%rsp), %r15
leaq 0x1528(%rsp), %rcx
cmpq %rax, %rcx
jne 0x11b0aa
leaq 0xbf0(%rsp), %rdi
leaq 0x2c8(%rsp), %rsi
movq %r12, %rdx
movq %r15, %rcx
xorl %r8d, %r8d
callq 0x1213f8
testb %al, %al
je 0x11b0aa
leaq 0x2c8(%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 0x1550(%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 0x1222b6
movq (%rax), %r12
leaq 0x2c8(%rsp), %rsi
leaq 0x1520(%rsp), %rdi
callq 0x122616
movq %r12, %rdi
movq %rax, %rsi
callq 0x122332
movq 0x8(%rsp), %rdi
cmpq %r13, %rdi
je 0x11b0c1
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x117090
movq %r15, %rdi
callq 0x129a92
movq 0x2e8(%rsp), %rdi
leaq 0x2f8(%rsp), %rax
cmpq %rax, %rdi
je 0x11b0ee
movq 0x2f8(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x2c8(%rsp), %rdi
leaq 0x2d8(%rsp), %rax
cmpq %rax, %rdi
je 0x11b113
movq 0x2d8(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0xa8(%rsp), %rdi
leaq 0xb8(%rsp), %rax
cmpq %rax, %rdi
je 0x11b138
movq 0xb8(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0x8(%rsp), %rdi
movq %r13, (%rdi)
leaq 0x197a07(%rip), %rsi    # 0x2b2b4e
leaq 0x197bd6(%rip), %rdx    # 0x2b2d24
callq 0x11b54e
leaq 0x30(%rsp), %rdi
callq 0x11bcea
movq 0x38(%rsp), %rax
movq 0x40(%rsp), %rcx
subq %rax, %rcx
je 0x11b190
sarq $0x3, %rcx
movq 0x28(%rsp), %rdx
cmpq $0x1, %rcx
adcq $0x0, %rcx
cmpq %rbx, %rax
je 0x11b19f
cmpq (%rax), %rdx
je 0x11b19f
addq $0x8, %rax
decq %rcx
jne 0x11b17d
leaq 0x38(%rsp), %rdi
leaq 0x28(%rsp), %rsi
callq 0x129d18
leaq 0xa8(%rsp), %rdi
movl $0x7f, %esi
callq 0x11bd76
leaq 0x2c8(%rsp), %rdi
leaq 0xa8(%rsp), %rsi
callq 0x11be76
leaq 0x1a8(%rsp), %rdi
callq 0x129efe
leaq 0x178(%rsp), %rdi
callq 0x129efe
leaq 0x148(%rsp), %rdi
callq 0x129efe
leaq 0x118(%rsp), %rdi
callq 0x129efe
leaq 0xe8(%rsp), %rdi
callq 0x129efe
leaq 0xb8(%rsp), %rdi
callq 0x129efe
leaq 0x2c8(%rsp), %rdi
leaq 0x8(%rsp), %rsi
leaq 0x30(%rsp), %rdx
callq 0x11c69a
movq 0x30(%rsp), %rax
movq 0x8(%rax), %rdi
movq (%rdi), %rax
callq *0x18(%rax)
leaq 0x2c8(%rsp), %rdi
callq 0x11d236
leaq 0x30(%rsp), %rdi
callq 0x11d4f8
movq 0x8(%rsp), %rdi
cmpq %r13, %rdi
je 0x11b268
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0xbf0(%rsp), %rdi
callq 0x11d546
leaq 0x28(%rsp), %rdi
callq 0x11d5a8
leaq 0x2b8(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x11b2a0
movq 0x2b8(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0x290401(%rip), %rbx    # 0x3ab6a8
leaq 0x290(%rsp), %rax
movq %rbx, -0x30(%rax)
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x11b2cc
movq 0x290(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0x250(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x11b2ed
movq 0x250(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0x228(%rsp), %rax
movq %rbx, -0x30(%rax)
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x11b312
movq 0x228(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x90(%rsp), %rdi
testq %rdi, %rdi
je 0x11b32f
movq 0xa0(%rsp), %rsi
subq %rdi, %rsi
callq 0x117090
addq $0x15d8, %rsp           # imm = 0x15D8
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x11b358
movq %rax, %rbx
leaq 0xa8(%rsp), %rdi
callq 0x11c652
jmp 0x11b41b
movq %rax, %rbx
jmp 0x11b41b
movq %rax, %rbx
jmp 0x11b425
jmp 0x11b3ba
jmp 0x11b3aa
jmp 0x11b3b2
jmp 0x11b3ba
jmp 0x11b47b
jmp 0x11b43d
jmp 0x11b446
jmp 0x11b3aa
jmp 0x11b3b2
jmp 0x11b3ba
jmp 0x11b3aa
jmp 0x11b3b2
jmp 0x11b3ba
jmp 0x11b47b
jmp 0x11b43d
jmp 0x11b446
jmp 0x11b3aa
jmp 0x11b3b2
jmp 0x11b3ba
jmp 0x11b43d
jmp 0x11b446
movq %rax, %rbx
jmp 0x11b4c8
movq %rax, %rbx
jmp 0x11b4d5
movq %rax, %rbx
jmp 0x11b4fa
jmp 0x11b3f3
jmp 0x11b3f3
jmp 0x11b3ca
jmp 0x11b3f3
movq %rax, %rbx
movq 0xbf0(%rsp), %rdi
cmpq %r14, %rdi
je 0x11b507
movq 0xc00(%rsp), %rsi
incq %rsi
callq 0x117090
jmp 0x11b507
movq %rax, %rbx
jmp 0x11b507
movq %rax, %rbx
jmp 0x11b511
movq %rax, %rbx
jmp 0x11b51e
movq %rax, %rbx
leaq 0x2c8(%rsp), %rdi
callq 0x11d236
leaq 0x30(%rsp), %rdi
callq 0x11d4f8
movq 0x8(%rsp), %rdi
cmpq %r13, %rdi
je 0x11b4fa
movq 0x18(%rsp), %rsi
jmp 0x11b4f2
movq %rax, %rbx
jmp 0x11b49a
jmp 0x11b446
jmp 0x11b44b
movq %rax, %rbx
jmp 0x11b4b1
movq %rax, %rbx
movq 0x70(%rsp), %rdi
cmpq %rbp, %rdi
je 0x11b47e
movq 0x80(%rsp), %rsi
incq %rsi
callq 0x117090
jmp 0x11b47e
movq %rax, %rbx
movq 0x50(%rsp), %rdi
cmpq %rbp, %rdi
jne 0x11b48d
jmp 0x11b49a
jmp 0x11b47b
movq %rax, %rbx
movq 0x50(%rsp), %rdi
leaq 0x60(%rsp), %rax
cmpq %rax, %rdi
je 0x11b49a
movq 0x60(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x30(%rsp), %rdi
cmpq %r14, %rdi
je 0x11b4b1
movq 0x40(%rsp), %rsi
incq %rsi
callq 0x117090
movq 0x8(%rsp), %rdi
cmpq %r13, %rdi
je 0x11b4c8
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0x2c8(%rsp), %rdi
callq 0x11bcaa
movq 0xa8(%rsp), %rdi
leaq 0xb8(%rsp), %rax
cmpq %rax, %rdi
je 0x11b4fa
movq 0xb8(%rsp), %rsi
incq %rsi
callq 0x117090
leaq 0xbf0(%rsp), %rdi
callq 0x11d546
leaq 0x28(%rsp), %rdi
callq 0x11d5a8
leaq 0x1f8(%rsp), %rdi
callq 0x11d63e
movq 0x90(%rsp), %rdi
testq %rdi, %rdi
je 0x11b53b
movq 0xa0(%rsp), %rsi
subq %rdi, %rsi
callq 0x117090
movq %rbx, %rdi
callq 0x1172e0