// File: /workspace/github_cpp_makefile_star2_O2/cphinton42[P]hinton-language/src/parse.cpp
// Function: parse_expr(Parsing_Context*, Token**, unsigned int)
internal Expr_AST* parse_expr(Parsing_Context *ctx, Token **current_ptr, u32 precedence = 7)
{
    Token *current = *current_ptr;
    Token *start_section = current;
    defer {
        *current_ptr = current;
    };
    
    Expr_AST *lhs = parse_base_expr(ctx, &current, precedence);
    if(!lhs)
    {
        return nullptr;
    }
    
    while(true)
    {
        Binary_Operator op;
        bool found_op;
        u32 rhs_precedence;
        
        switch(precedence)
        {
            case 7:
            if(current->type == Token_Type::lor)
            {
                op = Binary_Operator::lor;
                found_op = true;
                rhs_precedence = 6;
                break;
            }
            case 6:
            if(current->type == Token_Type::land)
            {
                op = Binary_Operator::land;
                found_op = true;
                rhs_precedence = 5;
                break;
            }
            case 5:
            if(current->type == Token_Type::double_equal)
            {
                op = Binary_Operator::cmp_eq;
                found_op = true;
                rhs_precedence = 4;
                break;
            }
            if(current->type == Token_Type::not_equal)
            {
                op = Binary_Operator::cmp_neq;
                found_op = true;
                rhs_precedence = 4;
                break;
            }
            case 4:
            if(current->type == Token_Type::lt)
            {
                op = Binary_Operator::cmp_lt;
                found_op = true;
                rhs_precedence = 3;
                break;
            }
            if(current->type == Token_Type::le)
            {
                op = Binary_Operator::cmp_le;
                found_op = true;
                rhs_precedence = 3;
                break;
            }
            if(current->type == Token_Type::gt)
            {
                op = Binary_Operator::cmp_gt;
                found_op = true;
                rhs_precedence = 3;
                break;
            }
            if(current->type == Token_Type::ge)
            {
                op = Binary_Operator::cmp_ge;
                found_op = true;
                rhs_precedence = 3;
                break;
            }
            case 3:
            if(current->type == Token_Type::add)
            {
                op = Binary_Operator::add;
                found_op = true;
                rhs_precedence = 2;
                break;
            }
            if(current->type == Token_Type::sub)
            {
                op = Binary_Operator::sub;
                found_op = true;
                rhs_precedence = 2;
                break;
            }
            case 2:
            if(current->type == Token_Type::mul)
            {
                op = Binary_Operator::mul;
                found_op = true;
                rhs_precedence = 1;
                break;
            }
            if(current->type == Token_Type::div)
            {
                op = Binary_Operator::div;
                found_op = true;
                rhs_precedence = 1;
                break;
            }
            case 1:
            if(current->type == Token_Type::open_paren)
            {
                ++current;
                
                Dynamic_Array<Expr_AST*> args = {0};
                
                if(current->type != Token_Type::eof && current->type != Token_Type::close_paren)
                {
                    Expr_AST *first_expr = parse_expr(ctx, &current);
                    if(!first_expr)
                    {
                        return nullptr;
                    }
                    array_add(&args, first_expr);
                }
                
                while(current->type != Token_Type::eof && current->type != Token_Type::close_paren)
                {
                    if(current->type != Token_Type::comma)
                    {
                        report_error(ctx, start_section, current, "Expected ','");
                        return nullptr;
                    }
                    ++current;
                    
                    Expr_AST *expr = parse_expr(ctx, &current);
                    if(!expr)
                    {
                        return nullptr;
                    }
                    array_add(&args, expr);
                }
                if(current->type != Token_Type::close_paren)
                {
                    report_error(ctx, start_section, current, "Expected ')'");
                    return nullptr;
                }
                ++current;
                
                Function_Call_AST *call_ast = construct_ast(ctx->ast_pool, Function_Call_AST, lhs->line_number, lhs->line_offset);
                call_ast->types_count = 0;
                call_ast->resolved_type = nullptr;
                call_ast->function = lhs;
                call_ast->args.count = args.count;
                call_ast->args.data = pool_alloc(Expr_AST*, args.count, ctx->ast_pool);
                
                for(u64 i = 0; i < args.count; ++i)
                {
                    call_ast->args[i] = args[i];
                }
                
                // TODO memory leak
                lhs = call_ast;
                
                continue;
            }
            if(current->type == Token_Type::open_sqr)
            {
                op = Binary_Operator::subscript;
                
                ++current;
                Expr_AST *rhs = parse_expr(ctx, &current);
                if(rhs)
                {
                    if(current->type == Token_Type::close_sqr)
                    {
                        ++current;
                        
                        Binary_Operator_AST *result = construct_ast(ctx->ast_pool, Binary_Operator_AST, lhs->line_number, lhs->line_offset);
                        result->types_count = 0;
                        result->resolved_type = nullptr;
                        result->op = op;
                        result->lhs = lhs;
                        result->rhs = rhs;
                        
                        lhs = result;
                        
                        continue;
                    }
                    else
                    {
                        report_error(ctx, start_section, current, "Expected ']'");
                        return nullptr;
                    }
                }
                else
                {
                    return nullptr;
                }
                
                break;
            }
            if(current->type == Token_Type::dot)
            {
                ++current;
                if(current->type == Token_Type::ident)
                {
                    Access_AST *result = construct_ast(ctx->ast_pool, Access_AST, lhs->line_number, lhs->line_offset);
                    result->types_count = 0;
                    result->resolved_type = nullptr;
                    result->lhs = lhs;
                    result->ident = current->contents;
                    ++current;
                    
                    lhs = result;
                    
                    continue;
                }
                else
                {
                    report_error(ctx, start_section, current, "Expected identifier");
                    return nullptr;
                }
                
                break;
            }
            case 0:
            found_op = false;
            break;
            default: {
                assert(false);
            } break;
        }
        
        if(found_op)
        {
            ++current;
            Expr_AST *rhs = parse_expr(ctx, &current, rhs_precedence);
            if(rhs)
            {
                Binary_Operator_AST *result = construct_ast(ctx->ast_pool, Binary_Operator_AST, lhs->line_number, lhs->line_offset);
                result->types_count = 0;
                result->resolved_type = nullptr;
                result->op = op;
                result->lhs = lhs;
                result->rhs = rhs;
                
                lhs = result;
            }
            else
            {
                return nullptr;
            }
        }
        else
        {
            return lhs;
        }
    }
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x98, %rsp
movq %rdi, %r14
movq %rsi, 0x60(%rsp)
movq (%rsi), %r12
movq %r12, 0x20(%rsp)
movq %r12, 0x18(%rsp)
movq (%r12), %rax
cmpq $0x39, %rax
ja 0xb1fb
movl %edx, %r15d
leaq 0x3471(%rip), %rcx      # 0xe580
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
movq %r14, 0x28(%rsp)
jmpq *%rax
movl $0x81, %ebx
jmp 0xb49e
pushq $0x34
jmp 0xb49d
pushq $0x2c
jmp 0xb49d
movl $0x100, %ebx            # imm = 0x100
jmp 0xb49e
pushq $0x33
jmp 0xb49d
pushq $0x29
jmp 0xb49d
movq 0x20(%r14), %rdi
pushq $0x40
popq %rsi
callq 0x7fa2
movq %rax, %rbp
movq 0x18(%rsp), %rax
movl $0x12, (%rbp)
movl 0x9a0a(%rip), %ecx      # 0x14b78
leal 0x1(%rcx), %edx
movl %edx, 0x9a01(%rip)      # 0x14b78
movl %ecx, 0x4(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rbp)
leaq 0x10(%rax), %rcx
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rbp)
movups 0x10(%rax), %xmm0
movups %xmm0, 0x20(%rbp)
movq 0x20(%rbp), %rbx
movq 0x28(%rbp), %r14
xorl %esi, %esi
xorl %edx, %edx
xorl %edi, %edi
cmpq %rbx, %rdi
jae 0xbb45
xorl %r8d, %r8d
cmpb $0x5c, (%r14,%rdi)
sete %r8b
orb %r8b, %dl
incq %rsi
addq %r8, %rdi
incq %rdi
jmp 0xb1a3
xorl %ebx, %ebx
jmp 0xb3a9
xorl %r14d, %r14d
jmp 0xb93c
pushq $0x31
jmp 0xb49d
pushq $0x1
jmp 0xb93a
pushq $0x4
jmp 0xb93a
movl $0x83, %ebx
jmp 0xb49e
xorl %ebx, %ebx
jmp 0xb49e
leaq 0x49f6(%rip), %rcx      # 0xfbf8
movq %r14, %rdi
movq %r12, %rsi
movq %r12, %rdx
callq 0x7bb9
jmp 0xbd7a
movq 0x20(%r14), %rdi
pushq $0x40
popq %rsi
callq 0x7fa2
movq %rax, %rbp
movq 0x18(%rsp), %rax
movups 0x10(%rax), %xmm0
movaps %xmm0, 0x30(%rsp)
movl 0x9940(%rip), %ecx      # 0x14b78
leal 0x1(%rcx), %edx
movl %edx, 0x9937(%rip)      # 0x14b78
movq 0x8(%rax), %rax
movl $0x7, (%rbp)
movl %ecx, 0x4(%rbp)
movq %rax, 0x8(%rbp)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rbp)
movapd 0x30(%rsp), %xmm1
movupd %xmm1, 0x20(%rbp)
movups %xmm0, 0x30(%rbp)
jmp 0xbf92
movl $0x84, %ebx
jmp 0xb49e
movq 0x20(%r14), %rdi
pushq $0x38
popq %rsi
callq 0x7fa2
movq %rax, %rbp
movq 0x18(%rsp), %rcx
movsd 0x8(%rcx), %xmm0
movq 0x10(%rcx), %rax
movq 0x18(%rcx), %rcx
movl 0x98d9(%rip), %edx      # 0x14b78
leal 0x1(%rdx), %esi
movl %esi, 0x98d0(%rip)      # 0x14b78
movq %rax, %rdi
negq %rdi
pushq $0x2
popq %r8
xorl %esi, %esi
leaq (%rdi,%r8), %r9
cmpq $0x2, %r9
je 0xbbcb
movzbl -0x2(%rcx,%r8), %r9d
leal -0x30(%r9), %r10d
cmpb $0x9, %r10b
ja 0xbc8b
imulq $0xa, %rsi, %rsi
addq %r9, %rsi
addq $-0x30, %rsi
incq %r8
jmp 0xb2b4
movsd 0x8(%r12), %xmm0
movaps %xmm0, 0x50(%rsp)
leaq 0x20(%r12), %rdx
movq %rdx, 0x18(%rsp)
andq $0x0, 0x40(%rsp)
xorps %xmm0, %xmm0
movaps %xmm0, 0x30(%rsp)
cmpq $0x2c, 0x20(%r12)
jne 0xbc47
leaq 0x40(%r12), %rax
leaq 0x18(%rsp), %rbx
movq %rax, (%rbx)
pushq $0x2
popq %rbp
leaq 0x30(%rsp), %r14
movq 0x18(%rsp), %rdx
movq (%rdx), %rax
cmpq $0x2d, %rax
je 0xbda8
cmpq $0x41, %rax
je 0xbd4d
movq 0x28(%rsp), %rdi
movq %rbx, %rsi
movl %ebp, %edx
callq 0x7cf1
testq %rax, %rax
je 0xbd7a
movq 0x9802(%rip), %rdx      # 0x14b68
movq 0x9803(%rip), %rcx      # 0x14b70
movq %r14, %rdi
movq %rax, %rsi
callq 0xcb6d
jmp 0xb32b
pushq $0x2a
jmp 0xb49d
pushq $0x2b
jmp 0xb49d
pushq $0x3
jmp 0xb93a
movl $0x82, %ebx
jmp 0xb49e
pushq $0x44
jmp 0xb49d
pushq $0x43
jmp 0xb49d
movb $0x1, %bl
movq 0x20(%r14), %rdi
pushq $0x28
popq %rsi
callq 0x7fa2
movq %rax, %rbp
movq 0x18(%rsp), %rax
movl $0x13, (%rbp)
movl 0x97ae(%rip), %ecx      # 0x14b78
leal 0x1(%rcx), %edx
movl %edx, 0x97a5(%rip)      # 0x14b78
movl %ecx, 0x4(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rbp)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rbp)
movb %bl, 0x20(%rbp)
jmp 0xb4de
movsd 0x8(%r12), %xmm0
movaps %xmm0, 0x50(%rsp)
leaq 0x20(%r12), %rdx
movq %rdx, 0x18(%rsp)
andq $0x0, 0x40(%rsp)
xorps %xmm0, %xmm0
movaps %xmm0, 0x30(%rsp)
cmpq $0x2c, 0x20(%r12)
jne 0xbc53
leaq 0x40(%r12), %rax
leaq 0x18(%rsp), %r13
movq %rax, (%r13)
xorl %r14d, %r14d
pushq $0x1
popq %rbp
xorl %ebx, %ebx
movq 0x18(%rsp), %rdx
movq (%rdx), %rax
cmpq $0x2d, %rax
je 0xbe2a
cmpq $0x41, %rax
je 0xbd66
movq 0x28(%rsp), %rdi
movq %r13, %rsi
movl %ebp, %edx
callq 0x7cf1
testq %rax, %rax
je 0xbd7a
movzwl 0x2(%rax), %ecx
andl $0x4, %ecx
movl %ecx, %edx
shrl $0x2, %edx
addq %rdx, %r14
cmpq $0x1, %rcx
adcq $0x0, %rbx
movq 0x96e3(%rip), %rdx      # 0x14b68
movq 0x96e4(%rip), %rcx      # 0x14b70
leaq 0x30(%rsp), %rdi
movq %rax, %rsi
callq 0xcb6d
jmp 0xb433
pushq $0x32
popq %rbx
movq 0x20(%r14), %rdi
pushq $0x28
popq %rsi
callq 0x7fa2
movq %rax, %rbp
movq 0x18(%rsp), %rax
movl $0x11, (%rbp)
movl 0x96b9(%rip), %ecx      # 0x14b78
leal 0x1(%rcx), %edx
movl %edx, 0x96b0(%rip)      # 0x14b78
movl %ecx, 0x4(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rbp)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rbp)
movq %rbx, 0x20(%rbp)
addq $0x20, %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
movq %rax, 0x20(%rsp)
movq %r15, %rax
cmpl $0x7, %eax
ja 0xc191
decl %eax
leaq 0x3162(%rip), %r13      # 0xe668
movq %rbp, 0x50(%rsp)
movq %r12, %r15
cmpl $0x6, %eax
ja 0xb92e
movq %rax, %rbx
movslq (%r13,%rax,4), %rax
addq %r13, %rax
jmpq *%rax
movq 0x20(%rsp), %rax
movq (%rax), %rcx
jmp 0xb60f
movq 0x20(%rsp), %rax
movq (%rax), %rcx
jmp 0xb593
movq 0x20(%rsp), %rax
movq (%rax), %rcx
jmp 0xb5db
movq 0x20(%rsp), %rax
movq (%rax), %rcx
jmp 0xb5b7
movq 0x20(%rsp), %rax
movq (%rax), %rcx
jmp 0xb5f5
movq 0x20(%rsp), %rax
movq (%rax), %rcx
jmp 0xb582
movq 0x20(%rsp), %rax
movq (%rax), %rcx
pushq $0x6
popq %rdx
pushq $0xb
popq %r12
cmpq $0x35, %rcx
je 0xb88a
pushq $0x5
popq %rdx
pushq $0xc
popq %r12
cmpq $0x37, %rcx
je 0xb88a
cmpq $0x3c, %rcx
je 0xb5a9
cmpq $0x3a, %rcx
jne 0xb5b4
pushq $0x4
popq %rdx
pushq $0x1
jmp 0xb888
pushq $0x4
popq %rdx
xorl %r12d, %r12d
jmp 0xb88a
movq %r15, %r12
leaq -0x2e(%rcx), %rdx
cmpq $0x3, %rdx
ja 0xb5db
leaq 0x30bc(%rip), %rsi      # 0xe684
movslq (%rsi,%rdx,4), %rcx
addq %rsi, %rcx
jmpq *%rcx
pushq $0x3
popq %rdx
pushq $0x2
jmp 0xb888
cmpq $0x33, %rcx
je 0xb7dc
cmpq $0x34, %rcx
jne 0xb5f5
pushq $0x2
popq %rdx
pushq $0x7
jmp 0xb888
cmpq $0x32, %rcx
je 0xb7d2
cmpq $0x38, %rcx
jne 0xb60f
pushq $0x1
popq %rdx
pushq $0x9
jmp 0xb888
cmpq $0x25, %rcx
je 0xb766
cmpq $0x2a, %rcx
je 0xb6d9
cmpq $0x28, %rcx
jne 0xbd86
leaq 0x20(%rax), %rcx
andq $0x0, 0x40(%rsp)
movq %rcx, 0x20(%rsp)
xorps %xmm0, %xmm0
movaps %xmm0, 0x30(%rsp)
movq 0x20(%rax), %rax
cmpq $0x29, %rax
je 0xb688
cmpq $0x41, %rax
je 0xb688
movq %r14, %rdi
leaq 0x20(%rsp), %rsi
pushq $0x7
popq %rdx
callq 0xb0d1
testq %rax, %rax
je 0xbd84
movq 0x94f4(%rip), %rdx      # 0x14b68
movq 0x94f5(%rip), %rcx      # 0x14b70
leaq 0x30(%rsp), %rdi
movq %rax, %rsi
callq 0xd077
movq 0x20(%rsp), %rdx
movq (%rdx), %rax
cmpq $0x20, %rax
jne 0xb7e6
addq $0x20, %rdx
movq %rdx, 0x20(%rsp)
movq %r14, %rdi
leaq 0x20(%rsp), %rsi
pushq $0x7
popq %rdx
callq 0xb0d1
testq %rax, %rax
je 0xbd84
movq 0x94a5(%rip), %rdx      # 0x14b68
movq 0x94a6(%rip), %rcx      # 0x14b70
leaq 0x30(%rsp), %rdi
movq %rax, %rsi
callq 0xd077
jmp 0xb688
addq $0x20, %rax
movq %rax, 0x20(%rsp)
movq %r14, %rdi
leaq 0x20(%rsp), %rsi
pushq $0x7
popq %rdx
callq 0xb0d1
movq %rax, %r14
testq %rax, %rax
je 0xbd84
movq 0x20(%rsp), %rdx
cmpq $0x2b, (%rdx)
jne 0xbbb2
addq $0x20, %rdx
movq %rdx, 0x20(%rsp)
movq 0x28(%rsp), %rax
movq 0x20(%rax), %rdi
pushq $0x38
popq %rsi
callq 0x7fa2
movl $0xc, (%rax)
movl 0x9445(%rip), %ecx      # 0x14b78
leal 0x1(%rcx), %edx
movl %edx, 0x943c(%rip)      # 0x14b78
movl %ecx, 0x4(%rax)
movq 0x8(%rbp), %rcx
movq %rcx, 0x8(%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rax)
movq $0xa, 0x20(%rax)
movq %rbp, 0x28(%rax)
movq %r14, 0x30(%rax)
movq %rax, %rbp
jmp 0xb8f6
leaq 0x20(%rax), %rdx
movq %rdx, 0x20(%rsp)
cmpq $0x0, 0x20(%rax)
jne 0xbb9b
movq 0x20(%r14), %rdi
pushq $0x38
popq %rsi
callq 0x7fa2
movl $0xb, (%rax)
movl 0x93e6(%rip), %ecx      # 0x14b78
leal 0x1(%rcx), %edx
movl %edx, 0x93dd(%rip)      # 0x14b78
movl %ecx, 0x4(%rax)
movq 0x8(%rbp), %rcx
movq %rcx, 0x8(%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rax)
movq %rbp, 0x20(%rax)
movq 0x20(%rsp), %rcx
movups 0x10(%rcx), %xmm0
movups %xmm0, 0x28(%rax)
addq $0x20, %rcx
movq %rcx, 0x20(%rsp)
movq %rax, %rbp
movq %rbx, %rax
jmp 0xb50e
pushq $0x1
popq %rdx
pushq $0x8
jmp 0xb888
pushq $0x2
popq %rdx
pushq $0x6
jmp 0xb888
cmpq $0x29, %rax
jne 0xb908
addq $0x20, %rdx
movq %rdx, 0x20(%rsp)
movq 0x20(%r14), %rdi
pushq $0x38
popq %rsi
callq 0x7fa2
movq %r14, %rdx
movq %rax, %r14
movl $0xa, (%rax)
movl 0x9361(%rip), %eax      # 0x14b78
leal 0x1(%rax), %ecx
movl %ecx, 0x9358(%rip)      # 0x14b78
movl %eax, 0x4(%r14)
movq 0x8(%rbp), %rax
movq %rax, 0x8(%r14)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%r14)
movq %rbp, 0x20(%r14)
movq 0x30(%rsp), %rsi
movq %rsi, 0x28(%r14)
movq 0x20(%rdx), %rdi
shlq $0x3, %rsi
callq 0x7fa2
movq %rax, 0x30(%r14)
xorl %eax, %eax
cmpq 0x30(%rsp), %rax
jae 0xb903
movq 0x38(%rsp), %rcx
movq (%rcx,%rax,8), %rcx
movq 0x30(%r14), %rdx
movq %rcx, (%rdx,%rax,8)
incq %rax
jmp 0xb854
pushq $0x3
popq %rdx
pushq $0x4
jmp 0xb888
pushq $0x3
popq %rdx
pushq $0x5
jmp 0xb888
pushq $0x3
popq %rdx
pushq $0x3
popq %r12
addq $0x20, %rax
movq %rax, 0x20(%rsp)
movq %r14, %rdi
leaq 0x20(%rsp), %rsi
callq 0xb0d1
movq %rax, %r14
testq %rax, %rax
je 0xbd84
movq 0x28(%rsp), %rax
movq 0x20(%rax), %rdi
pushq $0x38
popq %rsi
callq 0x7fa2
movl $0xc, (%rax)
movl 0x92af(%rip), %ecx      # 0x14b78
leal 0x1(%rcx), %edx
movl %edx, 0x92a6(%rip)      # 0x14b78
movl %ecx, 0x4(%rax)
movq 0x8(%rbp), %rcx
movq %rcx, 0x8(%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rax)
movq %r12, 0x20(%rax)
movq %rbp, 0x28(%rax)
movq %r14, 0x30(%rax)
movq %rax, %rbp
movq %r15, %r12
movq 0x28(%rsp), %r14
movq %rbx, %rax
jmp 0xb50e
movq %r14, %rbp
jmp 0xb8f6
cmpq $0x41, %rax
jne 0xb917
leaq 0x434f(%rip), %rcx      # 0xfc64
jmp 0xb91e
leaq 0x4339(%rip), %rcx      # 0xfc57
movq %r14, %rdi
movq %r12, %rsi
callq 0x7bb9
jmp 0xbd84
movq 0x50(%rsp), %rbp
jmp 0xbd86
pushq $0x2
popq %r14
movsd 0x8(%r12), %xmm0
movaps %xmm0, 0x50(%rsp)
leaq 0x20(%r12), %rax
leaq 0x18(%rsp), %rsi
movq %rax, (%rsi)
movq 0x28(%rsp), %rdi
movl %r15d, %edx
callq 0xb0d1
movq %rax, %rbx
testq %rax, %rax
je 0xbd7a
movq 0x28(%rsp), %rax
movq 0x20(%rax), %rdi
pushq $0x30
popq %rsi
callq 0x7fa2
movq %rax, %rbp
movl $0x10, (%rax)
movl 0x91ea(%rip), %eax      # 0x14b78
leal 0x1(%rax), %ecx
movl %ecx, 0x91e1(%rip)      # 0x14b78
movl %eax, 0x4(%rbp)
movaps 0x50(%rsp), %xmm0
movlps %xmm0, 0x8(%rbp)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rbp)
movq %r14, 0x20(%rbp)
movq %rbx, 0x28(%rbp)
jmp 0xbc81
movl 0x8(%r12), %eax
movl %eax, 0x4c(%rsp)
movl 0xc(%r12), %eax
movl %eax, 0x48(%rsp)
leaq 0x20(%r12), %r13
leaq 0x18(%rsp), %rax
movq %r13, (%rax)
xorps %xmm0, %xmm0
leaq 0x30(%rsp), %rax
andq $0x0, 0x10(%rax)
movaps %xmm0, (%rax)
movq 0x20(%r12), %rax
cmpq $0x41, %rax
setne %cl
cmpq $0x29, %rax
setne %al
sete %bpl
andb %cl, %al
movq $0x0, 0x50(%rsp)
movq (%r13), %rcx
testb $0x1, %al
je 0xbbd2
testq %rcx, %rcx
je 0xba23
xorl %r14d, %r14d
xorl %ebx, %ebx
jmp 0xbaad
movq 0x20(%r13), %rax
cmpq $0x22, %rax
je 0xba43
cmpq $0x23, %rax
jne 0xbb3b
movb $0x1, %r14b
movb $0x1, %al
movq %rax, 0x50(%rsp)
jmp 0xba46
xorl %r14d, %r14d
leaq 0x40(%r13), %rax
movq %rax, 0x18(%rsp)
movq 0x28(%rsp), %rax
movq 0x20(%rax), %rdi
pushq $0x40
popq %rsi
callq 0x7fa2
movq %rax, %rbx
movups 0x10(%r13), %xmm0
movaps %xmm0, 0x80(%rsp)
movl 0x9102(%rip), %eax      # 0x14b78
leal 0x1(%rax), %ecx
movl %ecx, 0x90f9(%rip)      # 0x14b78
movq 0x8(%r13), %rcx
movl $0x7, (%rbx)
movl %eax, 0x4(%rbx)
movq %rcx, 0x8(%rbx)
xorpd %xmm1, %xmm1
movupd %xmm1, 0x10(%rbx)
movaps 0x80(%rsp), %xmm0
movups %xmm0, 0x20(%rbx)
movupd %xmm1, 0x30(%rbx)
movb $0x1, %bpl
movq 0x28(%rsp), %rdi
leaq 0x18(%rsp), %rsi
pushq $0x7
popq %rdx
callq 0xb0d1
testq %rax, %rax
je 0xbd7a
testb %r14b, %r14b
movl $0x0, %ecx
cmovneq %rax, %rcx
movl $0x0, %edx
cmovneq %rdx, %rax
movq %rbx, 0x68(%rsp)
movq %rax, 0x70(%rsp)
movq %rcx, 0x78(%rsp)
movq 0x9075(%rip), %rsi      # 0x14b68
movq 0x9076(%rip), %rdx      # 0x14b70
movq 0x78(%rsp), %rax
movq %rax, 0x10(%rsp)
movups 0x68(%rsp), %xmm0
movups %xmm0, (%rsp)
leaq 0x30(%rsp), %rdi
callq 0xd0b6
movq 0x18(%rsp), %r13
cmpq $0x20, (%r13)
sete %al
jne 0xba08
addq $0x20, %r13
movq %r13, 0x18(%rsp)
movb $0x1, %bpl
jmp 0xba08
movq %r13, 0x18(%rsp)
jmp 0xba19
testb $0x1, %dl
je 0xbc6a
movq 0x28(%rsp), %rax
movq 0x20(%rax), %rdi
callq 0x7fa2
xorl %ecx, %ecx
cmpq %rbx, %rcx
jae 0xbc73
movb (%r14,%rcx), %dl
cmpb $0x5c, %dl
jne 0xbb88
movzbl 0x1(%r14,%rcx), %edx
incq %rcx
cmpl $0x74, %edx
je 0xbb8c
cmpl $0x6e, %edx
jne 0xbb91
movb $0xa, (%rax)
jmp 0xbb93
movb %dl, (%rax)
jmp 0xbb93
movb $0x9, (%rax)
jmp 0xbb93
movb %dl, (%rax)
incq %rcx
incq %rax
jmp 0xbb5e
leaq 0x40dc(%rip), %rcx      # 0xfc7e
movq %r14, %rdi
movq %r12, %rsi
callq 0x7bb9
jmp 0xbd84
leaq 0x40b8(%rip), %rcx      # 0xfc71
movq 0x28(%rsp), %rdi
movq %r12, %rsi
callq 0x7bb9
jmp 0xbd84
xorl %edi, %edi
jmp 0xbf6e
cmpq $0x29, %rcx
movq 0x28(%rsp), %r14
jne 0xbcd8
leaq 0x20(%r13), %rax
movq %rax, 0x18(%rsp)
cmpq $0x27, 0x20(%r13)
jne 0xbeee
addq $0x40, %r13
leaq 0x18(%rsp), %rsi
movq %r13, (%rsi)
pushq $0x7
popq %rdx
movq %r14, %rdi
callq 0xb0d1
movq %rax, %r13
testq %rax, %rax
je 0xbd7a
movq 0x18(%rsp), %rdx
cmpq $0x2c, (%rdx)
jne 0xbfef
leaq 0x18(%rsp), %rsi
movq 0x28(%rsp), %rdi
callq 0xc2cb
movq %rax, %r14
testq %rax, %rax
jne 0xc012
jmp 0xbd7a
leaq 0x4089(%rip), %rcx      # 0xfcd7
jmp 0xbd59
leaq 0x407d(%rip), %rcx      # 0xfcd7
movq %r14, %rdi
movq %r12, %rsi
callq 0x7bb9
jmp 0xbd7a
movups (%rcx), %xmm0
movups %xmm0, 0x30(%rbp)
jmp 0xbc78
movq 0x18(%rsp), %rax
addq $0x20, %rax
movq %rax, 0x18(%rsp)
movq 0x28(%rsp), %r14
jmp 0xb4e7
cmpl $0x2e, %r9d
jne 0xc1b0
movsd 0x2f03(%rip), %xmm1     # 0xeba0
xorl %edi, %edi
movsd 0x2f09(%rip), %xmm2     # 0xebb0
leaq -0x1(%r8), %r9
cmpq %rax, %r9
jae 0xbf1b
movzbl -0x1(%rcx,%r8), %r9d
leal -0x30(%r9), %r10d
cmpb $0x9, %r10b
ja 0xbcf2
imulq $0xa, %rdi, %rdi
addq %r9, %rdi
addq $-0x30, %rdi
mulsd %xmm2, %xmm1
incq %r8
jmp 0xbca7
leaq 0x3f85(%rip), %rcx      # 0xfc64
movq %r14, %rdi
movq %r12, %rsi
movq %r13, %rdx
callq 0x7bb9
jmp 0xbd7a
orl $0x20, %r9d
cmpl $0x65, %r9d
jne 0xc1ee
cmpq %rax, %r8
jae 0xc1cf
movb (%rcx,%r8), %r10b
xorl %r9d, %r9d
cmpq %rax, %r8
jae 0xbd33
movzbl (%rcx,%r8), %r11d
leal -0x30(%r11), %ebx
cmpb $0x9, %bl
ja 0xbd33
imulq $0xa, %r9, %r9
addq %r11, %r9
addq $-0x30, %r9
incq %r8
jmp 0xbd10
cmpb $0x2d, %r10b
jne 0xbf07
subq $0x1, %r9
jb 0xbf1b
mulsd %xmm2, %xmm1
jmp 0xbd3d
leaq 0x3f90(%rip), %rcx      # 0xfce4
movq 0x28(%rsp), %r14
movq %r14, %rdi
movq %r12, %rsi
callq 0x7bb9
jmp 0xbd7a
leaq 0x3f77(%rip), %rcx      # 0xfce4
movq 0x28(%rsp), %rdi
movq %r12, %rsi
callq 0x7bb9
movq 0x18(%rsp), %rax
movq %rax, 0x20(%rsp)
xorl %ebp, %ebp
movq 0x20(%rsp), %rax
movq 0x60(%rsp), %rcx
movq %rax, (%rcx)
movq %rbp, %rax
addq $0x98, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
addq $0x20, %rdx
movq %rdx, 0x18(%rsp)
movq 0x28(%rsp), %r14
movq 0x20(%r14), %rdi
pushq $0x38
popq %rsi
callq 0x7fa2
movq %rax, %rbp
movl $0xe, (%rax)
movl 0x8da7(%rip), %eax      # 0x14b78
leal 0x1(%rax), %ecx
movl %ecx, 0x8d9e(%rip)      # 0x14b78
movl %eax, 0x4(%rbp)
movaps 0x50(%rsp), %xmm0
movlps %xmm0, 0x8(%rbp)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rbp)
movq 0x30(%rsp), %rsi
movq %rsi, 0x20(%rbp)
movq 0x20(%r14), %rdi
shlq $0x3, %rsi
callq 0x7fa2
movq %rax, 0x28(%rbp)
xorl %eax, %eax
cmpq 0x30(%rsp), %rax
jae 0xb4e7
movq 0x38(%rsp), %rcx
movq (%rcx,%rax,8), %rcx
movq 0x28(%rbp), %rdx
movq %rcx, (%rdx,%rax,8)
incq %rax
jmp 0xbe09
addq $0x20, %rdx
movq %rdx, 0x18(%rsp)
movq 0x28(%rsp), %r13
movq 0x20(%r13), %rdi
pushq $0x50
popq %rsi
callq 0x7fa2
movq %rax, %rbp
movl $0xf, (%rax)
movl 0x8d25(%rip), %eax      # 0x14b78
leal 0x1(%rax), %ecx
movl %ecx, 0x8d1c(%rip)      # 0x14b78
movl %eax, 0x4(%rbp)
movaps 0x50(%rsp), %xmm0
movlps %xmm0, 0x8(%rbp)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rbp)
movq %r14, 0x20(%rbp)
movq %rbx, 0x30(%rbp)
movq 0x20(%r13), %rdi
shlq $0x3, %r14
movq %r14, %rsi
callq 0x7fa2
movq %rax, 0x28(%rbp)
movq 0x20(%r13), %rdi
shlq $0x3, %rbx
movq %rbx, %rsi
callq 0x7fa2
leaq 0x28(%rbp), %rcx
movq %rbp, %rdx
addq $0x38, %rdx
movq %rax, 0x38(%rbp)
xorl %eax, %eax
xorl %esi, %esi
xorl %edi, %edi
movq %r13, %r14
cmpq 0x30(%rsp), %rax
jae 0xb4e7
movq 0x38(%rsp), %r8
movq (%r8,%rax,8), %r8
testb $0x4, 0x2(%r8)
jne 0xbed9
movq %rsi, %r9
incq %rsi
movq %rdx, %r10
jmp 0xbee2
movq %rdi, %r9
incq %rdi
movq %rcx, %r10
movq (%r10), %r10
movq %r8, (%r10,%r9,8)
incq %rax
jmp 0xbeb3
testb $0x1, %bpl
je 0xbf9d
leaq 0x3df2(%rip), %rcx      # 0xfcf1
movq %rax, %r13
jmp 0xbcdf
movsd 0x2c99(%rip), %xmm2     # 0xeba8
subq $0x1, %r9
jb 0xbf1b
mulsd %xmm2, %xmm1
jmp 0xbf0f
movq %rsi, %xmm2
movq 0x2c58(%rip), %xmm3     # 0xeb80
punpckldq %xmm3, %xmm2    # xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
movapd 0x2c5c(%rip), %xmm4     # 0xeb90
subpd %xmm4, %xmm2
movapd %xmm2, %xmm5
unpckhpd %xmm2, %xmm5            # xmm5 = xmm5[1],xmm2[1]
addsd %xmm2, %xmm5
movq %rdi, %xmm2
punpckldq %xmm3, %xmm2    # xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
subpd %xmm4, %xmm2
movapd %xmm2, %xmm3
unpckhpd %xmm2, %xmm3            # xmm3 = xmm3[1],xmm2[1]
addsd %xmm2, %xmm3
mulsd %xmm1, %xmm3
addsd %xmm5, %xmm3
movq %xmm3, %rsi
movw $0x40, %di
movw $0xd, (%rbp)
movw %di, 0x2(%rbp)
movl %edx, 0x4(%rbp)
movlps %xmm0, 0x8(%rbp)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rbp)
movq %rax, 0x20(%rbp)
movq %rcx, 0x28(%rbp)
movq %rsi, 0x30(%rbp)
addq $0x20, 0x18(%rsp)
jmp 0xb4e7
cmpq $0x1, 0x30(%rsp)
jne 0xc20d
movq 0x38(%rsp), %rax
cmpq $0x0, (%rax)
jne 0xc22c
movq 0x8(%rax), %rbp
testq %rbp, %rbp
je 0xc24b
cmpq $0x0, 0x10(%rax)
je 0xb4e7
leaq 0x3db6(%rip), %rdi      # 0xfd8d
leaq 0x3cb4(%rip), %rsi      # 0xfc92
leaq 0x3d30(%rip), %rcx      # 0xfd15
movl $0x2c5, %edx            # imm = 0x2C5
callq 0x3080
testb $0x1, 0x50(%rsp)
je 0xc00f
leaq 0x3db7(%rip), %rcx      # 0xfdb4
movq 0x28(%rsp), %rdi
movq %r12, %rsi
callq 0x7bb9
jmp 0xbd7a
xorl %r14d, %r14d
movq 0x28(%rsp), %rbp
movq 0x20(%rbp), %rdi
pushq $0x40
popq %rsi
callq 0x7fa2
movq %rax, %rbx
movl $0x8, (%rax)
movl 0x8b46(%rip), %eax      # 0x14b78
leal 0x1(%rax), %ecx
movl %ecx, 0x8b3d(%rip)      # 0x14b78
movl %eax, 0x4(%rbx)
movl 0x4c(%rsp), %eax
movl %eax, 0x8(%rbx)
movl 0x48(%rsp), %eax
movl %eax, 0xc(%rbx)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rbx)
movq 0x30(%rsp), %rsi
movq %rsi, 0x20(%rbx)
movq 0x20(%rbp), %rdi
shlq $0x3, %rsi
callq 0x7fa2
movq %rax, 0x28(%rbx)
movq $0x1, 0x30(%rbx)
movq 0x20(%rbp), %rdi
pushq $0x8
popq %rsi
callq 0x7fa2
movq %rax, 0x38(%rbx)
movq %r13, (%rax)
testq %r14, %r14
je 0xc15e
movq 0x28(%rsp), %r13
movq 0x20(%r13), %rdi
pushq $0x50
popq %rsi
callq 0x7fa2
movq %rax, %rbp
movl $0x9, (%rax)
movl 0x8ac7(%rip), %eax      # 0x14b78
leal 0x1(%rax), %ecx
movl %ecx, 0x8abe(%rip)      # 0x14b78
movl %eax, 0x4(%rbp)
movl 0x4c(%rsp), %eax
movl %eax, 0x8(%rbp)
movl 0x48(%rsp), %eax
movl %eax, 0xc(%rbp)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rbp)
movq %rbx, 0x20(%rbp)
movq %r14, 0x48(%rbp)
movq 0x30(%rsp), %rsi
movq %rsi, 0x28(%rbp)
movq 0x20(%r13), %rdi
shlq $0x3, %rsi
callq 0x7fa2
movq %rax, 0x30(%rbp)
movq 0x30(%rsp), %rsi
movq %rsi, 0x38(%rbp)
movq 0x20(%r13), %rdi
shlq $0x3, %rsi
callq 0x7fa2
movq %rax, 0x40(%rbp)
xorl %eax, %eax
xorl %ecx, %ecx
movq %r13, %r14
cmpq 0x30(%rsp), %rcx
jae 0xb4e7
movq 0x38(%rsp), %rdx
movq 0x8(%rdx,%rax), %rdx
movq 0x28(%rbx), %rsi
movq %rdx, (%rsi,%rcx,8)
movq 0x38(%rsp), %rdx
movq (%rdx,%rax), %rdx
movq 0x30(%rbp), %rsi
movq %rdx, (%rsi,%rcx,8)
movq 0x38(%rsp), %rdx
movq 0x10(%rdx,%rax), %rdx
movq 0x40(%rbp), %rsi
movq %rdx, (%rsi,%rcx,8)
incq %rcx
addq $0x18, %rax
jmp 0xc115
pushq $0x1
popq %rax
xorl %ecx, %ecx
movq 0x28(%rsp), %r14
cmpq 0x30(%rsp), %rcx
jae 0xc189
movq 0x38(%rsp), %rdx
movq (%rdx,%rax,8), %rdx
movq 0x28(%rbx), %rsi
movq %rdx, (%rsi,%rcx,8)
incq %rcx
addq $0x3, %rax
jmp 0xc168
movq %rbx, %rbp
jmp 0xb4e7
leaq 0x2b08(%rip), %rdi      # 0xeca0
leaq 0x3af3(%rip), %rsi      # 0xfc92
leaq 0x3afa(%rip), %rcx      # 0xfca0
movl $0x1b9, %edx            # imm = 0x1B9
callq 0x3080
leaq 0x3df0(%rip), %rdi      # 0xffa7
leaq 0x3ad4(%rip), %rsi      # 0xfc92
leaq 0x3df4(%rip), %rcx      # 0xffb9
movl $0x84, %edx
callq 0x3080
leaq 0x3e2c(%rip), %rdi      # 0x10002
leaq 0x3ab5(%rip), %rsi      # 0xfc92
leaq 0x3dd5(%rip), %rcx      # 0xffb9
movl $0x96, %edx
callq 0x3080
leaq 0x3de6(%rip), %rdi      # 0xffdb
leaq 0x3a96(%rip), %rsi      # 0xfc92
leaq 0x3db6(%rip), %rcx      # 0xffb9
movl $0x94, %edx
callq 0x3080
leaq 0x3aeb(%rip), %rdi      # 0xfcff
leaq 0x3a77(%rip), %rsi      # 0xfc92
leaq 0x3af3(%rip), %rcx      # 0xfd15
movl $0x2c2, %edx            # imm = 0x2C2
callq 0x3080
leaq 0x3b1e(%rip), %rdi      # 0xfd51
leaq 0x3a58(%rip), %rsi      # 0xfc92
leaq 0x3ad4(%rip), %rcx      # 0xfd15
movl $0x2c3, %edx            # imm = 0x2C3
callq 0x3080
leaq 0x3b1d(%rip), %rdi      # 0xfd6f
leaq 0x3a39(%rip), %rsi      # 0xfc92
leaq 0x3ab5(%rip), %rcx      # 0xfd15
movl $0x2c4, %edx            # imm = 0x2C4
callq 0x3080
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2b6
jmp 0xc2b6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2a6
jmp 0xc2b6
jmp 0xc2b6
jmp 0xc2b6
jmp 0xc2a6
jmp 0xc2b6
jmp 0xc2b6
jmp 0xc2b6
movq 0x18(%rsp), %rcx
movq %rcx, 0x20(%rsp)
jmp 0xc2b6
jmp 0xc2b6
jmp 0xc2b6
movq 0x20(%rsp), %rcx
movq 0x60(%rsp), %rdx
movq %rcx, (%rdx)
movq %rax, %rdi
callq 0x3100