// File: pixlark[P]Badge/src/vm.cc
// Function: VM::step()
VM_Response step()
	{	
		if (halted()) {
			return VM_HALTED;
		}
		
		/* Manage call stack and VM halting */
		Call_Frame * frame;
		{
			frame = frame_reference();
			
			// If our call frame has come to an implicit end
			while (frame->bc_pointer >= frame->bc_length) {
				assert(stack.size > 0);

				if (call_stack.size == 1) {
					// If we're about to return from global scope, we
					// need to do some special stuff
					do_halting_tasks();
					return_function();
					return VM_HALTED;
				}
				return_function();
				
				// Update frame reference
				frame = frame_reference();
			}
		}
		
		BC bc = frame->bytecode[frame->bc_pointer++];
		current_assoc = bc.assoc;
		
		switch (bc.kind) {
		case BC_NOP: break;
		case BC_POP_AND_DISCARD: {
			pop();
		} break;
		case BC_LOAD_CONST: {
			push(bc.arg.value);
		} break;
		case BC_DUPLICATE: {
			push(stack[stack.size - 1]);
		} break;
		case BC_CREATE_BINDING: {
			auto symbol = pop_symbol();
			auto value = pop();
			create_binding(symbol, value);
		} break;
		case BC_UPDATE_BINDING: {
			auto symbol = pop_symbol();
			auto value = pop();
			if (!frame->environment->update_binding(symbol, value)) {
				error("Tried to set unbound variable '%s'", symbol);
			}
		} break;
		case BC_RESOLVE_BINDING: {
			auto symbol = pop_symbol();
			auto value = resolve_binding(symbol);
			push(value);
		} break;
		case BC_ADD: {
			auto b = pop();
			auto a = pop();
			push(Value::add(a, b, bc.assoc));
		} break;
		case BC_SUBTRACT: {
			auto b = pop();
			auto a = pop();
			push(Value::subtract(a, b, bc.assoc));
		} break;
		case BC_MULTIPLY: {
			auto b = pop();
			auto a = pop();
			push(Value::multiply(a, b, bc.assoc));
		} break;
		case BC_DIVIDE: {
			auto b = pop();
			auto a = pop();
			push(Value::divide(a, b, bc.assoc));
		} break;
		case BC_NEGATE: {
			auto a = pop();
			push(Value::subtract(Value::raise(0), a, bc.assoc));
		} break;
		case BC_EQUAL: {
			auto b = pop();
			auto a = pop();
			push(Value::raise_bool(Value::equal(a, b, bc.assoc)));
		} break;
		case BC_NOT_EQUAL: {
			auto b = pop();
			auto a = pop();
			push(Value::raise_bool(!Value::equal(a, b, bc.assoc)));
		} break;
		case BC_GREATER_THAN: {
			auto b = pop();
			auto a = pop();
			push(Value::raise_bool(Value::greater_than(a, b, bc.assoc)));
		} break;
		case BC_LESS_THAN: {
			auto b = pop();
			auto a = pop();
			push(Value::raise_bool(Value::less_than(a, b, bc.assoc)));
		} break;
		case BC_GREATER_THAN_OR_EQUAL_TO: {
			auto b = pop();
			auto a = pop();
			push(Value::raise_bool(Value::greater_than_or_equal_to(a, b, bc.assoc)));
		} break;
		case BC_LESS_THAN_OR_EQUAL_TO: {
			auto b = pop();
			auto a = pop();
			push(Value::raise_bool(Value::less_than_or_equal_to(a, b, bc.assoc)));
		} break;
		case BC_AND: {
			auto b = pop();
			auto a = pop();
			push(Value::raise_bool(Value::_and(a, b, bc.assoc)));
		} break;
		case BC_OR: {
			auto b = pop();
			auto a = pop();
			push(Value::raise_bool(Value::_or(a, b, bc.assoc)));
		} break;
		case BC_NOT: {
			auto a = pop();
			push(Value::raise_bool(!a.truthy()));
		} break;
		case BC_CONSTRUCT_FUNCTION: {
			auto count = pop_integer();
			
			Function * func = (Function*) GC::alloc(sizeof(Function));
			func->block_reference = bc.arg.block_reference;

			// Insert parameters
			func->parameter_count = count;
			func->parameters = (Symbol*) GC::alloc(sizeof(Symbol) * count);
			for (int i = 0; i < count; i++) {
				auto it = pop_symbol();
				func->parameters[count - i - 1] = it;
			}

			// Close over local environment
			func->closure = frame->environment;
			
			// Create and push value
			Value value = Value::create(TYPE_FUNCTION);
			value.ref_function = func;
			push(value);
		} break;
		case BC_POP_AND_CALL_FUNCTION: {
			auto func_val = pop();
			if (func_val.is(TYPE_BUILTIN)) {
				// If this is a builtin function, override everything and just do a builtin call
				auto builtin = func_val.builtin;
				auto passed_arg_count = pop_integer();
				if (passed_arg_count != builtin->arg_count) {
					error("Function takes %d arguments; was passed %d",
						  builtin->arg_count,
						  passed_arg_count);
				}
				Value * args = (Value*) malloc(sizeof(Value) * builtin->arg_count);
				defer { free(args); };
				for (int i = 0; i < builtin->arg_count; i++) {
					args[i] = pop();
				}
				push((builtin->funcptr)(args));
			} else if (func_val.is(TYPE_CONSTRUCTOR)) {
				auto ctor = func_val.ref_constructor;
				auto object = (Object*) GC::alloc(sizeof(Object));
				object->fields.alloc(symbol_comparator);

				auto passed_arg_count = pop_integer();
				if (passed_arg_count != ctor->field_count) {
					error("Constructor has %d fields; was passed %d",
						  ctor->field_count,
						  passed_arg_count);
				}

				for (int i = 0; i < ctor->field_count; i++) {
					auto val = pop();
					auto symbol = ctor->fields[i];
					object->fields.add(symbol, val);
				}

				auto val = Value::create(TYPE_OBJECT);
				val.ref_object = object;
				push(val);
			} else {
				// Otherwise, this is a normal function
				func_val.assert_is(TYPE_FUNCTION);
				auto func = func_val.ref_function;
				auto passed_arg_count = pop_integer();
				if (passed_arg_count != func->parameter_count) {
					error("Function takes %d arguments; was passed %d",
						  func->parameter_count,
						  passed_arg_count);
				}

				#if TAIL_CALL_OPTIMIZATION
				{
					bool is_tail_call = true;
					size_t ptr = frame->bc_pointer;
					while (ptr < frame->bc_length) {
						auto kind = frame->bytecode[ptr].kind;
						if (kind == BC_RETURN) {
							break;
						}
						if (!BC::tail_call_safe(kind)) {
							is_tail_call = false;
							break;
						}
						ptr++;
					}
					if (is_tail_call) {
						return_function();
					}
				}
				#endif
				
				// Create our new call frame
				call_stack.push(Call_Frame::alloc(blocks, func->block_reference,
												  func, func->closure));
				
				// Create bindings to pushed arguments
				for (int i = 0; i < passed_arg_count; i++) {
					auto value = pop();
					create_binding(func->parameters[i], value);
				}
			}
		} break;
		case BC_RETURN: {
			// WARNING: `frame` invalidated here! Don't use it!
			return_function();
		} break;
		case BC_THIS_FUNCTION: {
			auto func = Value::create(TYPE_FUNCTION);
			if (!frame->origin) {
				error("Invalid use of this -- not in a function!");
			}
			func.ref_function = frame->origin;
			push(func);
		} break;
		case BC_SYMBOL_TO_STRING: {
			auto symbol = pop_symbol();
			auto string = (String*) GC::alloc(sizeof(String));
			string->length = strlen(symbol);
			string->string = (char*) GC::alloc(sizeof(char) * string->length);
			strncpy(string->string, symbol, string->length);
			auto value = Value::create(TYPE_STRING);
			value.ref_string = string;
			push(value);
		} break;
		case BC_JUMP: {
			frame->bc_pointer = bc.arg.integer;
		} break;
		case BC_POP_JUMP: {
			auto a = pop();
			if (a.type != TYPE_NOTHING) {
				frame->bc_pointer = bc.arg.integer;
			}
		} break;
		case BC_ENTER_SCOPE: {
			auto new_env = Environment::alloc();
			new_env->next_env = frame->environment;
			frame->environment = new_env;
		} break;
		case BC_EXIT_SCOPE: {
			frame->environment = frame->environment->next_env;
			GC::heuristic_exit_scope();
		} break;
		case BC_CONSTRUCT_CONSTRUCTOR: {
			auto count = pop_integer();
			auto ctor = (Constructor*) GC::alloc(sizeof(Constructor));
			ctor->fields = (Symbol*) GC::alloc(sizeof(Symbol) * count);
			ctor->field_count = count;
			for (int i = 0; i < count; i++) {
				ctor->fields[i] = pop_symbol();
			}
			auto val = Value::create(TYPE_CONSTRUCTOR);
			val.ref_constructor = ctor;
			push(val);
		} break;
		case BC_RESOLVE_FIELD: {
			auto symbol = pop_symbol();
			auto obj_val = pop();
			if (!obj_val.is(TYPE_OBJECT)) {
				error("Cannot access field of non-object");
			}
			auto obj = obj_val.ref_object;
			if (!obj->fields.bound(symbol)) {
				error("No such field %s on object", symbol);
			}
			auto resolved = obj->fields.lookup(symbol);
			push(resolved);
		} break;
		case BC_UPDATE_FIELD: {
			auto symbol = pop_symbol();
			auto obj_val = pop();
			if (!obj_val.is(TYPE_OBJECT)) {
				error("Cannot access field of non-object");
			}
			auto obj = obj_val.ref_object;
			if (!obj->fields.bound(symbol)) {
				error("No such field %s on object", symbol);
			}
			auto val = pop();
			obj->fields.update(symbol, val);
		} break;
		case BC_PUSH_BODY: {
			frame->body_stack.push(bc.arg.integer);
		} break;
		case BC_BREAK_BODY: {
			if (frame->body_stack.size == 0) {
				error("Nothing to break out of");
			}
			int exit_pos = frame->body_stack.pop();
			frame->bc_pointer = exit_pos;
		} break;
		case BC_RUN_FILE_UNIT: {
			block_reference_to_push = pop_integer();
			push(Value::nothing());
			return VM_SWITCH;
		} break;
		case BC_EXPORT_SYMBOL: {
			auto symbol = pop_symbol();
			export_queue.push((Export) { symbol, bc.assoc });
			push(Value::nothing());
		} break;
		case BC_GET_CALL_FLAG: {
			auto symbol_val = bc.arg.value;
			if (!symbol_val.is(TYPE_SYMBOL)) {
				fatal("Can't lookup call-flag for non-symbol. (This error should never trigger!)");
			}
			auto symbol = symbol_val.symbol;
			push(lookup_call_flag(symbol));
		} break;
		default: {
			fatal("Internal error: VM ran unrecognized instruction");
		}
		}

		return VM_OK;
	}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x810, %rsp            # imm = 0x810
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rdi
movq %rdi, -0x7e0(%rbp)
callq 0xd090
testb $0x1, %al
jne 0x83b5
jmp 0x83c1
movl $0x1, -0x4(%rbp)
jmp 0x9dcf
movq -0x7e0(%rbp), %rdi
callq 0xd0b0
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x18(%rbp), %rcx
cmpq 0x30(%rcx), %rax
jb 0x8469
movq -0x7e0(%rbp), %rax
cmpq $0x0, 0x40(%rax)
jbe 0x83f7
jmp 0x8416
leaq 0x8d5e(%rip), %rdi      # 0x1115c
leaq 0x8bc1(%rip), %rsi      # 0x10fc6
movl $0xe2, %edx
leaq 0x8bbf(%rip), %rcx      # 0x10fd0
callq 0x10d0
movq -0x7e0(%rbp), %rax
cmpq $0x1, 0x68(%rax)
jne 0x8448
movq -0x7e0(%rbp), %rdi
callq 0xd110
movq -0x7e0(%rbp), %rdi
callq 0xd1f0
movl $0x1, -0x4(%rbp)
jmp 0x9dcf
movq -0x7e0(%rbp), %rdi
callq 0xd1f0
movq -0x7e0(%rbp), %rdi
callq 0xd0b0
movq %rax, -0x18(%rbp)
jmp 0x83d1
movq -0x7e0(%rbp), %rax
movq -0x18(%rbp), %rsi
movq 0x20(%rsi), %rcx
movq 0x28(%rsi), %rdx
movq %rdx, %rdi
incq %rdi
movq %rdi, 0x28(%rsi)
leaq (%rdx,%rdx,2), %rdx
movq 0x10(%rcx,%rdx,8), %rsi
movq %rsi, -0x20(%rbp)
movups (%rcx,%rdx,8), %xmm0
movaps %xmm0, -0x30(%rbp)
movl -0x2c(%rbp), %ecx
movl %ecx, 0x88(%rax)
movl -0x30(%rbp), %eax
movq %rax, -0x7e8(%rbp)
subq $0x25, %rax
ja 0x9dba
movq -0x7e8(%rbp), %rax
leaq 0x7e3e(%rip), %rcx      # 0x10304
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movl %eax, -0x40(%rbp)
movq %rdx, -0x38(%rbp)
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
movq -0x28(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x48(%rbp)
movl -0x50(%rbp), %esi
movq -0x48(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rax
movq %rax, %rdi
addq $0x38, %rdi
movq 0x40(%rax), %rsi
subq $0x1, %rsi
callq 0xa140
movq -0x7e0(%rbp), %rdi
movq (%rax), %rcx
movq %rcx, -0x60(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0x58(%rbp)
movl -0x60(%rbp), %esi
movq -0x58(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd2b0
movq -0x7e0(%rbp), %rdi
movq %rax, -0x68(%rbp)
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0x78(%rbp)
movq %rdx, -0x70(%rbp)
movq -0x68(%rbp), %rsi
movq -0x78(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x70(%rbp), %rax
movq %rax, -0x80(%rbp)
movl -0x88(%rbp), %edx
movq -0x80(%rbp), %rcx
callq 0xd2f0
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd2b0
movq -0x7e0(%rbp), %rdi
movq %rax, -0x90(%rbp)
callq 0xd240
movl %eax, -0xa0(%rbp)
movq %rdx, -0x98(%rbp)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x90(%rbp), %rsi
movq -0xa0(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0x98(%rbp), %rax
movq %rax, -0xa8(%rbp)
movl -0xb0(%rbp), %edx
movq -0xa8(%rbp), %rcx
callq 0xd370
testb $0x1, %al
jne 0x8634
movq -0x7e0(%rbp), %rdi
movq -0x90(%rbp), %rdx
leaq 0x89ba(%rip), %rsi      # 0x10fe7
movb $0x0, %al
callq 0xd470
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd2b0
movq -0x7e0(%rbp), %rdi
movq %rax, -0xb8(%rbp)
movq -0xb8(%rbp), %rsi
callq 0xd510
movq -0x7e0(%rbp), %rdi
movl %eax, -0xc8(%rbp)
movq %rdx, -0xc0(%rbp)
movq -0xc8(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0xc0(%rbp), %rax
movq %rax, -0xd0(%rbp)
movl -0xd8(%rbp), %esi
movq -0xd0(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0xe8(%rbp)
movq %rdx, -0xe0(%rbp)
callq 0xd240
movl %eax, -0xf8(%rbp)
movq %rdx, -0xf0(%rbp)
movq -0xf8(%rbp), %rax
movq %rax, -0x118(%rbp)
movq -0xf0(%rbp), %rax
movq %rax, -0x110(%rbp)
movq -0xe8(%rbp), %rax
movq %rax, -0x128(%rbp)
movq -0xe0(%rbp), %rax
movq %rax, -0x120(%rbp)
movl -0x2c(%rbp), %r8d
movl -0x118(%rbp), %edi
movq -0x110(%rbp), %rsi
movl -0x128(%rbp), %edx
movq -0x120(%rbp), %rcx
callq 0x5540
movq -0x7e0(%rbp), %rdi
movl %eax, -0x108(%rbp)
movq %rdx, -0x100(%rbp)
movl -0x108(%rbp), %esi
movq -0x100(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0x138(%rbp)
movq %rdx, -0x130(%rbp)
callq 0xd240
movl %eax, -0x148(%rbp)
movq %rdx, -0x140(%rbp)
movq -0x148(%rbp), %rax
movq %rax, -0x168(%rbp)
movq -0x140(%rbp), %rax
movq %rax, -0x160(%rbp)
movq -0x138(%rbp), %rax
movq %rax, -0x178(%rbp)
movq -0x130(%rbp), %rax
movq %rax, -0x170(%rbp)
movl -0x2c(%rbp), %r8d
movl -0x168(%rbp), %edi
movq -0x160(%rbp), %rsi
movl -0x178(%rbp), %edx
movq -0x170(%rbp), %rcx
callq 0x5640
movq -0x7e0(%rbp), %rdi
movl %eax, -0x158(%rbp)
movq %rdx, -0x150(%rbp)
movl -0x158(%rbp), %esi
movq -0x150(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0x188(%rbp)
movq %rdx, -0x180(%rbp)
callq 0xd240
movl %eax, -0x198(%rbp)
movq %rdx, -0x190(%rbp)
movq -0x198(%rbp), %rax
movq %rax, -0x1b8(%rbp)
movq -0x190(%rbp), %rax
movq %rax, -0x1b0(%rbp)
movq -0x188(%rbp), %rax
movq %rax, -0x1c8(%rbp)
movq -0x180(%rbp), %rax
movq %rax, -0x1c0(%rbp)
movl -0x2c(%rbp), %r8d
movl -0x1b8(%rbp), %edi
movq -0x1b0(%rbp), %rsi
movl -0x1c8(%rbp), %edx
movq -0x1c0(%rbp), %rcx
callq 0x56e0
movq -0x7e0(%rbp), %rdi
movl %eax, -0x1a8(%rbp)
movq %rdx, -0x1a0(%rbp)
movl -0x1a8(%rbp), %esi
movq -0x1a0(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0x1d8(%rbp)
movq %rdx, -0x1d0(%rbp)
callq 0xd240
movl %eax, -0x1e8(%rbp)
movq %rdx, -0x1e0(%rbp)
movq -0x1e8(%rbp), %rax
movq %rax, -0x208(%rbp)
movq -0x1e0(%rbp), %rax
movq %rax, -0x200(%rbp)
movq -0x1d8(%rbp), %rax
movq %rax, -0x218(%rbp)
movq -0x1d0(%rbp), %rax
movq %rax, -0x210(%rbp)
movl -0x2c(%rbp), %r8d
movl -0x208(%rbp), %edi
movq -0x200(%rbp), %rsi
movl -0x218(%rbp), %edx
movq -0x210(%rbp), %rcx
callq 0x5780
movq -0x7e0(%rbp), %rdi
movl %eax, -0x1f8(%rbp)
movq %rdx, -0x1f0(%rbp)
movl -0x1f8(%rbp), %esi
movq -0x1f0(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movl %eax, -0x228(%rbp)
movq %rdx, -0x220(%rbp)
xorl %edi, %edi
callq 0x77b0
movl %eax, -0x248(%rbp)
movq %rdx, -0x240(%rbp)
movq -0x228(%rbp), %rax
movq %rax, -0x258(%rbp)
movq -0x220(%rbp), %rax
movq %rax, -0x250(%rbp)
movl -0x2c(%rbp), %r8d
movl -0x248(%rbp), %edi
movq -0x240(%rbp), %rsi
movl -0x258(%rbp), %edx
movq -0x250(%rbp), %rcx
callq 0x5640
movq -0x7e0(%rbp), %rdi
movl %eax, -0x238(%rbp)
movq %rdx, -0x230(%rbp)
movl -0x238(%rbp), %esi
movq -0x230(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0x268(%rbp)
movq %rdx, -0x260(%rbp)
callq 0xd240
movl %eax, -0x278(%rbp)
movq %rdx, -0x270(%rbp)
movq -0x278(%rbp), %rax
movq %rax, -0x298(%rbp)
movq -0x270(%rbp), %rax
movq %rax, -0x290(%rbp)
movq -0x268(%rbp), %rax
movq %rax, -0x2a8(%rbp)
movq -0x260(%rbp), %rax
movq %rax, -0x2a0(%rbp)
movl -0x2c(%rbp), %r8d
movl -0x298(%rbp), %edi
movq -0x290(%rbp), %rsi
movl -0x2a8(%rbp), %edx
movq -0x2a0(%rbp), %rcx
callq 0x5820
movzbl %al, %edi
andl $0x1, %edi
callq 0xd5f0
movq -0x7e0(%rbp), %rdi
movl %eax, -0x288(%rbp)
movq %rdx, -0x280(%rbp)
movl -0x288(%rbp), %esi
movq -0x280(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0x2b8(%rbp)
movq %rdx, -0x2b0(%rbp)
callq 0xd240
movl %eax, -0x2c8(%rbp)
movq %rdx, -0x2c0(%rbp)
movq -0x2c8(%rbp), %rax
movq %rax, -0x2e8(%rbp)
movq -0x2c0(%rbp), %rax
movq %rax, -0x2e0(%rbp)
movq -0x2b8(%rbp), %rax
movq %rax, -0x2f8(%rbp)
movq -0x2b0(%rbp), %rax
movq %rax, -0x2f0(%rbp)
movl -0x2c(%rbp), %r8d
movl -0x2e8(%rbp), %edi
movq -0x2e0(%rbp), %rsi
movl -0x2f8(%rbp), %edx
movq -0x2f0(%rbp), %rcx
callq 0x5820
xorb $-0x1, %al
movzbl %al, %edi
andl $0x1, %edi
callq 0xd5f0
movq -0x7e0(%rbp), %rdi
movl %eax, -0x2d8(%rbp)
movq %rdx, -0x2d0(%rbp)
movl -0x2d8(%rbp), %esi
movq -0x2d0(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0x308(%rbp)
movq %rdx, -0x300(%rbp)
callq 0xd240
movl %eax, -0x318(%rbp)
movq %rdx, -0x310(%rbp)
movq -0x318(%rbp), %rax
movq %rax, -0x338(%rbp)
movq -0x310(%rbp), %rax
movq %rax, -0x330(%rbp)
movq -0x308(%rbp), %rax
movq %rax, -0x348(%rbp)
movq -0x300(%rbp), %rax
movq %rax, -0x340(%rbp)
movl -0x2c(%rbp), %r8d
movl -0x338(%rbp), %edi
movq -0x330(%rbp), %rsi
movl -0x348(%rbp), %edx
movq -0x340(%rbp), %rcx
callq 0x5ab0
movzbl %al, %edi
andl $0x1, %edi
callq 0xd5f0
movq -0x7e0(%rbp), %rdi
movl %eax, -0x328(%rbp)
movq %rdx, -0x320(%rbp)
movl -0x328(%rbp), %esi
movq -0x320(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0x358(%rbp)
movq %rdx, -0x350(%rbp)
callq 0xd240
movl %eax, -0x368(%rbp)
movq %rdx, -0x360(%rbp)
movq -0x368(%rbp), %rax
movq %rax, -0x388(%rbp)
movq -0x360(%rbp), %rax
movq %rax, -0x380(%rbp)
movq -0x358(%rbp), %rax
movq %rax, -0x398(%rbp)
movq -0x350(%rbp), %rax
movq %rax, -0x390(%rbp)
movl -0x2c(%rbp), %r8d
movl -0x388(%rbp), %edi
movq -0x380(%rbp), %rsi
movl -0x398(%rbp), %edx
movq -0x390(%rbp), %rcx
callq 0x5a20
movzbl %al, %edi
andl $0x1, %edi
callq 0xd5f0
movq -0x7e0(%rbp), %rdi
movl %eax, -0x378(%rbp)
movq %rdx, -0x370(%rbp)
movl -0x378(%rbp), %esi
movq -0x370(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0x3a8(%rbp)
movq %rdx, -0x3a0(%rbp)
callq 0xd240
movl %eax, -0x3b8(%rbp)
movq %rdx, -0x3b0(%rbp)
movq -0x3b8(%rbp), %rax
movq %rax, -0x3d8(%rbp)
movq -0x3b0(%rbp), %rax
movq %rax, -0x3d0(%rbp)
movq -0x3a8(%rbp), %rax
movq %rax, -0x3e8(%rbp)
movq -0x3a0(%rbp), %rax
movq %rax, -0x3e0(%rbp)
movl -0x2c(%rbp), %r8d
movl -0x3d8(%rbp), %edi
movq -0x3d0(%rbp), %rsi
movl -0x3e8(%rbp), %edx
movq -0x3e0(%rbp), %rcx
callq 0x5bd0
movzbl %al, %edi
andl $0x1, %edi
callq 0xd5f0
movq -0x7e0(%rbp), %rdi
movl %eax, -0x3c8(%rbp)
movq %rdx, -0x3c0(%rbp)
movl -0x3c8(%rbp), %esi
movq -0x3c0(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0x3f8(%rbp)
movq %rdx, -0x3f0(%rbp)
callq 0xd240
movl %eax, -0x408(%rbp)
movq %rdx, -0x400(%rbp)
movq -0x408(%rbp), %rax
movq %rax, -0x428(%rbp)
movq -0x400(%rbp), %rax
movq %rax, -0x420(%rbp)
movq -0x3f8(%rbp), %rax
movq %rax, -0x438(%rbp)
movq -0x3f0(%rbp), %rax
movq %rax, -0x430(%rbp)
movl -0x2c(%rbp), %r8d
movl -0x428(%rbp), %edi
movq -0x420(%rbp), %rsi
movl -0x438(%rbp), %edx
movq -0x430(%rbp), %rcx
callq 0x5b40
movzbl %al, %edi
andl $0x1, %edi
callq 0xd5f0
movq -0x7e0(%rbp), %rdi
movl %eax, -0x418(%rbp)
movq %rdx, -0x410(%rbp)
movl -0x418(%rbp), %esi
movq -0x410(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0x448(%rbp)
movq %rdx, -0x440(%rbp)
callq 0xd240
movl %eax, -0x458(%rbp)
movq %rdx, -0x450(%rbp)
movq -0x458(%rbp), %rax
movq %rax, -0x478(%rbp)
movq -0x450(%rbp), %rax
movq %rax, -0x470(%rbp)
movq -0x448(%rbp), %rax
movq %rax, -0x488(%rbp)
movq -0x440(%rbp), %rax
movq %rax, -0x480(%rbp)
movl -0x2c(%rbp), %r8d
movl -0x478(%rbp), %edi
movq -0x470(%rbp), %rsi
movl -0x488(%rbp), %edx
movq -0x480(%rbp), %rcx
callq 0x5980
movzbl %al, %edi
andl $0x1, %edi
callq 0xd5f0
movq -0x7e0(%rbp), %rdi
movl %eax, -0x468(%rbp)
movq %rdx, -0x460(%rbp)
movl -0x468(%rbp), %esi
movq -0x460(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0x498(%rbp)
movq %rdx, -0x490(%rbp)
callq 0xd240
movl %eax, -0x4a8(%rbp)
movq %rdx, -0x4a0(%rbp)
movq -0x4a8(%rbp), %rax
movq %rax, -0x4c8(%rbp)
movq -0x4a0(%rbp), %rax
movq %rax, -0x4c0(%rbp)
movq -0x498(%rbp), %rax
movq %rax, -0x4d8(%rbp)
movq -0x490(%rbp), %rax
movq %rax, -0x4d0(%rbp)
movl -0x2c(%rbp), %r8d
movl -0x4c8(%rbp), %edi
movq -0x4c0(%rbp), %rsi
movl -0x4d8(%rbp), %edx
movq -0x4d0(%rbp), %rcx
callq 0x59d0
movzbl %al, %edi
andl $0x1, %edi
callq 0xd5f0
movq -0x7e0(%rbp), %rdi
movl %eax, -0x4b8(%rbp)
movq %rdx, -0x4b0(%rbp)
movl -0x4b8(%rbp), %esi
movq -0x4b0(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movl %eax, -0x4e8(%rbp)
movq %rdx, -0x4e0(%rbp)
leaq -0x4e8(%rbp), %rdi
callq 0x77e0
xorb $-0x1, %al
movzbl %al, %edi
andl $0x1, %edi
callq 0xd5f0
movq -0x7e0(%rbp), %rdi
movl %eax, -0x4f8(%rbp)
movq %rdx, -0x4f0(%rbp)
movl -0x4f8(%rbp), %esi
movq -0x4f0(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd640
movl %eax, -0x4fc(%rbp)
movl $0x20, %edi
callq 0x5130
movq %rax, -0x508(%rbp)
movq -0x28(%rbp), %rcx
movq -0x508(%rbp), %rax
movq %rcx, 0x10(%rax)
movslq -0x4fc(%rbp), %rcx
movq -0x508(%rbp), %rax
movq %rcx, 0x8(%rax)
movslq -0x4fc(%rbp), %rdi
shlq $0x3, %rdi
callq 0x5130
movq %rax, %rcx
movq -0x508(%rbp), %rax
movq %rcx, (%rax)
movl $0x0, -0x50c(%rbp)
movl -0x50c(%rbp), %eax
cmpl -0x4fc(%rbp), %eax
jge 0x9158
movq -0x7e0(%rbp), %rdi
callq 0xd2b0
movq %rax, -0x518(%rbp)
movq -0x518(%rbp), %rdx
movq -0x508(%rbp), %rax
movq (%rax), %rax
movl -0x4fc(%rbp), %ecx
subl -0x50c(%rbp), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movq %rdx, (%rax,%rcx,8)
movl -0x50c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x50c(%rbp)
jmp 0x90ff
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x508(%rbp), %rax
movq %rcx, 0x18(%rax)
movl $0x5, %edi
callq 0xc570
movq -0x7e0(%rbp), %rdi
movl %eax, -0x528(%rbp)
movq %rdx, -0x520(%rbp)
movq -0x508(%rbp), %rax
movq %rax, -0x520(%rbp)
movq -0x528(%rbp), %rax
movq %rax, -0x538(%rbp)
movq -0x520(%rbp), %rax
movq %rax, -0x530(%rbp)
movl -0x538(%rbp), %esi
movq -0x530(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movl %eax, -0x548(%rbp)
movq %rdx, -0x540(%rbp)
leaq -0x548(%rbp), %rdi
movl $0x3, %esi
callq 0x7800
testb $0x1, %al
jne 0x91fd
jmp 0x93b4
movq -0x7e0(%rbp), %rdi
movq -0x540(%rbp), %rax
movq %rax, -0x550(%rbp)
callq 0xd640
movl %eax, -0x554(%rbp)
movslq -0x554(%rbp), %rax
movq -0x550(%rbp), %rcx
cmpq 0x8(%rcx), %rax
je 0x9257
movq -0x7e0(%rbp), %rdi
movq -0x550(%rbp), %rax
movq 0x8(%rax), %rdx
movl -0x554(%rbp), %ecx
leaq 0x7dba(%rip), %rsi      # 0x1100a
movb $0x0, %al
callq 0xd470
movq -0x550(%rbp), %rax
movq 0x8(%rax), %rdi
shlq $0x4, %rdi
callq 0x11f0
movq %rax, -0x560(%rbp)
leaq -0x560(%rbp), %rax
movq %rax, -0x578(%rbp)
leaq -0x568(%rbp), %rdi
leaq -0x578(%rbp), %rsi
callq 0xd680
movl $0x0, -0x57c(%rbp)
movslq -0x57c(%rbp), %rax
movq -0x550(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jae 0x934b
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq %rdx, -0x7f8(%rbp)
movl %eax, -0x7ec(%rbp)
jmp 0x92d0
movq -0x7f8(%rbp), %rax
movl -0x7ec(%rbp), %ecx
movl %ecx, -0x590(%rbp)
movq %rax, -0x588(%rbp)
movq -0x560(%rbp), %rax
movslq -0x57c(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movq -0x590(%rbp), %rcx
movq %rcx, (%rax)
movq -0x588(%rbp), %rcx
movq %rcx, 0x8(%rax)
movl -0x57c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x57c(%rbp)
jmp 0x929d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x598(%rbp)
movl %eax, -0x59c(%rbp)
leaq -0x568(%rbp), %rdi
callq 0xd6c0
jmp 0x9ddb
movq -0x550(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x560(%rbp), %rdi
callq *%rax
movq %rdx, -0x808(%rbp)
movl %eax, -0x7fc(%rbp)
jmp 0x936e
movq -0x7e0(%rbp), %rdi
movq -0x808(%rbp), %rax
movl -0x7fc(%rbp), %ecx
movl %ecx, -0x5b0(%rbp)
movq %rax, -0x5a8(%rbp)
movl -0x5b0(%rbp), %esi
movq -0x5a8(%rbp), %rdx
callq 0xd270
jmp 0x93a3
leaq -0x568(%rbp), %rdi
callq 0xd6c0
jmp 0x9727
leaq -0x548(%rbp), %rdi
movl $0x6, %esi
callq 0x7800
testb $0x1, %al
jne 0x93ce
jmp 0x9552
movq -0x540(%rbp), %rax
movq %rax, -0x5b8(%rbp)
movl $0x58, %edi
callq 0x5130
movq %rax, -0x5c0(%rbp)
movq -0x5c0(%rbp), %rdi
leaq -0x7c0b(%rip), %rsi     # 0x17f0
callq 0xd6f0
movq -0x7e0(%rbp), %rdi
callq 0xd640
movl %eax, -0x5c4(%rbp)
movslq -0x5c4(%rbp), %rax
movq -0x5b8(%rbp), %rcx
cmpq 0x8(%rcx), %rax
je 0x944c
movq -0x7e0(%rbp), %rdi
movq -0x5b8(%rbp), %rax
movq 0x8(%rax), %rdx
movl -0x5c4(%rbp), %ecx
leaq 0x7bf0(%rip), %rsi      # 0x11035
movb $0x0, %al
callq 0xd470
movl $0x0, -0x5c8(%rbp)
movslq -0x5c8(%rbp), %rax
movq -0x5b8(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jae 0x94f3
movq -0x7e0(%rbp), %rdi
callq 0xd240
movl %eax, -0x5d8(%rbp)
movq %rdx, -0x5d0(%rbp)
movq -0x5b8(%rbp), %rax
movq (%rax), %rax
movslq -0x5c8(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x5e0(%rbp)
movq -0x5c0(%rbp), %rdi
movq -0x5e0(%rbp), %rsi
movq -0x5d8(%rbp), %rax
movq %rax, -0x5f0(%rbp)
movq -0x5d0(%rbp), %rax
movq %rax, -0x5e8(%rbp)
movl -0x5f0(%rbp), %edx
movq -0x5e8(%rbp), %rcx
callq 0xd740
movl -0x5c8(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x5c8(%rbp)
jmp 0x9456
movl $0x7, %edi
callq 0xc570
movq -0x7e0(%rbp), %rdi
movl %eax, -0x600(%rbp)
movq %rdx, -0x5f8(%rbp)
movq -0x5c0(%rbp), %rax
movq %rax, -0x5f8(%rbp)
movq -0x600(%rbp), %rax
movq %rax, -0x610(%rbp)
movq -0x5f8(%rbp), %rax
movq %rax, -0x608(%rbp)
movl -0x610(%rbp), %esi
movq -0x608(%rbp), %rdx
callq 0xd270
jmp 0x9725
leaq -0x548(%rbp), %rdi
movl $0x5, %esi
callq 0xd7c0
movq -0x7e0(%rbp), %rdi
movq -0x540(%rbp), %rax
movq %rax, -0x618(%rbp)
callq 0xd640
movl %eax, -0x61c(%rbp)
movslq -0x61c(%rbp), %rax
movq -0x618(%rbp), %rcx
cmpq 0x8(%rcx), %rax
je 0x95bd
movq -0x7e0(%rbp), %rdi
movq -0x618(%rbp), %rax
movq 0x8(%rax), %rdx
movl -0x61c(%rbp), %ecx
leaq 0x7a54(%rip), %rsi      # 0x1100a
movb $0x0, %al
callq 0xd470
movb $0x1, -0x61d(%rbp)
movq -0x18(%rbp), %rax
movq 0x28(%rax), %rax
movq %rax, -0x628(%rbp)
movq -0x628(%rbp), %rax
movq -0x18(%rbp), %rcx
cmpq 0x30(%rcx), %rax
jae 0x9636
movq -0x18(%rbp), %rax
movq 0x20(%rax), %rax
imulq $0x18, -0x628(%rbp), %rcx
addq %rcx, %rax
movl (%rax), %eax
movl %eax, -0x62c(%rbp)
cmpl $0x14, -0x62c(%rbp)
jne 0x960a
jmp 0x9636
movl -0x62c(%rbp), %edi
callq 0xd810
testb $0x1, %al
jne 0x9622
movb $0x0, -0x61d(%rbp)
jmp 0x9636
movq -0x628(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x628(%rbp)
jmp 0x95d3
testb $0x1, -0x61d(%rbp)
je 0x964b
movq -0x7e0(%rbp), %rdi
callq 0xd1f0
movq -0x7e0(%rbp), %rax
movq %rax, %rcx
addq $0x60, %rcx
movq %rcx, -0x810(%rbp)
movq (%rax), %rdi
movq -0x618(%rbp), %rax
movq 0x10(%rax), %rsi
movq -0x618(%rbp), %rdx
movq -0x618(%rbp), %rax
movq 0x18(%rax), %rcx
callq 0xcde0
movq -0x810(%rbp), %rdi
movq %rax, %rsi
callq 0xcd90
movl $0x0, -0x630(%rbp)
movl -0x630(%rbp), %eax
cmpl -0x61c(%rbp), %eax
jge 0x9723
movq -0x7e0(%rbp), %rdi
callq 0xd240
movq -0x7e0(%rbp), %rdi
movl %eax, -0x640(%rbp)
movq %rdx, -0x638(%rbp)
movq -0x618(%rbp), %rax
movq (%rax), %rax
movslq -0x630(%rbp), %rcx
movq (%rax,%rcx,8), %rsi
movq -0x640(%rbp), %rax
movq %rax, -0x650(%rbp)
movq -0x638(%rbp), %rax
movq %rax, -0x648(%rbp)
movl -0x650(%rbp), %edx
movq -0x648(%rbp), %rcx
callq 0xd2f0
movl -0x630(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x630(%rbp)
jmp 0x969e
jmp 0x9725
jmp 0x9727
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd1f0
jmp 0x9dc8
movl $0x5, %edi
callq 0xc570
movl %eax, -0x660(%rbp)
movq %rdx, -0x658(%rbp)
movq -0x18(%rbp), %rax
cmpq $0x0, (%rax)
jne 0x9773
movq -0x7e0(%rbp), %rdi
leaq 0x78f2(%rip), %rsi      # 0x1105e
movb $0x0, %al
callq 0xd470
movq -0x7e0(%rbp), %rdi
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x658(%rbp)
movq -0x660(%rbp), %rax
movq %rax, -0x670(%rbp)
movq -0x658(%rbp), %rax
movq %rax, -0x668(%rbp)
movl -0x670(%rbp), %esi
movq -0x668(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd2b0
movq %rax, -0x678(%rbp)
movl $0x10, %edi
callq 0x5130
movq %rax, -0x680(%rbp)
movq -0x678(%rbp), %rdi
callq 0x1080
movq %rax, %rcx
movq -0x680(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x680(%rbp), %rax
movq 0x8(%rax), %rdi
shlq $0x0, %rdi
callq 0x5130
movq %rax, %rcx
movq -0x680(%rbp), %rax
movq %rcx, (%rax)
movq -0x680(%rbp), %rax
movq (%rax), %rdi
movq -0x678(%rbp), %rsi
movq -0x680(%rbp), %rax
movq 0x8(%rax), %rdx
callq 0x10b0
movl $0x4, %edi
callq 0xc570
movq -0x7e0(%rbp), %rdi
movl %eax, -0x690(%rbp)
movq %rdx, -0x688(%rbp)
movq -0x680(%rbp), %rax
movq %rax, -0x688(%rbp)
movq -0x690(%rbp), %rax
movq %rax, -0x6a0(%rbp)
movq -0x688(%rbp), %rax
movq %rax, -0x698(%rbp)
movl -0x6a0(%rbp), %esi
movq -0x698(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movslq -0x28(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x28(%rax)
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd240
movl %eax, -0x6b0(%rbp)
movq %rdx, -0x6a8(%rbp)
cmpl $0x0, -0x6b0(%rbp)
je 0x98d9
movslq -0x28(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x28(%rax)
jmp 0x9dc8
callq 0x8140
movq %rax, -0x6b8(%rbp)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x6b8(%rbp), %rax
movq %rcx, 0x50(%rax)
movq -0x6b8(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x9dc8
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x50(%rax), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x8(%rax)
callq 0x5060
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd640
movl %eax, -0x6bc(%rbp)
movl $0x10, %edi
callq 0x5130
movq %rax, -0x6c8(%rbp)
movslq -0x6bc(%rbp), %rdi
shlq $0x3, %rdi
callq 0x5130
movq %rax, %rcx
movq -0x6c8(%rbp), %rax
movq %rcx, (%rax)
movslq -0x6bc(%rbp), %rcx
movq -0x6c8(%rbp), %rax
movq %rcx, 0x8(%rax)
movl $0x0, -0x6cc(%rbp)
movl -0x6cc(%rbp), %eax
cmpl -0x6bc(%rbp), %eax
jge 0x99ce
movq -0x7e0(%rbp), %rdi
callq 0xd2b0
movq %rax, %rdx
movq -0x6c8(%rbp), %rax
movq (%rax), %rax
movslq -0x6cc(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movl -0x6cc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x6cc(%rbp)
jmp 0x998b
movl $0x6, %edi
callq 0xc570
movq -0x7e0(%rbp), %rdi
movl %eax, -0x6e0(%rbp)
movq %rdx, -0x6d8(%rbp)
movq -0x6c8(%rbp), %rax
movq %rax, -0x6d8(%rbp)
movq -0x6e0(%rbp), %rax
movq %rax, -0x6f0(%rbp)
movq -0x6d8(%rbp), %rax
movq %rax, -0x6e8(%rbp)
movl -0x6f0(%rbp), %esi
movq -0x6e8(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd2b0
movq -0x7e0(%rbp), %rdi
movq %rax, -0x6f8(%rbp)
callq 0xd240
movl %eax, -0x708(%rbp)
movq %rdx, -0x700(%rbp)
leaq -0x708(%rbp), %rdi
movl $0x7, %esi
callq 0x7800
testb $0x1, %al
jne 0x9a83
movq -0x7e0(%rbp), %rdi
leaq 0x760c(%rip), %rsi      # 0x11088
movb $0x0, %al
callq 0xd470
movq -0x700(%rbp), %rax
movq %rax, -0x710(%rbp)
movq -0x710(%rbp), %rdi
movq -0x6f8(%rbp), %rsi
callq 0xd840
testb $0x1, %al
jne 0x9ac4
movq -0x7e0(%rbp), %rdi
movq -0x6f8(%rbp), %rdx
leaq 0x75ed(%rip), %rsi      # 0x110aa
movb $0x0, %al
callq 0xd470
movq -0x710(%rbp), %rdi
movq -0x6f8(%rbp), %rsi
callq 0xd8c0
movq -0x7e0(%rbp), %rdi
movl %eax, -0x720(%rbp)
movq %rdx, -0x718(%rbp)
movq -0x720(%rbp), %rax
movq %rax, -0x730(%rbp)
movq -0x718(%rbp), %rax
movq %rax, -0x728(%rbp)
movl -0x730(%rbp), %esi
movq -0x728(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd2b0
movq -0x7e0(%rbp), %rdi
movq %rax, -0x738(%rbp)
callq 0xd240
movl %eax, -0x748(%rbp)
movq %rdx, -0x740(%rbp)
leaq -0x748(%rbp), %rdi
movl $0x7, %esi
callq 0x7800
testb $0x1, %al
jne 0x9b74
movq -0x7e0(%rbp), %rdi
leaq 0x751b(%rip), %rsi      # 0x11088
movb $0x0, %al
callq 0xd470
movq -0x740(%rbp), %rax
movq %rax, -0x750(%rbp)
movq -0x750(%rbp), %rdi
movq -0x738(%rbp), %rsi
callq 0xd840
testb $0x1, %al
jne 0x9bb5
movq -0x7e0(%rbp), %rdi
movq -0x738(%rbp), %rdx
leaq 0x74fc(%rip), %rsi      # 0x110aa
movb $0x0, %al
callq 0xd470
movq -0x7e0(%rbp), %rdi
callq 0xd240
movl %eax, -0x760(%rbp)
movq %rdx, -0x758(%rbp)
movq -0x750(%rbp), %rdi
movq -0x738(%rbp), %rsi
movq -0x760(%rbp), %rax
movq %rax, -0x770(%rbp)
movq -0x758(%rbp), %rax
movq %rax, -0x768(%rbp)
movl -0x770(%rbp), %edx
movq -0x768(%rbp), %rcx
callq 0xd970
jmp 0x9dc8
movq -0x18(%rbp), %rdi
addq $0x38, %rdi
movl -0x28(%rbp), %esi
callq 0xc420
jmp 0x9dc8
movq -0x18(%rbp), %rax
cmpq $0x0, 0x40(%rax)
jne 0x9c44
movq -0x7e0(%rbp), %rdi
leaq 0x7488(%rip), %rsi      # 0x110c5
movb $0x0, %al
callq 0xd470
movq -0x18(%rbp), %rdi
addq $0x38, %rdi
callq 0xda20
movl %eax, -0x774(%rbp)
movslq -0x774(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x28(%rax)
jmp 0x9dc8
movq -0x7e0(%rbp), %rdi
callq 0xd640
movl %eax, %ecx
movq -0x7e0(%rbp), %rax
movslq %ecx, %rcx
movq %rcx, 0x90(%rax)
callq 0x7820
movq -0x7e0(%rbp), %rdi
movl %eax, -0x788(%rbp)
movq %rdx, -0x780(%rbp)
movl -0x788(%rbp), %esi
movq -0x780(%rbp), %rdx
callq 0xd270
movl $0x2, -0x4(%rbp)
jmp 0x9dcf
movq -0x7e0(%rbp), %rdi
callq 0xd2b0
movq -0x7e0(%rbp), %rdi
movq %rax, -0x790(%rbp)
addq $0x10, %rdi
movq -0x790(%rbp), %rax
movq %rax, -0x7a0(%rbp)
movl -0x2c(%rbp), %eax
movl %eax, -0x798(%rbp)
movq -0x7a0(%rbp), %rsi
movl -0x798(%rbp), %edx
callq 0xda90
callq 0x7820
movq -0x7e0(%rbp), %rdi
movl %eax, -0x7b0(%rbp)
movq %rdx, -0x7a8(%rbp)
movl -0x7b0(%rbp), %esi
movq -0x7a8(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
movq -0x28(%rbp), %rax
movq %rax, -0x7c0(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x7b8(%rbp)
leaq -0x7c0(%rbp), %rdi
movl $0x2, %esi
callq 0x7800
testb $0x1, %al
jne 0x9d71
leaq 0x7373(%rip), %rdi      # 0x110dd
movb $0x0, %al
callq 0x1c50
movq -0x7e0(%rbp), %rdi
movq -0x7b8(%rbp), %rax
movq %rax, -0x7c8(%rbp)
movq -0x7c8(%rbp), %rsi
callq 0xdaf0
movq -0x7e0(%rbp), %rdi
movl %eax, -0x7d8(%rbp)
movq %rdx, -0x7d0(%rbp)
movl -0x7d8(%rbp), %esi
movq -0x7d0(%rbp), %rdx
callq 0xd270
jmp 0x9dc8
leaq 0x7366(%rip), %rdi      # 0x11127
movb $0x0, %al
callq 0x1c50
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x810, %rsp            # imm = 0x810
popq %rbp
retq
movq -0x598(%rbp), %rdi
callq 0x11c0
nopw (%rax,%rax)