// File: sighingnow[P]compile-pascal/pl0_tac_gen.cpp
// Function: pl0_tac_factor[abi:cxx11](pl0_ast_factor const*)
pair<Value *, string> pl0_tac_factor(pl0_ast_factor const * factor) {
    cout << __func__;
    pair<Value *, string> ans;
    // variables used inner switch-case block.
    int d1, d2;
    constant val;
    variable var, array;
    Value *idx, *t;

    switch (factor->t) {
        case pl0_ast_factor::type_t::ID:
            d1 = valtb.depth(factor->ptr.id->id), d2 = vartb.depth(factor->ptr.id->id);
            if (d1 > d2) {
                // constant
                valtb.find(factor->ptr.id->id, true, val);
                ans = make_pair(new Value(val.val, val.dt), "integer");
            }
            else if (d2 > d1) {
                // variable
                vartb.find(factor->ptr.id->id, true, var);
                if (var.type.length() >= 5 && var.type.substr(0, 5) == "array") {
                    pl0_ast_error(factor->loc, string("use an array identifier ") + "\"" + var.name + "\"" + " as a factor.");
                }
                ans = make_pair(new Value(var.name, var.dt), var.dt);
            }
            else {
                // undeclared identifier
                pl0_ast_error(factor->loc, string("use of undeclared identifier ") + "\"" + factor->ptr.id->id + "\"");
                ans = make_pair(new Value(factor->ptr.id->id, "undefined"), "");
            }
            break;
        case pl0_ast_factor::type_t::UNSIGNED:
            ans = make_pair(new Value(factor->ptr.unsignedn->val, factor->ptr.unsignedn->dt == pl0_ast_constv::INT ? "integer" : "char"), "integer");
            break;
        case pl0_ast_factor::type_t::EXPR:
            ans = pl0_tac_expr(factor->ptr.expr);
            break;
        case pl0_ast_factor::type_t::CALL_FUNC:
            ans = pl0_tac_call_func(factor->ptr.call_func);
            break;
        case pl0_ast_factor::type_t::ARRAY_E:
            // validate array identifier.
            if (vartb.find(factor->arraye.first->id, true, array)) {
                if (array.len == -1) {
                    pl0_ast_error(factor->loc, "expected an array identifier.");
                }
            }
            else {
                pl0_ast_error(factor->loc, string("use of undeclared identifier ") + "\"" + factor->arraye.first->id + "\"");
                array.name = factor->arraye.first->id; // give it a default value, although it's wrong.
            }
            // validate array index.
            idx = pl0_tac_expr(factor->arraye.second).first;
            t = new Value(irb.maketmp()+"#"+array.name+"#"+idx->value()+"#", array.dt);
            irb.emit("=[]", t, new Value(array.name, array.dt), idx);
            ans = make_pair(t, array.type.substr(0, array.type.length()-5));
            break;
        default:
            pl0_ast_error(factor->loc, "undefined syntax");
            ans = make_pair(new Value("^^^^^", "undefined"), "");
            cout << "UNIMPLEMENT EXPRESSION" << endl;
            break;
    }
    return ans;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x8d0, %rsp            # imm = 0x8D0
movq %rdi, -0x7b0(%rbp)
movq %rdi, %rax
movq %rax, -0x7b8(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq 0xa3fed(%rip), %rdi     # 0x15efd8
leaq 0x36c3d(%rip), %rsi     # 0xf1c2f
callq 0x5330
movq -0x7b0(%rbp), %rdi
movb $0x0, -0x11(%rbp)
callq 0xc03e0
leaq -0x68(%rbp), %rdi
callq 0xc0410
jmp 0xbb012
leaq -0xe0(%rbp), %rdi
callq 0xbf1b0
jmp 0xbb020
leaq -0x148(%rbp), %rdi
callq 0xbf1b0
jmp 0xbb02e
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
decl %eax
movl %eax, %ecx
movq %rcx, -0x7c0(%rbp)
subl $0x4, %eax
ja 0xbc243
movq -0x7c0(%rbp), %rax
leaq 0x35ff5(%rip), %rcx     # 0xf104c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc529
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc502
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc4f6
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
addq $0x8, %rsi
leaq 0xa56a2(%rip), %rdi     # 0x160748
callq 0xc04e0
movl %eax, -0x7c4(%rbp)
jmp 0xbb0b3
movl -0x7c4(%rbp), %eax
movl %eax, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
addq $0x8, %rsi
leaq 0xa5649(%rip), %rdi     # 0x160718
callq 0xbf460
movl %eax, -0x7c8(%rbp)
jmp 0xbb0dc
movl -0x7c8(%rbp), %eax
movl %eax, -0x1c(%rbp)
movl -0x18(%rbp), %eax
cmpl -0x1c(%rbp), %eax
jle 0xbb236
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
addq $0x8, %rsi
leaq 0xa5644(%rip), %rdi     # 0x160748
movl $0x1, %edx
leaq -0x68(%rbp), %rcx
callq 0xc0690
jmp 0xbb114
movl $0x48, %edi
callq 0x5340
movq %rax, -0x7d0(%rbp)
jmp 0xbb127
movb $0x1, -0x191(%rbp)
movl -0x48(%rbp), %eax
movl %eax, -0x7d4(%rbp)
leaq -0x40(%rbp), %rsi
leaq -0x190(%rbp), %rdi
callq 0x5150
jmp 0xbb149
movl -0x7d4(%rbp), %esi
movq -0x7d0(%rbp), %rdi
leaq -0x190(%rbp), %rdx
callq 0xbdfe0
jmp 0xbb164
movq -0x7d0(%rbp), %rax
movb $0x0, -0x191(%rbp)
movq %rax, -0x170(%rbp)
leaq 0x340c7(%rip), %rsi     # 0xef247
leaq -0x170(%rbp), %rdi
callq 0xc0850
movq %rdx, -0x7e8(%rbp)
movq %rax, -0x7e0(%rbp)
jmp 0xbb19c
movq -0x7b0(%rbp), %rdi
movq -0x7e8(%rbp), %rax
movq -0x7e0(%rbp), %rcx
movq %rcx, -0x168(%rbp)
movq %rax, -0x160(%rbp)
leaq -0x168(%rbp), %rsi
callq 0xc0890
jmp 0xbb1cd
leaq -0x190(%rbp), %rdi
callq 0x5200
jmp 0xbb903
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc4ea
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb215
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x190(%rbp), %rdi
callq 0x5200
testb $0x1, -0x191(%rbp)
jne 0xbb220
jmp 0xbb231
movq -0x7d0(%rbp), %rdi
movl $0x48, %esi
callq 0x5350
jmp 0xbc4ea
movl -0x1c(%rbp), %eax
cmpl -0x18(%rbp), %eax
jle 0xbb617
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
addq $0x8, %rsi
leaq 0xa54c3(%rip), %rdi     # 0x160718
movl $0x1, %edx
leaq -0xe0(%rbp), %rcx
callq 0xbf8a0
jmp 0xbb268
leaq -0xe0(%rbp), %rdi
addq $0x40, %rdi
callq 0x54e0
movq %rax, %rcx
movb $0x0, -0x1b9(%rbp)
xorl %eax, %eax
cmpq $0x5, %rcx
movb %al, -0x7e9(%rbp)
jb 0xbb2de
leaq -0xa0(%rbp), %rsi
xorl %eax, %eax
movl %eax, %edx
leaq -0x1b8(%rbp), %rdi
movl $0x5, %ecx
callq 0x5380
jmp 0xbb2ae
movb $0x1, -0x1b9(%rbp)
leaq 0x35ee6(%rip), %rsi     # 0xf11a2
leaq -0x1b8(%rbp), %rdi
callq 0x2a580
movb %al, -0x7ea(%rbp)
jmp 0xbb2d0
movb -0x7ea(%rbp), %al
movb %al, -0x7e9(%rbp)
jmp 0xbb2de
movb -0x7e9(%rbp), %al
movb %al, -0x7eb(%rbp)
testb $0x1, -0x1b9(%rbp)
jne 0xbb2f5
jmp 0xbb301
leaq -0x1b8(%rbp), %rdi
callq 0x5200
movb -0x7eb(%rbp), %al
testb $0x1, %al
jne 0xbb310
jmp 0xbb4e9
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x1c8(%rbp)
leaq -0x269(%rbp), %rdi
movq %rdi, -0x7f8(%rbp)
callq 0x55d0
movq -0x7f8(%rbp), %rdx
leaq 0x35fc6(%rip), %rsi     # 0xf1305
leaq -0x268(%rbp), %rdi
callq 0x19840
jmp 0xbb34d
leaq 0x363c7(%rip), %rdx     # 0xf171b
leaq -0x248(%rbp), %rdi
leaq -0x268(%rbp), %rsi
callq 0x1a380
jmp 0xbb369
leaq -0x228(%rbp), %rdi
leaq -0x248(%rbp), %rsi
leaq -0xe0(%rbp), %rdx
callq 0x1a4d0
jmp 0xbb385
leaq 0x3638f(%rip), %rdx     # 0xf171b
leaq -0x208(%rbp), %rdi
leaq -0x228(%rbp), %rsi
callq 0x1a380
jmp 0xbb3a1
leaq 0x35f76(%rip), %rdx     # 0xf131e
leaq -0x1e8(%rbp), %rdi
leaq -0x208(%rbp), %rsi
callq 0x1a380
jmp 0xbb3bd
movq -0x1c8(%rbp), %rdi
leaq -0x1e8(%rbp), %rsi
callq 0xae910
jmp 0xbb3d2
leaq -0x1e8(%rbp), %rdi
callq 0x5200
leaq -0x208(%rbp), %rdi
callq 0x5200
leaq -0x228(%rbp), %rdi
callq 0x5200
leaq -0x248(%rbp), %rdi
callq 0x5200
leaq -0x268(%rbp), %rdi
callq 0x5200
leaq -0x269(%rbp), %rdi
callq 0x53c0
jmp 0xbb4e9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
testb $0x1, -0x1b9(%rbp)
jne 0xbb436
jmp 0xbb442
leaq -0x1b8(%rbp), %rdi
callq 0x5200
jmp 0xbc4ea
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb4d8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb4cc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb4c0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb4b4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb4a8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x1e8(%rbp), %rdi
callq 0x5200
leaq -0x208(%rbp), %rdi
callq 0x5200
leaq -0x228(%rbp), %rdi
callq 0x5200
leaq -0x248(%rbp), %rdi
callq 0x5200
leaq -0x268(%rbp), %rdi
callq 0x5200
leaq -0x269(%rbp), %rdi
callq 0x53c0
jmp 0xbc4ea
movl $0x48, %edi
callq 0x5340
movq %rax, -0x800(%rbp)
jmp 0xbb4fc
movb $0x1, -0x2e1(%rbp)
leaq -0x2c0(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
callq 0x5150
jmp 0xbb518
leaq -0xc0(%rbp), %rsi
leaq -0x2e0(%rbp), %rdi
callq 0x5150
jmp 0xbb52d
movq -0x800(%rbp), %rdi
leaq -0x2c0(%rbp), %rsi
leaq -0x2e0(%rbp), %rdx
callq 0xbeae0
jmp 0xbb549
movq -0x800(%rbp), %rax
movb $0x0, -0x2e1(%rbp)
movq %rax, -0x2a0(%rbp)
leaq -0xc0(%rbp), %rdx
leaq -0x298(%rbp), %rdi
leaq -0x2a0(%rbp), %rsi
callq 0xc08d0
jmp 0xbb57a
movq -0x7b0(%rbp), %rdi
leaq -0x298(%rbp), %rsi
callq 0xc0910
leaq -0x298(%rbp), %rdi
callq 0xbf290
leaq -0x2e0(%rbp), %rdi
callq 0x5200
leaq -0x2c0(%rbp), %rdi
callq 0x5200
jmp 0xbb901
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb5f6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb5ea
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x2e0(%rbp), %rdi
callq 0x5200
leaq -0x2c0(%rbp), %rdi
callq 0x5200
testb $0x1, -0x2e1(%rbp)
jne 0xbb601
jmp 0xbb612
movq -0x800(%rbp), %rdi
movl $0x48, %esi
callq 0x5350
jmp 0xbc4ea
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x2f0(%rbp)
leaq -0x371(%rbp), %rdi
movq %rdi, -0x808(%rbp)
callq 0x55d0
movq -0x808(%rbp), %rdx
leaq 0x35b1d(%rip), %rsi     # 0xf1163
leaq -0x370(%rbp), %rdi
callq 0x19840
jmp 0xbb654
leaq 0x360c0(%rip), %rdx     # 0xf171b
leaq -0x350(%rbp), %rdi
leaq -0x370(%rbp), %rsi
callq 0x1a380
jmp 0xbb670
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdx
addq $0x8, %rdx
leaq -0x330(%rbp), %rdi
leaq -0x350(%rbp), %rsi
callq 0x1a4d0
jmp 0xbb691
leaq 0x36083(%rip), %rdx     # 0xf171b
leaq -0x310(%rbp), %rdi
leaq -0x330(%rbp), %rsi
callq 0x1a380
jmp 0xbb6ad
movq -0x2f0(%rbp), %rdi
leaq -0x310(%rbp), %rsi
callq 0xae910
jmp 0xbb6c2
leaq -0x310(%rbp), %rdi
callq 0x5200
leaq -0x330(%rbp), %rdi
callq 0x5200
leaq -0x350(%rbp), %rdi
callq 0x5200
leaq -0x370(%rbp), %rdi
callq 0x5200
leaq -0x371(%rbp), %rdi
callq 0x53c0
movl $0x48, %edi
callq 0x5340
movq %rax, -0x810(%rbp)
jmp 0xbb711
movb $0x1, -0x3d2(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
addq $0x8, %rsi
leaq -0x3b0(%rbp), %rdi
callq 0x5150
jmp 0xbb732
leaq -0x3d1(%rbp), %rdi
movq %rdi, -0x818(%rbp)
callq 0x55d0
movq -0x818(%rbp), %rdx
leaq 0x35bd9(%rip), %rsi     # 0xf132c
leaq -0x3d0(%rbp), %rdi
callq 0x19840
jmp 0xbb761
movq -0x810(%rbp), %rdi
leaq -0x3b0(%rbp), %rsi
leaq -0x3d0(%rbp), %rdx
callq 0xbeae0
jmp 0xbb77d
movq -0x810(%rbp), %rax
movb $0x0, -0x3d2(%rbp)
movq %rax, -0x390(%rbp)
leaq 0x36496(%rip), %rsi     # 0xf1c2f
leaq -0x390(%rbp), %rdi
callq 0xc0950
movq %rdx, -0x828(%rbp)
movq %rax, -0x820(%rbp)
jmp 0xbb7b5
movq -0x7b0(%rbp), %rdi
movq -0x828(%rbp), %rax
movq -0x820(%rbp), %rcx
movq %rcx, -0x388(%rbp)
movq %rax, -0x380(%rbp)
leaq -0x388(%rbp), %rsi
callq 0xc0890
jmp 0xbb7e6
leaq -0x3d0(%rbp), %rdi
callq 0x5200
leaq -0x3d1(%rbp), %rdi
callq 0x53c0
leaq -0x3b0(%rbp), %rdi
callq 0x5200
jmp 0xbb901
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb883
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb877
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb86b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb85f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x310(%rbp), %rdi
callq 0x5200
leaq -0x330(%rbp), %rdi
callq 0x5200
leaq -0x350(%rbp), %rdi
callq 0x5200
leaq -0x370(%rbp), %rdi
callq 0x5200
leaq -0x371(%rbp), %rdi
callq 0x53c0
jmp 0xbc4ea
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb8e0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbb8c8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x3d0(%rbp), %rdi
callq 0x5200
leaq -0x3d1(%rbp), %rdi
callq 0x53c0
leaq -0x3b0(%rbp), %rdi
callq 0x5200
testb $0x1, -0x3d2(%rbp)
jne 0xbb8eb
jmp 0xbb8fc
movq -0x810(%rbp), %rdi
movl $0x48, %esi
callq 0x5350
jmp 0xbc4ea
jmp 0xbb903
jmp 0xbc4bd
movl $0x48, %edi
callq 0x5340
movq %rax, -0x830(%rbp)
jmp 0xbb91b
movb $0x1, -0x412(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movl 0x8(%rax), %ecx
movl %ecx, -0x844(%rbp)
movl 0xc(%rax), %eax
testl %eax, %eax
leaq 0x33908(%rip), %rcx     # 0xef247
leaq 0x34639(%rip), %rax     # 0xeff7f
cmoveq %rcx, %rax
movq %rax, -0x840(%rbp)
leaq -0x411(%rbp), %rdi
movq %rdi, -0x838(%rbp)
callq 0x55d0
movq -0x840(%rbp), %rsi
movq -0x838(%rbp), %rdx
leaq -0x410(%rbp), %rdi
callq 0x19840
jmp 0xbb980
movl -0x844(%rbp), %esi
movq -0x830(%rbp), %rdi
leaq -0x410(%rbp), %rdx
callq 0xbdfe0
jmp 0xbb99b
movq -0x830(%rbp), %rax
movb $0x0, -0x412(%rbp)
movq %rax, -0x3f0(%rbp)
leaq 0x33890(%rip), %rsi     # 0xef247
leaq -0x3f0(%rbp), %rdi
callq 0xc0850
movq %rdx, -0x858(%rbp)
movq %rax, -0x850(%rbp)
jmp 0xbb9d3
movq -0x7b0(%rbp), %rdi
movq -0x858(%rbp), %rax
movq -0x850(%rbp), %rcx
movq %rcx, -0x3e8(%rbp)
movq %rax, -0x3e0(%rbp)
leaq -0x3e8(%rbp), %rsi
callq 0xc0890
jmp 0xbba04
leaq -0x410(%rbp), %rdi
callq 0x5200
leaq -0x411(%rbp), %rdi
callq 0x53c0
jmp 0xbc4bd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbba47
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x410(%rbp), %rdi
callq 0x5200
leaq -0x411(%rbp), %rdi
callq 0x53c0
testb $0x1, -0x412(%rbp)
jne 0xbba5e
jmp 0xbba6f
movq -0x830(%rbp), %rdi
movl $0x48, %esi
callq 0x5350
jmp 0xbc4ea
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
leaq -0x440(%rbp), %rdi
callq 0xba600
jmp 0xbba8a
movq -0x7b0(%rbp), %rdi
leaq -0x440(%rbp), %rsi
callq 0xc0910
leaq -0x440(%rbp), %rdi
callq 0xbf290
jmp 0xbc4bd
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
leaq -0x468(%rbp), %rdi
callq 0xbc540
jmp 0xbbac4
movq -0x7b0(%rbp), %rdi
leaq -0x468(%rbp), %rsi
callq 0xc0910
leaq -0x468(%rbp), %rdi
callq 0xbf290
jmp 0xbc4bd
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
addq $0x8, %rsi
leaq 0xa4c1d(%rip), %rdi     # 0x160718
movl $0x1, %edx
leaq -0x148(%rbp), %rcx
callq 0xbf8a0
movb %al, -0x859(%rbp)
jmp 0xbbb14
movb -0x859(%rbp), %al
testb $0x1, %al
jne 0xbbb23
jmp 0xbbbd8
cmpl $-0x1, -0xe8(%rbp)
jne 0xbbbd3
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x470(%rbp)
leaq -0x491(%rbp), %rdi
movq %rdi, -0x868(%rbp)
callq 0x55d0
movq -0x868(%rbp), %rdx
leaq 0x357d7(%rip), %rsi     # 0xf1336
leaq -0x490(%rbp), %rdi
callq 0x19840
jmp 0xbbb6d
movq -0x470(%rbp), %rdi
leaq -0x490(%rbp), %rsi
callq 0xae910
jmp 0xbbb82
leaq -0x490(%rbp), %rdi
callq 0x5200
leaq -0x491(%rbp), %rdi
callq 0x53c0
jmp 0xbbbd3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbbbc2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x490(%rbp), %rdi
callq 0x5200
leaq -0x491(%rbp), %rdi
callq 0x53c0
jmp 0xbc4ea
jmp 0xbbd63
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x4a0(%rbp)
leaq -0x521(%rbp), %rdi
movq %rdi, -0x870(%rbp)
callq 0x55d0
movq -0x870(%rbp), %rdx
leaq 0x3555c(%rip), %rsi     # 0xf1163
leaq -0x520(%rbp), %rdi
callq 0x19840
jmp 0xbbc15
leaq 0x35aff(%rip), %rdx     # 0xf171b
leaq -0x500(%rbp), %rdi
leaq -0x520(%rbp), %rsi
callq 0x1a380
jmp 0xbbc31
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdx
addq $0x8, %rdx
leaq -0x4e0(%rbp), %rdi
leaq -0x500(%rbp), %rsi
callq 0x1a4d0
jmp 0xbbc52
leaq 0x35ac2(%rip), %rdx     # 0xf171b
leaq -0x4c0(%rbp), %rdi
leaq -0x4e0(%rbp), %rsi
callq 0x1a380
jmp 0xbbc6e
movq -0x4a0(%rbp), %rdi
leaq -0x4c0(%rbp), %rsi
callq 0xae910
jmp 0xbbc83
leaq -0x4c0(%rbp), %rdi
callq 0x5200
leaq -0x4e0(%rbp), %rdi
callq 0x5200
leaq -0x500(%rbp), %rdi
callq 0x5200
leaq -0x520(%rbp), %rdi
callq 0x5200
leaq -0x521(%rbp), %rdi
callq 0x53c0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
addq $0x8, %rsi
leaq -0x148(%rbp), %rdi
callq 0x5050
jmp 0xbbcd9
jmp 0xbbd63
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbbd52
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbbd46
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbbd3a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbbd2e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x4c0(%rbp), %rdi
callq 0x5200
leaq -0x4e0(%rbp), %rdi
callq 0x5200
leaq -0x500(%rbp), %rdi
callq 0x5200
leaq -0x520(%rbp), %rdi
callq 0x5200
leaq -0x521(%rbp), %rdi
callq 0x53c0
jmp 0xbc4ea
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
leaq -0x550(%rbp), %rdi
callq 0xba600
jmp 0xbbd79
movq -0x550(%rbp), %rax
movq %rax, -0x150(%rbp)
leaq -0x550(%rbp), %rdi
callq 0xbf290
movl $0x48, %edi
callq 0x5340
movq %rax, -0x878(%rbp)
jmp 0xbbda6
movb $0x1, -0x651(%rbp)
leaq 0xa491c(%rip), %rsi     # 0x1606d0
leaq -0x610(%rbp), %rdi
callq 0xa0200
jmp 0xbbdc2
leaq 0x3558b(%rip), %rdx     # 0xf1354
leaq -0x5f0(%rbp), %rdi
leaq -0x610(%rbp), %rsi
callq 0x458c0
jmp 0xbbdde
leaq -0x5d0(%rbp), %rdi
leaq -0x5f0(%rbp), %rsi
leaq -0x148(%rbp), %rdx
callq 0x1a4d0
jmp 0xbbdfa
leaq 0x35553(%rip), %rdx     # 0xf1354
leaq -0x5b0(%rbp), %rdi
leaq -0x5d0(%rbp), %rsi
callq 0x1a380
jmp 0xbbe16
movq -0x150(%rbp), %rsi
leaq -0x630(%rbp), %rdi
callq 0xc0990
jmp 0xbbe2b
leaq -0x590(%rbp), %rdi
leaq -0x5b0(%rbp), %rsi
leaq -0x630(%rbp), %rdx
callq 0x1a3d0
jmp 0xbbe47
leaq 0x35506(%rip), %rdx     # 0xf1354
leaq -0x570(%rbp), %rdi
leaq -0x590(%rbp), %rsi
callq 0x1a380
jmp 0xbbe63
leaq -0x128(%rbp), %rsi
leaq -0x650(%rbp), %rdi
callq 0x5150
jmp 0xbbe78
movq -0x878(%rbp), %rdi
leaq -0x570(%rbp), %rsi
leaq -0x650(%rbp), %rdx
callq 0xbeae0
jmp 0xbbe94
movq -0x878(%rbp), %rax
movb $0x0, -0x651(%rbp)
movq %rax, -0x158(%rbp)
leaq -0x650(%rbp), %rdi
callq 0x5200
leaq -0x570(%rbp), %rdi
callq 0x5200
leaq -0x590(%rbp), %rdi
callq 0x5200
leaq -0x630(%rbp), %rdi
callq 0x5200
leaq -0x5b0(%rbp), %rdi
callq 0x5200
leaq -0x5d0(%rbp), %rdi
callq 0x5200
leaq -0x5f0(%rbp), %rdi
callq 0x5200
leaq -0x610(%rbp), %rdi
callq 0x5200
leaq -0x679(%rbp), %rdi
movq %rdi, -0x880(%rbp)
callq 0x55d0
movq -0x880(%rbp), %rdx
leaq 0x3542c(%rip), %rsi     # 0xf1356
leaq -0x678(%rbp), %rdi
callq 0x19840
jmp 0xbbf38
movq -0x158(%rbp), %rax
movq %rax, -0x890(%rbp)
movl $0x48, %edi
callq 0x5340
movq %rax, -0x888(%rbp)
jmp 0xbbf59
movb $0x1, -0x6c1(%rbp)
leaq -0x6a0(%rbp), %rdi
leaq -0x148(%rbp), %rsi
callq 0x5150
jmp 0xbbf75
leaq -0x128(%rbp), %rsi
leaq -0x6c0(%rbp), %rdi
callq 0x5150
jmp 0xbbf8a
movq -0x888(%rbp), %rdi
leaq -0x6a0(%rbp), %rsi
leaq -0x6c0(%rbp), %rdx
callq 0xbeae0
jmp 0xbbfa6
movq -0x888(%rbp), %rcx
movq -0x890(%rbp), %rdx
movb $0x0, -0x6c1(%rbp)
movq -0x150(%rbp), %r8
leaq 0xa4707(%rip), %rdi     # 0x1606d0
leaq -0x678(%rbp), %rsi
callq 0xbdf00
jmp 0xbbfd7
leaq -0x6c0(%rbp), %rdi
callq 0x5200
leaq -0x6a0(%rbp), %rdi
callq 0x5200
leaq -0x678(%rbp), %rdi
callq 0x5200
leaq -0x679(%rbp), %rdi
callq 0x53c0
leaq -0x108(%rbp), %rdi
movq %rdi, -0x898(%rbp)
callq 0x54e0
movq -0x898(%rbp), %rsi
movq %rax, %rcx
addq $-0x5, %rcx
xorl %eax, %eax
movl %eax, %edx
leaq -0x710(%rbp), %rdi
callq 0x5380
jmp 0xbc03a
leaq -0x6f0(%rbp), %rdi
leaq -0x158(%rbp), %rsi
leaq -0x710(%rbp), %rdx
callq 0xc09f0
jmp 0xbc056
movq -0x7b0(%rbp), %rdi
leaq -0x6f0(%rbp), %rsi
callq 0xc0910
leaq -0x6f0(%rbp), %rdi
callq 0xbf290
leaq -0x710(%rbp), %rdi
callq 0x5200
jmp 0xbc4bd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc16e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc156
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc14a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc13e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc132
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc126
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc11a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x650(%rbp), %rdi
callq 0x5200
leaq -0x570(%rbp), %rdi
callq 0x5200
leaq -0x590(%rbp), %rdi
callq 0x5200
leaq -0x630(%rbp), %rdi
callq 0x5200
leaq -0x5b0(%rbp), %rdi
callq 0x5200
leaq -0x5d0(%rbp), %rdi
callq 0x5200
leaq -0x5f0(%rbp), %rdi
callq 0x5200
leaq -0x610(%rbp), %rdi
callq 0x5200
testb $0x1, -0x651(%rbp)
jne 0xbc179
jmp 0xbc18a
movq -0x878(%rbp), %rdi
movl $0x48, %esi
callq 0x5350
jmp 0xbc4ea
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc215
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc209
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc1eb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc1df
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x6c0(%rbp), %rdi
callq 0x5200
leaq -0x6a0(%rbp), %rdi
callq 0x5200
testb $0x1, -0x6c1(%rbp)
jne 0xbc1f6
jmp 0xbc207
movq -0x888(%rbp), %rdi
movl $0x48, %esi
callq 0x5350
jmp 0xbc209
leaq -0x678(%rbp), %rdi
callq 0x5200
leaq -0x679(%rbp), %rdi
callq 0x53c0
jmp 0xbc4ea
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x710(%rbp), %rdi
callq 0x5200
jmp 0xbc4ea
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x718(%rbp)
leaq -0x739(%rbp), %rdi
movq %rdi, -0x8a0(%rbp)
callq 0x55d0
movq -0x8a0(%rbp), %rdx
leaq 0x350e8(%rip), %rsi     # 0xf135a
leaq -0x738(%rbp), %rdi
callq 0x19840
jmp 0xbc280
movq -0x718(%rbp), %rdi
leaq -0x738(%rbp), %rsi
callq 0xae910
jmp 0xbc295
leaq -0x738(%rbp), %rdi
callq 0x5200
leaq -0x739(%rbp), %rdi
callq 0x53c0
movl $0x48, %edi
callq 0x5340
movq %rax, -0x8a8(%rbp)
jmp 0xbc2c0
movb $0x1, -0x7a2(%rbp)
leaq -0x779(%rbp), %rdi
movq %rdi, -0x8b0(%rbp)
callq 0x55d0
movq -0x8b0(%rbp), %rdx
leaq 0x35083(%rip), %rsi     # 0xf136b
leaq -0x778(%rbp), %rdi
callq 0x19840
jmp 0xbc2f6
leaq -0x7a1(%rbp), %rdi
movq %rdi, -0x8b8(%rbp)
callq 0x55d0
movq -0x8b8(%rbp), %rdx
leaq 0x35015(%rip), %rsi     # 0xf132c
leaq -0x7a0(%rbp), %rdi
callq 0x19840
jmp 0xbc325
movq -0x8a8(%rbp), %rdi
leaq -0x778(%rbp), %rsi
leaq -0x7a0(%rbp), %rdx
callq 0xbeae0
jmp 0xbc341
movq -0x8a8(%rbp), %rax
movb $0x0, -0x7a2(%rbp)
movq %rax, -0x758(%rbp)
leaq 0x358d2(%rip), %rsi     # 0xf1c2f
leaq -0x758(%rbp), %rdi
callq 0xc0950
movq %rdx, -0x8c8(%rbp)
movq %rax, -0x8c0(%rbp)
jmp 0xbc379
movq -0x7b0(%rbp), %rdi
movq -0x8c8(%rbp), %rax
movq -0x8c0(%rbp), %rcx
movq %rcx, -0x750(%rbp)
movq %rax, -0x748(%rbp)
leaq -0x750(%rbp), %rsi
callq 0xc0890
jmp 0xbc3aa
leaq -0x7a0(%rbp), %rdi
callq 0x5200
leaq -0x7a1(%rbp), %rdi
callq 0x53c0
leaq -0x778(%rbp), %rdi
callq 0x5200
leaq -0x779(%rbp), %rdi
callq 0x53c0
movq 0xa2bf7(%rip), %rdi     # 0x15efd8
leaq 0x34f89(%rip), %rsi     # 0xf1371
callq 0x5330
movq %rax, -0x8d0(%rbp)
jmp 0xbc3f6
movq -0x8d0(%rbp), %rdi
movq 0xa2bbc(%rip), %rsi     # 0x15efc0
callq 0x53a0
jmp 0xbc40b
jmp 0xbc4bd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc436
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x738(%rbp), %rdi
callq 0x5200
leaq -0x739(%rbp), %rdi
callq 0x53c0
jmp 0xbc4ea
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc493
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0xbc47b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x7a0(%rbp), %rdi
callq 0x5200
leaq -0x7a1(%rbp), %rdi
callq 0x53c0
leaq -0x778(%rbp), %rdi
callq 0x5200
leaq -0x779(%rbp), %rdi
callq 0x53c0
testb $0x1, -0x7a2(%rbp)
jne 0xbc4aa
jmp 0xbc4bb
movq -0x8a8(%rbp), %rdi
movl $0x48, %esi
callq 0x5350
jmp 0xbc4ea
movb $0x1, -0x11(%rbp)
leaq -0x148(%rbp), %rdi
callq 0xbeaa0
leaq -0xe0(%rbp), %rdi
callq 0xbeaa0
leaq -0x68(%rbp), %rdi
callq 0xbe980
testb $0x1, -0x11(%rbp)
jne 0xbc519
jmp 0xbc50d
leaq -0x148(%rbp), %rdi
callq 0xbeaa0
leaq -0xe0(%rbp), %rdi
callq 0xbeaa0
leaq -0x68(%rbp), %rdi
callq 0xbe980
jmp 0xbc529
movq -0x7b0(%rbp), %rdi
callq 0xbf290
movq -0x7b8(%rbp), %rax
addq $0x8d0, %rsp            # imm = 0x8D0
popq %rbp
retq
movq -0x7b0(%rbp), %rdi
callq 0xbf290
movq -0x70(%rbp), %rdi
callq 0x55b0
nop