// File: RuiDGPires[P]CrimLang/src/semantic_analiser.cpp
// Function: sc_Tracker::statement(crl::Node*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>)
void _sc_Tracker::statement(crl::Node *node, std::string annotation){
	switch(node->type){
		case crl::Node::Type::NONE:
			break;
		case crl::Node::Type::CALL:
			node->annotation = "void";
			this->func_call(node, "void");
			break;
		case crl::Node::Type::BREAK:
			ASSERT(this->can_break, "Invalid break/continue");
			break;
		case crl::Node::Type::RETURN:
			this->func_returns = true;
			if (annotation != "void"){
				ASSERT(node->children.size() == 1, "Non-void functions must return a value");
				ASSERT(node->get_child(0)->type == crl::Node::Type::EXPRESSION, "Can only return expressions");
				this->expression(node->get_child(0), annotation);
			}else{
				ASSERT(node->children.size() == 0, "Void functions must return no value");
				node->annotation = "void";
			}break;
		case crl::Node::Type::IF:
			{
			bool aux = this->func_returns;
			this->func_returns = false;

			this->expression(node->get_child(0), "u32");
			ASSERT(node->get_child(1)->type == crl::Node::Type::THEN, "If statements MUST have a THEN child");

			if (node->get_child(1)->get_child(0)->type == crl::Node::Type::BLOCK)
				this->block(node->get_child(1)->get_child(0), annotation);
			else
				this->statement(node->get_child(1)->get_child(0), annotation);
			
			bool then_returns = this->func_returns; // Check if then statement returns
			this->func_returns = false;

			ASSERT(node->children.size() < 4, "If statement size is too large");
			if (node->children.size() == 3){
				ASSERT(node->get_child(2)->type == crl::Node::Type::ELSE, "If statement has something that isn't an ELSE");
				if (node->get_child(2)->get_child(0)->type == crl::Node::Type::BLOCK)
					this->block(node->get_child(2)->get_child(0), annotation);
				else
					this->statement(node->get_child(2)->get_child(0), annotation);
			}else this->func_returns = false;

			bool else_returns = this->func_returns;
		
			this->func_returns = aux | (then_returns && else_returns);	 // CHECK IF FUNCTION RETURNS
			}
			break;
		case crl::Node::Type::WHILE:
			this->can_break = true; // TODO: fix
			this->expression(node->get_child(0), "u32");
			if (node->get_child(1)->get_child(0)->type == crl::Node::Type::BLOCK)
				this->block(node->get_child(1)->get_child(0), annotation);
			else
				this->statement(node->get_child(1)->get_child(0), annotation);

			this->can_break = false;
			break;
		case crl::Node::Type::FOR:

			break;
		case crl::Node::Type::ASSIGN:
			{
				Context::Item item;
				if (node->get_child(0)->type == crl::Node::Type::VECTOR){
					item = this->context->seek(get_token(node->get_child(0)->get_child(0)).str);
					ASSERT(item._is_vector, "Var needs to be vector to be assigned with an offset");
				}else 
					item = this->context->seek(get_token(node->get_child(0)).str);
				ASSERT(item.type == Context::Item::Type::VAR, "Can only assign values to variables");
				ASSERT(item._mutable, "Can only assign mutable variables");
				if (node->get_child(1)->type == crl::Node::EXPRESSION)
					this->expression(node->get_child(1), item.subtype);
			}
			break;
		case crl::Node::Type::INIT:
			this->var_declaration(node);
			break;
		case crl::Node::Type::INC:
		case crl::Node::Type::DEC:
			this->unary(node);
			break;
		default:
			throw crl::AssertionError(-1, -1, "Unkown node type");
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x720, %rsp            # imm = 0x720
movq %rdx, -0x570(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x568(%rbp)
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
movq %rax, -0x560(%rbp)
subq $0x17, %rax
ja 0x23aa4
movq -0x560(%rbp), %rax
leaq 0x9125(%rip), %rcx      # 0x2b824
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
jmp 0x23b75
movq -0x10(%rbp), %rdi
addq $0x30, %rdi
leaq 0x8f72(%rip), %rsi      # 0x2b68e
movq %rsi, -0x580(%rbp)
callq 0x4440
movq -0x10(%rbp), %rax
movq %rax, -0x588(%rbp)
leaq -0x39(%rbp), %rdi
movq %rdi, -0x578(%rbp)
callq 0x4590
movq -0x580(%rbp), %rsi
movq -0x578(%rbp), %rdx
leaq -0x38(%rbp), %rdi
callq 0x52e0
jmp 0x2275c
movq -0x588(%rbp), %rsi
movq -0x568(%rbp), %rdi
leaq -0x38(%rbp), %rdx
callq 0x23b90
jmp 0x22775
leaq -0x38(%rbp), %rdi
callq 0x41e0
leaq -0x39(%rbp), %rdi
callq 0x4360
jmp 0x23b75
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x227af
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x41e0
leaq -0x39(%rbp), %rdi
callq 0x4360
jmp 0x23b7e
movq -0x568(%rbp), %rax
testb $0x1, 0x11(%rax)
jne 0x2288d
movb $0x1, -0x72(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x598(%rbp)
leaq -0x71(%rbp), %rdi
movq %rdi, -0x590(%rbp)
callq 0x4590
movq -0x590(%rbp), %rdx
leaq 0x915d(%rip), %rsi      # 0x2b95e
leaq -0x70(%rbp), %rdi
callq 0x52e0
jmp 0x2280c
movq -0x598(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x70(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x22825
movq -0x598(%rbp), %rdi
movb $0x0, -0x72(%rbp)
leaq 0x17549(%rip), %rsi     # 0x39d80
leaq -0x1952e(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x23b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2286b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x41e0
leaq -0x71(%rbp), %rdi
callq 0x4360
testb $0x1, -0x72(%rbp)
jne 0x2287c
jmp 0x22888
movq -0x598(%rbp), %rdi
callq 0x4230
jmp 0x23b7e
jmp 0x23b75
movq -0x570(%rbp), %rdi
movq -0x568(%rbp), %rax
movb $0x1, 0x10(%rax)
leaq 0x8de3(%rip), %rsi      # 0x2b68e
callq 0x5390
testb $0x1, %al
jne 0x228b9
jmp 0x22b0e
movq -0x10(%rbp), %rdi
addq $0x10, %rdi
callq 0x51d0
cmpq $0x1, %rax
je 0x229a7
movb $0x1, -0x9a(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x5a8(%rbp)
leaq -0x99(%rbp), %rdi
movq %rdi, -0x5a0(%rbp)
callq 0x4590
movq -0x5a0(%rbp), %rdx
leaq 0x906c(%rip), %rsi      # 0x2b975
leaq -0x98(%rbp), %rdi
callq 0x52e0
jmp 0x22917
movq -0x5a8(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x98(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x22933
movq -0x5a8(%rbp), %rdi
movb $0x0, -0x9a(%rbp)
leaq 0x17438(%rip), %rsi     # 0x39d80
leaq -0x1963f(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x23b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2297f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x98(%rbp), %rdi
callq 0x41e0
leaq -0x99(%rbp), %rdi
callq 0x4360
testb $0x1, -0x9a(%rbp)
jne 0x22996
jmp 0x229a2
movq -0x5a8(%rbp), %rdi
callq 0x4230
jmp 0x23b7e
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
xorl %esi, %esi
callq *0x18(%rax)
cmpl $0xd, 0x8(%rax)
je 0x22a94
movb $0x1, -0xc2(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x5b8(%rbp)
leaq -0xc1(%rbp), %rdi
movq %rdi, -0x5b0(%rbp)
callq 0x4590
movq -0x5b0(%rbp), %rdx
leaq 0x8fa6(%rip), %rsi      # 0x2b99c
leaq -0xc0(%rbp), %rdi
callq 0x52e0
jmp 0x22a04
movq -0x5b8(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0xc0(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x22a20
movq -0x5b8(%rbp), %rdi
movb $0x0, -0xc2(%rbp)
leaq 0x1734b(%rip), %rsi     # 0x39d80
leaq -0x1972c(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x23b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x22a6c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0xc0(%rbp), %rdi
callq 0x41e0
leaq -0xc1(%rbp), %rdi
callq 0x4360
testb $0x1, -0xc2(%rbp)
jne 0x22a83
jmp 0x22a8f
movq -0x5b8(%rbp), %rdi
callq 0x4230
jmp 0x23b7e
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq -0x570(%rbp), %rsi
movq %rax, -0x5c8(%rbp)
leaq -0xe8(%rbp), %rdi
movq %rdi, -0x5c0(%rbp)
callq 0x4150
movq -0x568(%rbp), %rdi
movq -0x5c8(%rbp), %rsi
movq -0x5c0(%rbp), %rdx
callq 0x21250
jmp 0x22ae0
leaq -0xe8(%rbp), %rdi
callq 0x41e0
jmp 0x22c10
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0xe8(%rbp), %rdi
callq 0x41e0
jmp 0x23b7e
movq -0x10(%rbp), %rdi
addq $0x10, %rdi
callq 0x51d0
cmpq $0x0, %rax
je 0x22bfc
movb $0x1, -0x10a(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x5d8(%rbp)
leaq -0x109(%rbp), %rdi
movq %rdi, -0x5d0(%rbp)
callq 0x4590
movq -0x5d0(%rbp), %rdx
leaq 0x8e5a(%rip), %rsi      # 0x2b9b8
leaq -0x108(%rbp), %rdi
callq 0x52e0
jmp 0x22b6c
movq -0x5d8(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x108(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x22b88
movq -0x5d8(%rbp), %rdi
movb $0x0, -0x10a(%rbp)
leaq 0x171e3(%rip), %rsi     # 0x39d80
leaq -0x19894(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x23b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x22bd4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x108(%rbp), %rdi
callq 0x41e0
leaq -0x109(%rbp), %rdi
callq 0x4360
testb $0x1, -0x10a(%rbp)
jne 0x22beb
jmp 0x22bf7
movq -0x5d8(%rbp), %rdi
callq 0x4230
jmp 0x23b7e
movq -0x10(%rbp), %rdi
addq $0x30, %rdi
leaq 0x8a83(%rip), %rsi      # 0x2b68e
callq 0x4440
jmp 0x23b75
movq -0x568(%rbp), %rax
movb 0x10(%rax), %cl
andb $0x1, %cl
movb %cl, -0x10b(%rbp)
movb $0x0, 0x10(%rax)
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq %rax, -0x5e8(%rbp)
leaq -0x131(%rbp), %rdi
movq %rdi, -0x5e0(%rbp)
callq 0x4590
movq -0x5e0(%rbp), %rdx
leaq 0x8a30(%rip), %rsi      # 0x2b693
leaq -0x130(%rbp), %rdi
callq 0x52e0
jmp 0x22c71
movq -0x5e8(%rbp), %rsi
movq -0x568(%rbp), %rdi
leaq -0x130(%rbp), %rdx
callq 0x21250
jmp 0x22c8d
leaq -0x130(%rbp), %rdi
callq 0x41e0
leaq -0x131(%rbp), %rdi
callq 0x4360
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movl $0x1, %esi
callq *0x18(%rax)
cmpl $0x8, 0x8(%rax)
je 0x22dcc
movb $0x1, -0x15a(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x5f8(%rbp)
leaq -0x159(%rbp), %rdi
movq %rdi, -0x5f0(%rbp)
callq 0x4590
movq -0x5f0(%rbp), %rdx
leaq 0x8ce5(%rip), %rsi      # 0x2b9dc
leaq -0x158(%rbp), %rdi
callq 0x52e0
jmp 0x22d05
movq -0x5f8(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x158(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x22d21
movq -0x5f8(%rbp), %rdi
movb $0x0, -0x15a(%rbp)
leaq 0x1704a(%rip), %rsi     # 0x39d80
leaq -0x19a2d(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x23b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x22d6d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x130(%rbp), %rdi
callq 0x41e0
leaq -0x131(%rbp), %rdi
callq 0x4360
jmp 0x23b7e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x22da4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x158(%rbp), %rdi
callq 0x41e0
leaq -0x159(%rbp), %rdi
callq 0x4360
testb $0x1, -0x15a(%rbp)
jne 0x22dbb
jmp 0x22dc7
movq -0x5f8(%rbp), %rdi
callq 0x4230
jmp 0x23b7e
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movl $0x1, %esi
callq *0x18(%rax)
movq %rax, %rdi
movq (%rdi), %rax
xorl %esi, %esi
callq *0x18(%rax)
cmpl $0x5, 0x8(%rax)
jne 0x22e7b
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
movl $0x1, %esi
callq *%rax
movq %rax, %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq -0x570(%rbp), %rsi
movq %rax, -0x608(%rbp)
leaq -0x180(%rbp), %rdi
movq %rdi, -0x600(%rbp)
callq 0x4150
movq -0x568(%rbp), %rdi
movq -0x608(%rbp), %rsi
movq -0x600(%rbp), %rdx
callq 0x20c80
jmp 0x22e4d
leaq -0x180(%rbp), %rdi
callq 0x41e0
jmp 0x22f03
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x180(%rbp), %rdi
callq 0x41e0
jmp 0x23b7e
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
movl $0x1, %esi
callq *%rax
movq %rax, %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq -0x570(%rbp), %rsi
movq %rax, -0x618(%rbp)
leaq -0x1a0(%rbp), %rdi
movq %rdi, -0x610(%rbp)
callq 0x4150
movq -0x568(%rbp), %rdi
movq -0x618(%rbp), %rsi
movq -0x610(%rbp), %rdx
callq 0x226b0
jmp 0x22ed8
leaq -0x1a0(%rbp), %rdi
callq 0x41e0
jmp 0x22f03
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x1a0(%rbp), %rdi
callq 0x41e0
jmp 0x23b7e
movq -0x568(%rbp), %rax
movb 0x10(%rax), %cl
andb $0x1, %cl
movb %cl, -0x1a1(%rbp)
movb $0x0, 0x10(%rax)
movq -0x10(%rbp), %rdi
addq $0x10, %rdi
callq 0x51d0
cmpq $0x4, %rax
jb 0x23008
movb $0x1, -0x1ca(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x628(%rbp)
leaq -0x1c9(%rbp), %rdi
movq %rdi, -0x620(%rbp)
callq 0x4590
movq -0x620(%rbp), %rdx
leaq 0x8a97(%rip), %rsi      # 0x2ba01
leaq -0x1c8(%rbp), %rdi
callq 0x52e0
jmp 0x22f78
movq -0x628(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x1c8(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x22f94
movq -0x628(%rbp), %rdi
movb $0x0, -0x1ca(%rbp)
leaq 0x16dd7(%rip), %rsi     # 0x39d80
leaq -0x19ca0(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x23b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x22fe0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x1c8(%rbp), %rdi
callq 0x41e0
leaq -0x1c9(%rbp), %rdi
callq 0x4360
testb $0x1, -0x1ca(%rbp)
jne 0x22ff7
jmp 0x23003
movq -0x628(%rbp), %rdi
callq 0x4230
jmp 0x23b7e
movq -0x10(%rbp), %rdi
addq $0x10, %rdi
callq 0x51d0
cmpq $0x3, %rax
jne 0x23248
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movl $0x2, %esi
callq *0x18(%rax)
cmpl $0x9, 0x8(%rax)
je 0x2310f
movb $0x1, -0x1f2(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x638(%rbp)
leaq -0x1f1(%rbp), %rdi
movq %rdi, -0x630(%rbp)
callq 0x4590
movq -0x630(%rbp), %rdx
leaq 0x89af(%rip), %rsi      # 0x2ba20
leaq -0x1f0(%rbp), %rdi
callq 0x52e0
jmp 0x2307f
movq -0x638(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x1f0(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x2309b
movq -0x638(%rbp), %rdi
movb $0x0, -0x1f2(%rbp)
leaq 0x16cd0(%rip), %rsi     # 0x39d80
leaq -0x19da7(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x23b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x230e7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x1f0(%rbp), %rdi
callq 0x41e0
leaq -0x1f1(%rbp), %rdi
callq 0x4360
testb $0x1, -0x1f2(%rbp)
jne 0x230fe
jmp 0x2310a
movq -0x638(%rbp), %rdi
callq 0x4230
jmp 0x23b7e
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movl $0x2, %esi
callq *0x18(%rax)
movq %rax, %rdi
movq (%rdi), %rax
xorl %esi, %esi
callq *0x18(%rax)
cmpl $0x5, 0x8(%rax)
jne 0x231be
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
movl $0x2, %esi
callq *%rax
movq %rax, %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq -0x570(%rbp), %rsi
movq %rax, -0x648(%rbp)
leaq -0x218(%rbp), %rdi
movq %rdi, -0x640(%rbp)
callq 0x4150
movq -0x568(%rbp), %rdi
movq -0x648(%rbp), %rsi
movq -0x640(%rbp), %rdx
callq 0x20c80
jmp 0x23190
leaq -0x218(%rbp), %rdi
callq 0x41e0
jmp 0x23246
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x218(%rbp), %rdi
callq 0x41e0
jmp 0x23b7e
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
movl $0x2, %esi
callq *%rax
movq %rax, %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq -0x570(%rbp), %rsi
movq %rax, -0x658(%rbp)
leaq -0x238(%rbp), %rdi
movq %rdi, -0x650(%rbp)
callq 0x4150
movq -0x568(%rbp), %rdi
movq -0x658(%rbp), %rsi
movq -0x650(%rbp), %rdx
callq 0x226b0
jmp 0x2321b
leaq -0x238(%rbp), %rdi
callq 0x41e0
jmp 0x23246
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x238(%rbp), %rdi
callq 0x41e0
jmp 0x23b7e
jmp 0x23253
movq -0x568(%rbp), %rax
movb $0x0, 0x10(%rax)
movq -0x568(%rbp), %rax
movb 0x10(%rax), %al
andb $0x1, %al
movb %al, -0x239(%rbp)
movb -0x10b(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0x660(%rbp)
xorl %eax, %eax
testb $0x1, -0x1a1(%rbp)
movb %al, -0x659(%rbp)
je 0x23293
movb -0x239(%rbp), %al
movb %al, -0x659(%rbp)
movq -0x568(%rbp), %rax
movl -0x660(%rbp), %ecx
movb -0x659(%rbp), %dl
andb $0x1, %dl
movzbl %dl, %edx
orl %edx, %ecx
cmpl $0x0, %ecx
setne %cl
andb $0x1, %cl
movb %cl, 0x10(%rax)
jmp 0x23b75
movq -0x568(%rbp), %rax
movb $0x1, 0x11(%rax)
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq %rax, -0x670(%rbp)
leaq -0x261(%rbp), %rdi
movq %rdi, -0x668(%rbp)
callq 0x4590
movq -0x668(%rbp), %rdx
leaq 0x8392(%rip), %rsi      # 0x2b693
leaq -0x260(%rbp), %rdi
callq 0x52e0
jmp 0x2330f
movq -0x670(%rbp), %rsi
movq -0x568(%rbp), %rdi
leaq -0x260(%rbp), %rdx
callq 0x21250
jmp 0x2332b
leaq -0x260(%rbp), %rdi
callq 0x41e0
leaq -0x261(%rbp), %rdi
callq 0x4360
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movl $0x1, %esi
callq *0x18(%rax)
movq %rax, %rdi
movq (%rdi), %rax
xorl %esi, %esi
callq *0x18(%rax)
cmpl $0x5, 0x8(%rax)
jne 0x23429
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
movl $0x1, %esi
callq *%rax
movq %rax, %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq -0x570(%rbp), %rsi
movq %rax, -0x680(%rbp)
leaq -0x288(%rbp), %rdi
movq %rdi, -0x678(%rbp)
callq 0x4150
movq -0x568(%rbp), %rdi
movq -0x680(%rbp), %rsi
movq -0x678(%rbp), %rdx
callq 0x20c80
jmp 0x233c4
leaq -0x288(%rbp), %rdi
callq 0x41e0
jmp 0x234b1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x233fb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x260(%rbp), %rdi
callq 0x41e0
leaq -0x261(%rbp), %rdi
callq 0x4360
jmp 0x23b7e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x288(%rbp), %rdi
callq 0x41e0
jmp 0x23b7e
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
movl $0x1, %esi
callq *%rax
movq %rax, %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq -0x570(%rbp), %rsi
movq %rax, -0x690(%rbp)
leaq -0x2a8(%rbp), %rdi
movq %rdi, -0x688(%rbp)
callq 0x4150
movq -0x568(%rbp), %rdi
movq -0x690(%rbp), %rsi
movq -0x688(%rbp), %rdx
callq 0x226b0
jmp 0x23486
leaq -0x2a8(%rbp), %rdi
callq 0x41e0
jmp 0x234b1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x2a8(%rbp), %rdi
callq 0x41e0
jmp 0x23b7e
movq -0x568(%rbp), %rax
movb $0x0, 0x11(%rax)
jmp 0x23b75
jmp 0x23b75
leaq -0x318(%rbp), %rdi
callq 0x6c30
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq %rax, -0x698(%rbp)
jmp 0x234ea
movq -0x698(%rbp), %rax
cmpl $0x19, 0x8(%rax)
jne 0x23701
movq -0x568(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x6a8(%rbp)
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq %rax, -0x6a0(%rbp)
jmp 0x23525
movq -0x6a0(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq %rax, -0x6b0(%rbp)
jmp 0x23540
movq -0x6b0(%rbp), %rsi
leaq -0x3d8(%rbp), %rdi
callq 0x24750
jmp 0x23555
leaq -0x3a8(%rbp), %rdi
movq %rdi, -0x6b8(%rbp)
leaq -0x3d8(%rbp), %rsi
callq 0x41d0
movq -0x6a8(%rbp), %rsi
movq -0x6b8(%rbp), %rdx
leaq -0x388(%rbp), %rdi
callq 0x6830
jmp 0x2358b
leaq -0x318(%rbp), %rdi
leaq -0x388(%rbp), %rsi
callq 0x25d00
jmp 0x235a0
leaq -0x388(%rbp), %rdi
callq 0x6df0
leaq -0x3a8(%rbp), %rdi
callq 0x41e0
leaq -0x3d8(%rbp), %rdi
callq 0x285a0
testb $0x1, -0x2d0(%rbp)
jne 0x236fc
movb $0x1, -0x3fa(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x6c8(%rbp)
leaq -0x3f9(%rbp), %rdi
movq %rdi, -0x6c0(%rbp)
callq 0x4590
movq -0x6c0(%rbp), %rdx
leaq 0x8444(%rip), %rsi      # 0x2ba4e
leaq -0x3f8(%rbp), %rdi
callq 0x52e0
jmp 0x23618
movq -0x6c8(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x3f8(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x23634
movq -0x6c8(%rbp), %rdi
movb $0x0, -0x3fa(%rbp)
leaq 0x16737(%rip), %rsi     # 0x39d80
leaq -0x1a340(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x23b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x23a69
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x23691
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x388(%rbp), %rdi
callq 0x6df0
leaq -0x3a8(%rbp), %rdi
callq 0x41e0
leaq -0x3d8(%rbp), %rdi
callq 0x285a0
jmp 0x23a69
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x236d4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x3f8(%rbp), %rdi
callq 0x41e0
leaq -0x3f9(%rbp), %rdi
callq 0x4360
testb $0x1, -0x3fa(%rbp)
jne 0x236eb
jmp 0x236f7
movq -0x6c8(%rbp), %rdi
callq 0x4230
jmp 0x23a69
jmp 0x237f4
movq -0x568(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x6d8(%rbp)
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
xorl %esi, %esi
callq *%rax
movq %rax, -0x6d0(%rbp)
jmp 0x2372b
movq -0x6d0(%rbp), %rsi
leaq -0x4c0(%rbp), %rdi
callq 0x24750
jmp 0x23740
leaq -0x490(%rbp), %rdi
movq %rdi, -0x6e0(%rbp)
leaq -0x4c0(%rbp), %rsi
callq 0x41d0
movq -0x6d8(%rbp), %rsi
movq -0x6e0(%rbp), %rdx
leaq -0x470(%rbp), %rdi
callq 0x6830
jmp 0x23776
leaq -0x318(%rbp), %rdi
leaq -0x470(%rbp), %rsi
callq 0x25d00
jmp 0x2378b
leaq -0x470(%rbp), %rdi
callq 0x6df0
leaq -0x490(%rbp), %rdi
callq 0x41e0
leaq -0x4c0(%rbp), %rdi
callq 0x285a0
jmp 0x237f4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x237d7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x470(%rbp), %rdi
callq 0x6df0
leaq -0x490(%rbp), %rdi
callq 0x41e0
leaq -0x4c0(%rbp), %rdi
callq 0x285a0
jmp 0x23a69
cmpl $0x3, -0x318(%rbp)
je 0x238d8
movb $0x1, -0x4e2(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x6f0(%rbp)
leaq -0x4e1(%rbp), %rdi
movq %rdi, -0x6e8(%rbp)
callq 0x4590
movq -0x6e8(%rbp), %rdx
leaq 0x8249(%rip), %rsi      # 0x2ba83
leaq -0x4e0(%rbp), %rdi
callq 0x52e0
jmp 0x23848
movq -0x6f0(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x4e0(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x23864
movq -0x6f0(%rbp), %rdi
movb $0x0, -0x4e2(%rbp)
leaq 0x16507(%rip), %rsi     # 0x39d80
leaq -0x1a570(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x23b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x238b0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x4e0(%rbp), %rdi
callq 0x41e0
leaq -0x4e1(%rbp), %rdi
callq 0x4360
testb $0x1, -0x4e2(%rbp)
jne 0x238c7
jmp 0x238d3
movq -0x6f0(%rbp), %rdi
callq 0x4230
jmp 0x23a69
testb $0x1, -0x2c8(%rbp)
jne 0x239bc
movb $0x1, -0x50a(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x700(%rbp)
leaq -0x509(%rbp), %rdi
movq %rdi, -0x6f8(%rbp)
callq 0x4590
movq -0x6f8(%rbp), %rdx
leaq 0x8189(%rip), %rsi      # 0x2baa7
leaq -0x508(%rbp), %rdi
callq 0x52e0
jmp 0x2392c
movq -0x700(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x508(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x23948
movq -0x700(%rbp), %rdi
movb $0x0, -0x50a(%rbp)
leaq 0x16423(%rip), %rsi     # 0x39d80
leaq -0x1a654(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x23b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x23994
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x508(%rbp), %rdi
callq 0x41e0
leaq -0x509(%rbp), %rdi
callq 0x4360
testb $0x1, -0x50a(%rbp)
jne 0x239ab
jmp 0x239b7
movq -0x700(%rbp), %rdi
callq 0x4230
jmp 0x23a69
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
movl $0x1, %esi
callq *%rax
movq %rax, -0x708(%rbp)
jmp 0x239d7
movq -0x708(%rbp), %rax
cmpl $0xd, 0x8(%rax)
jne 0x23a58
movq -0x10(%rbp), %rdi
movq (%rdi), %rax
movq 0x18(%rax), %rax
movl $0x1, %esi
callq *%rax
movq %rax, -0x710(%rbp)
jmp 0x239ff
leaq -0x2f0(%rbp), %rsi
leaq -0x530(%rbp), %rdi
callq 0x4150
jmp 0x23a14
movq -0x710(%rbp), %rsi
movq -0x568(%rbp), %rdi
leaq -0x530(%rbp), %rdx
callq 0x21250
jmp 0x23a30
leaq -0x530(%rbp), %rdi
callq 0x41e0
jmp 0x23a58
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x530(%rbp), %rdi
callq 0x41e0
jmp 0x23a69
leaq -0x318(%rbp), %rdi
callq 0x6df0
jmp 0x23b75
leaq -0x318(%rbp), %rdi
callq 0x6df0
jmp 0x23b7e
movq -0x568(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x20d50
jmp 0x23b75
movq -0x568(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x24780
jmp 0x23b75
movb $0x1, -0x552(%rbp)
movl $0x50, %edi
callq 0x4190
movq %rax, -0x720(%rbp)
leaq -0x551(%rbp), %rdi
movq %rdi, -0x718(%rbp)
callq 0x4590
movq -0x718(%rbp), %rdx
leaq 0x7fec(%rip), %rsi      # 0x2bac9
leaq -0x550(%rbp), %rdi
callq 0x52e0
jmp 0x23aeb
movq -0x720(%rbp), %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leaq -0x550(%rbp), %rcx
movl %edx, %esi
callq 0x9140
jmp 0x23b07
movq -0x720(%rbp), %rdi
movb $0x0, -0x552(%rbp)
leaq 0x16264(%rip), %rsi     # 0x39d80
leaq -0x1a813(%rip), %rdx    # 0x9310
callq 0x4550
jmp 0x23b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x23b50
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x550(%rbp), %rdi
callq 0x41e0
leaq -0x551(%rbp), %rdi
callq 0x4360
testb $0x1, -0x552(%rbp)
jne 0x23b67
jmp 0x23b73
movq -0x720(%rbp), %rdi
callq 0x4230
jmp 0x23b7e
addq $0x720, %rsp            # imm = 0x720
popq %rbp
retq
movq -0x48(%rbp), %rdi
callq 0x4580
nopw (%rax,%rax)