// File: RuiDGPires[P]CrimLang/src/semantic_analiser.cpp
// Function: sc_Tracker::expression(crl::Node*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>)
void _sc_Tracker::expression(crl::Node *node, std::string annotation){
	if (annotation == "")
		annotation = expression_get_type(node);

	node->annotation = annotation;
	size_t size = node->children.size();

	for (size_t i = 0; i < size; i++){
		switch (node->get_child(i)->type){
		case crl::Node::Type::CALL:
			node->get_child(i)->annotation = annotation;
			this->func_call(node->get_child(i), annotation);
			break;
			
		case crl::Node::Type::DEC:
		case crl::Node::Type::INC:
			if (((crl::Leaf *) node->get_child(i)->get_child(0))->token.type == crl::Token::Type::IDENT){
				Context::Item item = this->context->seek(((crl::Leaf *) node->get_child(i)->get_child(0))->token.str);
				ASSERT(item.type == Context::Item::Type::VAR && item.subtype == annotation, "Identifier has not been defined: " + item.name);
				ASSERT(item._mutable, "Variable must be mutable");
			}else ASSERT(false, "Unkown type");
			break;
		case crl::Node::Type::CAST:
			{
			ASSERT(get_token(node->get_child(i)->get_child(1)).str == annotation, "Cast type must correspond to expression type");
			std::string expr_type = expression_get_type(node->get_child(i)->get_child(0));
			ASSERT(is_castable(expr_type, annotation), expr_type + " isn't castable to " + annotation);
			if (node->get_child(i)->get_child(0)->type == crl::Node::Type::CALL){
				node->get_child(i)->get_child(0)->annotation = expr_type;
				this->func_call(node->get_child(i)->get_child(0), expr_type);
				
				break;
			}
			else
				this->expression(node->get_child(i)->get_child(0), expr_type);
			}
			break;
		case crl::Node::Type::VECTOR:
			{
				Context::Item item = this->context->seek(((crl::Leaf *) node->get_child(i)->get_child(0))->token.str);
				ASSERT(item.type == Context::Item::Type::VAR && item._is_vector && item.subtype == annotation, "Identifier has not been defined: " + item.name);
			}
			break;
		case crl::Node::Type::LEAF:
			if (((crl::Leaf *) node->get_child(i))->token.type == crl::Token::Type::IDENT){
				Context::Item item = this->context->seek(((crl::Leaf *) node->get_child(i))->token.str);
				ASSERT(item.type == Context::Item::Type::VAR && item.subtype == annotation, "Identifier has not been defined: " + item.name);
			}else if (((crl::Leaf *) node->get_child(i))->token.type == crl::Token::Type::INT){
				ASSERT(annotation == "i32" || annotation == "u32" || annotation == "char" || annotation == "i64" || annotation == "u64", "Must have integer or unsigned type");
			}else if (((crl::Leaf *) node->get_child(i))->token.type == crl::Token::Type::DEC){
				ASSERT(annotation == "f32" || annotation == "f64", "Must have float type");
			}else if (((crl::Leaf *) node->get_child(i))->token.type == crl::Token::Type::STRING){
				ASSERT(annotation == "string", "Must have string type");
			
			}else if (EXPR_OP(((crl::Leaf *) node->get_child(i))->token));
			else ASSERT(false, "Unkown type");
			break;
		case crl::Node::Type::COMPARISON:
			if (node->get_child(i)->children.size() > 1){
				this->expression(node->get_child(i), "");
				break;
			}
		default:
			this->expression(node->get_child(i), annotation);
			break;
		}
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x690, %rsp            # imm = 0x690
movq %rdx, -0x538(%rbp)
movq %rdi, %rax
movq -0x538(%rbp), %rdi
movq %rdi, -0x530(%rbp)
movq %rax, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdi, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x528(%rbp)
leaq 0xa253(%rip), %rsi      # 0x2b4e4
callq 0x66e0
testb $0x1, %al
jne 0x2129c
jmp 0x212c9
movq -0x528(%rbp), %rsi
movq -0x10(%rbp), %rdx
leaq -0x38(%rbp), %rdi
callq 0x24d20
movq -0x530(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x43c0
leaq -0x38(%rbp), %rdi
callq 0x41e0
movq -0x530(%rbp), %rsi
movq -0x10(%rbp), %rdi
addq $0x30, %rdi
callq 0x4050
movq -0x10(%rbp), %rdi
addq $0x10, %rdi
callq 0x51d0
movq %rax, -0x40(%rbp)
movq $0x0, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x40(%rbp), %rax
jae 0x22697
movq -0x10(%rbp), %rdi
movl -0x48(%rbp), %esi
movq (%rdi), %rax
movq 0x18(%rax), %rax
callq *%rax
movl 0x8(%rax), %eax
addl $-0xc, %eax
movl %eax, %ecx
movq %rcx, -0x540(%rbp)
subl $0xd, %eax
ja 0x2260f
movq -0x540(%rbp), %rax
leaq 0xa4b2(%rip), %rcx      # 0x2b7ec
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x10(%rbp), %rdi
movl -0x48(%rbp), %esi
movq (%rdi), %rax
movq 0x18(%rax), %rax
callq *%rax
movq -0x530(%rbp), %rsi
movq %rax, %rdi
addq $0x30, %rdi
callq 0x4050
movq -0x10(%rbp), %rdi
movl -0x48(%rbp), %esi
movq (%rdi), %rax
movq 0x18(%rax), %rax
callq *%rax
movq -0x530(%rbp), %rsi
movq %rax, -0x550(%rbp)
leaq -0x68(%rbp), %rdi
movq %rdi, -0x548(%rbp)
callq 0x4150
movq -0x528(%rbp), %rdi
movq -0x550(%rbp), %rsi
movq -0x548(%rbp), %rdx
callq 0x23b90
jmp 0x213b0
leaq -0x68(%rbp), %rdi
callq 0x41e0
jmp 0x22684
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x68(%rbp), %rdi
callq 0x41e0
jmp 0x226a0
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
movq %rax, %rdi
movq (%rdi), %rax
xorl %esi, %esi
callq *0x18(%rax)
cmpl $0x1, 0x78(%rax)
jne 0x2166f
movq -0x528(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x560(%rbp)
movq -0x10(%rbp), %rdi
movl -0x48(%rbp), %esi
movq (%rdi), %rax
movq 0x18(%rax), %rax
callq *%rax
movq %rax, %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq %rax, %rsi
addq $0x58, %rsi
leaq -0x108(%rbp), %rdi
movq %rdi, -0x558(%rbp)
callq 0x4150
movq -0x560(%rbp), %rsi
movq -0x558(%rbp), %rdx
leaq -0xe8(%rbp), %rdi
callq 0x6830
jmp 0x21463
leaq -0x108(%rbp), %rdi
callq 0x41e0
cmpl $0x3, -0xe8(%rbp)
jne 0x21497
movq -0x530(%rbp), %rsi
leaq -0xe8(%rbp), %rdi
addq $0x28, %rdi
callq 0x7e40
testb $0x1, %al
jne 0x2156c
movb $0x1, -0x129(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x568(%rbp)
leaq -0xe0(%rbp), %rdx
leaq 0xa761(%rip), %rsi      # 0x2bc1e
leaq -0x128(%rbp), %rdi
callq 0x5410
jmp 0x214cb
movq -0x568(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x128(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x214e7
movq -0x568(%rbp), %rdi
movb $0x0, -0x129(%rbp)
leaq 0x18884(%rip), %rsi     # 0x39d80
leaq -0x181f3(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x226a9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x108(%rbp), %rdi
callq 0x41e0
jmp 0x226a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x21550
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x128(%rbp), %rdi
callq 0x41e0
testb $0x1, -0x129(%rbp)
jne 0x2155b
jmp 0x21567
movq -0x568(%rbp), %rdi
callq 0x4230
jmp 0x2165e
testb $0x1, -0x98(%rbp)
jne 0x2164d
movb $0x1, -0x152(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x578(%rbp)
leaq -0x151(%rbp), %rdi
movq %rdi, -0x570(%rbp)
callq 0x4590
movq -0x570(%rbp), %rdx
leaq 0xa68e(%rip), %rsi      # 0x2bc40
leaq -0x150(%rbp), %rdi
callq 0x52e0
jmp 0x215c0
movq -0x578(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x150(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x215dc
movq -0x578(%rbp), %rdi
movb $0x0, -0x152(%rbp)
leaq 0x1878f(%rip), %rsi     # 0x39d80
leaq -0x182e8(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x226a9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x21628
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x150(%rbp), %rdi
callq 0x41e0
leaq -0x151(%rbp), %rdi
callq 0x4360
testb $0x1, -0x152(%rbp)
jne 0x2163f
jmp 0x2164b
movq -0x578(%rbp), %rdi
callq 0x4230
jmp 0x2165e
leaq -0xe8(%rbp), %rdi
callq 0x6df0
jmp 0x21746
leaq -0xe8(%rbp), %rdi
callq 0x6df0
jmp 0x226a0
movb $0x1, -0x17a(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x588(%rbp)
leaq -0x179(%rbp), %rdi
movq %rdi, -0x580(%rbp)
callq 0x4590
movq -0x580(%rbp), %rdx
leaq 0xa563(%rip), %rsi      # 0x2bc0b
leaq -0x178(%rbp), %rdi
callq 0x52e0
jmp 0x216b6
movq -0x588(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x178(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x216d2
movq -0x588(%rbp), %rdi
movb $0x0, -0x17a(%rbp)
leaq 0x18699(%rip), %rsi     # 0x39d80
leaq -0x183de(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x226a9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x2171e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x178(%rbp), %rdi
callq 0x41e0
leaq -0x179(%rbp), %rdi
callq 0x4360
testb $0x1, -0x17a(%rbp)
jne 0x21735
jmp 0x21741
movq -0x588(%rbp), %rdi
callq 0x4230
jmp 0x226a0
jmp 0x22684
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
movq %rax, %rdi
movq (%rdi), %rax
movl $0x1, %esi
callq *0x18(%rax)
movq %rax, %rsi
leaq -0x1b0(%rbp), %rdi
callq 0x24750
movq -0x530(%rbp), %rsi
leaq -0x1b0(%rbp), %rdi
callq 0x7e40
xorb $-0x1, %al
movb %al, -0x589(%rbp)
leaq -0x1b0(%rbp), %rdi
callq 0x285a0
movb -0x589(%rbp), %al
testb $0x1, %al
jne 0x217ae
jmp 0x21885
movb $0x1, -0x1d2(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x5a0(%rbp)
leaq -0x1d1(%rbp), %rdi
movq %rdi, -0x598(%rbp)
callq 0x4590
movq -0x598(%rbp), %rdx
leaq 0xa472(%rip), %rsi      # 0x2bc59
leaq -0x1d0(%rbp), %rdi
callq 0x52e0
jmp 0x217f5
movq -0x5a0(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x1d0(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x21811
movq -0x5a0(%rbp), %rdi
movb $0x0, -0x1d2(%rbp)
leaq 0x1855a(%rip), %rsi     # 0x39d80
leaq -0x1851d(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x226a9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x2185d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x1d0(%rbp), %rdi
callq 0x41e0
leaq -0x1d1(%rbp), %rdi
callq 0x4360
testb $0x1, -0x1d2(%rbp)
jne 0x21874
jmp 0x21880
movq -0x5a0(%rbp), %rdi
callq 0x4230
jmp 0x226a0
movq -0x10(%rbp), %rdi
movl -0x48(%rbp), %esi
movq (%rdi), %rax
movq 0x18(%rax), %rax
callq *%rax
movq %rax, %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq -0x528(%rbp), %rsi
movq %rax, %rdx
leaq -0x1f8(%rbp), %rdi
movq %rdi, -0x5a8(%rbp)
callq 0x24d20
movq -0x5a8(%rbp), %rsi
leaq -0x218(%rbp), %rdi
callq 0x4150
jmp 0x218d5
movq -0x530(%rbp), %rsi
leaq -0x238(%rbp), %rdi
callq 0x4150
jmp 0x218ea
leaq -0x218(%rbp), %rdi
leaq -0x238(%rbp), %rsi
callq 0x24d00
xorb $-0x1, %al
movb %al, -0x5a9(%rbp)
leaq -0x238(%rbp), %rdi
callq 0x41e0
leaq -0x218(%rbp), %rdi
callq 0x41e0
movb -0x5a9(%rbp), %al
testb $0x1, %al
jne 0x2192c
jmp 0x21a48
movb $0x1, -0x279(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x5b8(%rbp)
leaq 0xa33b(%rip), %rdx      # 0x2bc86
leaq -0x278(%rbp), %rdi
leaq -0x1f8(%rbp), %rsi
callq 0x25e80
jmp 0x21960
movq -0x530(%rbp), %rdx
leaq -0x258(%rbp), %rdi
leaq -0x278(%rbp), %rsi
callq 0x55f0
jmp 0x2197c
movq -0x5b8(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x258(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x21998
movq -0x5b8(%rbp), %rdi
movb $0x0, -0x279(%rbp)
leaq 0x183d3(%rip), %rsi     # 0x39d80
leaq -0x186a4(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x226a9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x21c30
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x218(%rbp), %rdi
callq 0x41e0
jmp 0x21c30
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x21a2c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x21a20
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x258(%rbp), %rdi
callq 0x41e0
leaq -0x278(%rbp), %rdi
callq 0x41e0
testb $0x1, -0x279(%rbp)
jne 0x21a37
jmp 0x21a43
movq -0x5b8(%rbp), %rdi
callq 0x4230
jmp 0x21c30
movq -0x10(%rbp), %rdi
movl -0x48(%rbp), %esi
movq (%rdi), %rax
movq 0x18(%rax), %rax
callq *%rax
movq %rax, -0x5c0(%rbp)
jmp 0x21a61
movq -0x5c0(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq %rax, -0x5c8(%rbp)
jmp 0x21a7c
movq -0x5c8(%rbp), %rax
cmpl $0xc, 0x8(%rax)
jne 0x21b77
movq -0x10(%rbp), %rdi
movl -0x48(%rbp), %esi
movq (%rdi), %rax
movq 0x18(%rax), %rax
callq *%rax
movq %rax, -0x5d0(%rbp)
jmp 0x21aa6
movq -0x5d0(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq %rax, -0x5d8(%rbp)
jmp 0x21ac1
movq -0x5d8(%rbp), %rdi
addq $0x30, %rdi
leaq -0x1f8(%rbp), %rsi
callq 0x4050
jmp 0x21ada
movq -0x10(%rbp), %rdi
movl -0x48(%rbp), %esi
movq (%rdi), %rax
movq 0x18(%rax), %rax
callq *%rax
movq %rax, -0x5e0(%rbp)
jmp 0x21af3
movq -0x5e0(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq %rax, -0x5e8(%rbp)
jmp 0x21b0e
leaq -0x2a0(%rbp), %rdi
leaq -0x1f8(%rbp), %rsi
callq 0x4150
jmp 0x21b23
movq -0x5e8(%rbp), %rsi
movq -0x528(%rbp), %rdi
leaq -0x2a0(%rbp), %rdx
callq 0x23b90
jmp 0x21b3f
leaq -0x2a0(%rbp), %rdi
callq 0x41e0
movl $0x5, -0x2a4(%rbp)
jmp 0x21c0e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x2a0(%rbp), %rdi
callq 0x41e0
jmp 0x21c30
movq -0x10(%rbp), %rdi
movl -0x48(%rbp), %esi
movq (%rdi), %rax
movq 0x18(%rax), %rax
callq *%rax
movq %rax, -0x5f0(%rbp)
jmp 0x21b90
movq -0x5f0(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq %rax, -0x5f8(%rbp)
jmp 0x21bab
leaq -0x2c8(%rbp), %rdi
leaq -0x1f8(%rbp), %rsi
callq 0x4150
jmp 0x21bc0
movq -0x5f8(%rbp), %rsi
movq -0x528(%rbp), %rdi
leaq -0x2c8(%rbp), %rdx
callq 0x21250
jmp 0x21bdc
leaq -0x2c8(%rbp), %rdi
callq 0x41e0
jmp 0x21c04
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x2c8(%rbp), %rdi
callq 0x41e0
jmp 0x21c30
movl $0x0, -0x2a4(%rbp)
leaq -0x1f8(%rbp), %rdi
callq 0x41e0
movl -0x2a4(%rbp), %eax
testl %eax, %eax
je 0x21c2b
jmp 0x21c26
jmp 0x22684
jmp 0x22684
leaq -0x1f8(%rbp), %rdi
callq 0x41e0
jmp 0x226a0
movq -0x528(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x608(%rbp)
movq -0x10(%rbp), %rdi
movl -0x48(%rbp), %esi
movq (%rdi), %rax
movq 0x18(%rax), %rax
callq *%rax
movq %rax, %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq %rax, %rsi
addq $0x58, %rsi
leaq -0x358(%rbp), %rdi
movq %rdi, -0x600(%rbp)
callq 0x4150
movq -0x608(%rbp), %rsi
movq -0x600(%rbp), %rdx
leaq -0x338(%rbp), %rdi
callq 0x6830
jmp 0x21ca7
leaq -0x358(%rbp), %rdi
callq 0x41e0
cmpl $0x3, -0x338(%rbp)
jne 0x21ce4
testb $0x1, -0x2f0(%rbp)
je 0x21ce4
movq -0x530(%rbp), %rsi
leaq -0x338(%rbp), %rdi
addq $0x28, %rdi
callq 0x7e40
testb $0x1, %al
jne 0x21dc5
movb $0x1, -0x379(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x610(%rbp)
leaq -0x330(%rbp), %rdx
leaq 0x9f14(%rip), %rsi      # 0x2bc1e
leaq -0x378(%rbp), %rdi
callq 0x5410
jmp 0x21d18
movq -0x610(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x378(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x21d34
movq -0x610(%rbp), %rdi
movb $0x0, -0x379(%rbp)
leaq 0x18037(%rip), %rsi     # 0x39d80
leaq -0x18a40(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x226a9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x358(%rbp), %rdi
callq 0x41e0
jmp 0x226a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x21d9d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x378(%rbp), %rdi
callq 0x41e0
testb $0x1, -0x379(%rbp)
jne 0x21da8
jmp 0x21db4
movq -0x610(%rbp), %rdi
callq 0x4230
leaq -0x338(%rbp), %rdi
callq 0x6df0
jmp 0x226a0
leaq -0x338(%rbp), %rdi
callq 0x6df0
jmp 0x22684
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x1, 0x78(%rax)
jne 0x21f6e
movq -0x528(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x620(%rbp)
movq -0x10(%rbp), %rdi
movl -0x48(%rbp), %esi
movq (%rdi), %rax
movq 0x18(%rax), %rax
callq *%rax
movq %rax, %rsi
addq $0x58, %rsi
leaq -0x410(%rbp), %rdi
movq %rdi, -0x618(%rbp)
callq 0x4150
movq -0x620(%rbp), %rsi
movq -0x618(%rbp), %rdx
leaq -0x3f0(%rbp), %rdi
callq 0x6830
jmp 0x21e48
leaq -0x410(%rbp), %rdi
callq 0x41e0
cmpl $0x3, -0x3f0(%rbp)
jne 0x21e7c
movq -0x530(%rbp), %rsi
leaq -0x3f0(%rbp), %rdi
addq $0x28, %rdi
callq 0x7e40
testb $0x1, %al
jne 0x21f5d
movb $0x1, -0x431(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x628(%rbp)
leaq -0x3e8(%rbp), %rdx
leaq 0x9d7c(%rip), %rsi      # 0x2bc1e
leaq -0x430(%rbp), %rdi
callq 0x5410
jmp 0x21eb0
movq -0x628(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x430(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x21ecc
movq -0x628(%rbp), %rdi
movb $0x0, -0x431(%rbp)
leaq 0x17e9f(%rip), %rsi     # 0x39d80
leaq -0x18bd8(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x226a9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x410(%rbp), %rdi
callq 0x41e0
jmp 0x226a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x21f35
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x430(%rbp), %rdi
callq 0x41e0
testb $0x1, -0x431(%rbp)
jne 0x21f40
jmp 0x21f4c
movq -0x628(%rbp), %rdi
callq 0x4230
leaq -0x3f0(%rbp), %rdi
callq 0x6df0
jmp 0x226a0
leaq -0x3f0(%rbp), %rdi
callq 0x6df0
jmp 0x2252c
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x13, 0x78(%rax)
jne 0x220eb
movq -0x530(%rbp), %rdi
leaq 0x9338(%rip), %rsi      # 0x2b2ce
callq 0x66e0
testb $0x1, %al
jne 0x220e6
movq -0x530(%rbp), %rdi
leaq 0x96e2(%rip), %rsi      # 0x2b693
callq 0x66e0
testb $0x1, %al
jne 0x220e6
movq -0x530(%rbp), %rdi
leaq 0x96cf(%rip), %rsi      # 0x2b69b
callq 0x66e0
testb $0x1, %al
jne 0x220e6
movq -0x530(%rbp), %rdi
leaq 0x96b9(%rip), %rsi      # 0x2b6a0
callq 0x66e0
testb $0x1, %al
jne 0x220e6
movq -0x530(%rbp), %rdi
leaq 0x96a2(%rip), %rsi      # 0x2b6a4
callq 0x66e0
testb $0x1, %al
jne 0x220e6
movb $0x1, -0x45a(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x638(%rbp)
leaq -0x459(%rbp), %rdi
movq %rdi, -0x630(%rbp)
callq 0x4590
movq -0x630(%rbp), %rdx
leaq 0x9c52(%rip), %rsi      # 0x2bc9a
leaq -0x458(%rbp), %rdi
callq 0x52e0
jmp 0x22056
movq -0x638(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x458(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x22072
movq -0x638(%rbp), %rdi
movb $0x0, -0x45a(%rbp)
leaq 0x17cf9(%rip), %rsi     # 0x39d80
leaq -0x18d7e(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x226a9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x220be
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x458(%rbp), %rdi
callq 0x41e0
leaq -0x459(%rbp), %rdi
callq 0x4360
testb $0x1, -0x45a(%rbp)
jne 0x220d5
jmp 0x220e1
movq -0x638(%rbp), %rdi
callq 0x4230
jmp 0x226a0
jmp 0x2252a
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x14, 0x78(%rax)
jne 0x22217
movq -0x530(%rbp), %rdi
leaq 0x9584(%rip), %rsi      # 0x2b697
callq 0x66e0
testb $0x1, %al
jne 0x22212
movq -0x530(%rbp), %rdi
leaq 0x957a(%rip), %rsi      # 0x2b6a8
callq 0x66e0
testb $0x1, %al
jne 0x22212
movb $0x1, -0x482(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x648(%rbp)
leaq -0x481(%rbp), %rdi
movq %rdi, -0x640(%rbp)
callq 0x4590
movq -0x640(%rbp), %rdx
leaq 0x9b49(%rip), %rsi      # 0x2bcbd
leaq -0x480(%rbp), %rdi
callq 0x52e0
jmp 0x22182
movq -0x648(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x480(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x2219e
movq -0x648(%rbp), %rdi
movb $0x0, -0x482(%rbp)
leaq 0x17bcd(%rip), %rsi     # 0x39d80
leaq -0x18eaa(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x226a9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x221ea
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x480(%rbp), %rdi
callq 0x41e0
leaq -0x481(%rbp), %rdi
callq 0x4360
testb $0x1, -0x482(%rbp)
jne 0x22201
jmp 0x2220d
movq -0x648(%rbp), %rdi
callq 0x4230
jmp 0x226a0
jmp 0x22528
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x1c, 0x78(%rax)
jne 0x22328
movq -0x530(%rbp), %rdi
leaq 0x99d8(%rip), %rsi      # 0x2bc17
callq 0x66e0
testb $0x1, %al
jne 0x22323
movb $0x1, -0x4aa(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x658(%rbp)
leaq -0x4a9(%rbp), %rdi
movq %rdi, -0x650(%rbp)
callq 0x4590
movq -0x650(%rbp), %rdx
leaq 0x9a4d(%rip), %rsi      # 0x2bcd2
leaq -0x4a8(%rbp), %rdi
callq 0x52e0
jmp 0x22293
movq -0x658(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x4a8(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x222af
movq -0x658(%rbp), %rdi
movb $0x0, -0x4aa(%rbp)
leaq 0x17abc(%rip), %rsi     # 0x39d80
leaq -0x18fbb(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x226a9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x222fb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x4a8(%rbp), %rdi
callq 0x41e0
leaq -0x4a9(%rbp), %rdi
callq 0x4360
testb $0x1, -0x4aa(%rbp)
jne 0x22312
jmp 0x2231e
movq -0x658(%rbp), %rdi
callq 0x4230
jmp 0x226a0
jmp 0x22526
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x16, 0x78(%rax)
je 0x22448
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x17, 0x78(%rax)
je 0x22448
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x15, 0x78(%rax)
je 0x22448
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x1a, 0x78(%rax)
je 0x22448
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x2f, 0x78(%rax)
je 0x22448
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x34, 0x78(%rax)
je 0x22448
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x31, 0x78(%rax)
je 0x22448
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x30, 0x78(%rax)
je 0x22448
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x32, 0x78(%rax)
je 0x22448
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x33, 0x78(%rax)
je 0x22448
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x36, 0x78(%rax)
je 0x22448
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
cmpl $0x35, 0x78(%rax)
jne 0x2244d
jmp 0x22524
movb $0x1, -0x4d2(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x668(%rbp)
leaq -0x4d1(%rbp), %rdi
movq %rdi, -0x660(%rbp)
callq 0x4590
movq -0x660(%rbp), %rdx
leaq 0x9785(%rip), %rsi      # 0x2bc0b
leaq -0x4d0(%rbp), %rdi
callq 0x52e0
jmp 0x22494
movq -0x668(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x4d0(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x224b0
movq -0x668(%rbp), %rdi
movb $0x0, -0x4d2(%rbp)
leaq 0x178bb(%rip), %rsi     # 0x39d80
leaq -0x191bc(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x226a9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x224fc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x4d0(%rbp), %rdi
callq 0x41e0
leaq -0x4d1(%rbp), %rdi
callq 0x4360
testb $0x1, -0x4d2(%rbp)
jne 0x22513
jmp 0x2251f
movq -0x668(%rbp), %rdi
callq 0x4230
jmp 0x226a0
jmp 0x22526
jmp 0x22528
jmp 0x2252a
jmp 0x2252c
jmp 0x22684
movq -0x10(%rbp), %rdi
movq -0x48(%rbp), %rax
movl %eax, %esi
movq (%rdi), %rax
callq *0x18(%rax)
movq %rax, %rdi
addq $0x10, %rdi
callq 0x51d0
cmpq $0x1, %rax
jbe 0x2260d
movq -0x10(%rbp), %rdi
movl -0x48(%rbp), %esi
movq (%rdi), %rax
movq 0x18(%rax), %rax
callq *%rax
movq %rax, -0x678(%rbp)
leaq -0x4f9(%rbp), %rdi
movq %rdi, -0x670(%rbp)
callq 0x4590
movq -0x670(%rbp), %rdx
leaq 0x8f55(%rip), %rsi      # 0x2b4e4
leaq -0x4f8(%rbp), %rdi
callq 0x52e0
jmp 0x2259d
movq -0x678(%rbp), %rsi
movq -0x528(%rbp), %rdi
leaq -0x4f8(%rbp), %rdx
callq 0x21250
jmp 0x225b9
leaq -0x4f8(%rbp), %rdi
callq 0x41e0
leaq -0x4f9(%rbp), %rdi
callq 0x4360
jmp 0x22684
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x225fc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x4f8(%rbp), %rdi
callq 0x41e0
leaq -0x4f9(%rbp), %rdi
callq 0x4360
jmp 0x226a0
jmp 0x2260f
movq -0x10(%rbp), %rdi
movl -0x48(%rbp), %esi
movq (%rdi), %rax
movq 0x18(%rax), %rax
callq *%rax
movq -0x530(%rbp), %rsi
movq %rax, -0x688(%rbp)
leaq -0x520(%rbp), %rdi
movq %rdi, -0x680(%rbp)
callq 0x4150
movq -0x528(%rbp), %rdi
movq -0x688(%rbp), %rsi
movq -0x680(%rbp), %rdx
callq 0x21250
jmp 0x2265c
leaq -0x520(%rbp), %rdi
callq 0x41e0
jmp 0x22684
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x520(%rbp), %rdi
callq 0x41e0
jmp 0x226a0
jmp 0x22686
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x212f6
addq $0x690, %rsp            # imm = 0x690
popq %rbp
retq
movq -0x70(%rbp), %rdi
callq 0x4580
nopl (%rax)