// File: /workspace/github_cpp_makefile_star2_O1/pranavmodx[P]modlang/src/evaluator.cpp
// Function: Evaluator::Eval(Node*, Environment*)
Object *Evaluator::Eval(Node *node, Environment *env)
{
	std::string nodeType = node->nodeType();

	// Statements
	if (nodeType == "Program")
		return evalProgram(((Program *)node), env);

	else if (nodeType == "ExpressionStatement")
		return Eval(((ExpressionStatement *)node)->expression, env);

	else if (nodeType == "BlockStatement")
		return evalBlockStatement(((BlockStatement *)node), env);

	else if (nodeType == "ReturnStatement")
	{
		Object *value = Eval(((ReturnStatement *)node)->returnValue, env);

		if (value->type() == ERROR_OBJ)
			return value;

		ReturnValue *returnValue = new ReturnValue(value);
		return returnValue;
	}

	else if (nodeType == "LetStatement")
	{
		Object *value = Eval(((LetStatement *)node)->value, env);

		if (value->type() == ERROR_OBJ)
			return value;

		env->Set((((LetStatement *)node)->name).value, value);
	}

	else if (nodeType == "AssignStatement")
	{
		Object *value = Eval(((AssignStatement *)node)->value, env);

		if (value->type() == ERROR_OBJ)
			return value;

		Object *obj = env->Get((((AssignStatement *)node)->name).value);

		if (obj->type() == ERROR_OBJ)
			return obj;

		env->Set((((AssignStatement *)node)->name).value, value);
	}

	// Expressions
	else if (nodeType == "IntegerLiteral")
	{
		Integer *integer = new Integer(((IntegerLiteral *)node)->value);
		return integer;
	}

	else if (nodeType == "BooleanLiteral")
	{
		return ((BooleanLiteral *)node)->value ? __TRUE : __FALSE;
	}

	else if (nodeType == "StringLiteral")
	{
		String *str = new String(((StringLiteral *)node)->value);
		return str;
	}

	else if (nodeType == "PrefixExpression")
	{
		Object *right = Eval(((PrefixExpression *)node)->right, env);
		if (right->type() == ERROR_OBJ)
			return right;

		return evalPrefixExpression(((PrefixExpression *)node)->operand, right);
	}

	else if (nodeType == "InfixExpression")
	{
		Object *left = Eval(((InfixExpression *)node)->left, env);
		if (left->type() == ERROR_OBJ)
			return left;

		Object *right = Eval(((InfixExpression *)node)->right, env);
		if (right->type() == ERROR_OBJ)
			return right;

		return evalInfixExpression(((InfixExpression *)node)->operand, left, right);
	}

	else if (nodeType == "IfExpression")
		return evalIfExpression((IfExpression *)node, env);

	else if (nodeType == "WhileExpression")
	{
		while (true)
		{
			Object *condition = Eval(((WhileExpression *)node)->condition, env);

			if (condition->type() == ERROR_OBJ)
				return condition;

			if (!isTruthy(condition))
				return __NULL;

			Object *result = Eval(((WhileExpression *)node)->consequence, env);

			if (result->type() == ERROR_OBJ ||
				result->type() == RETURN_VALUE_OBJ)
				return result;
		}
	}

	else if (nodeType == "Identifier")
	{
		return evalIdentifier((Identifier *)node, env);
	}

	else if (nodeType == "FunctionLiteral")
	{
		Object *fn = new Function(((FunctionLiteral *)node)->parameters, ((FunctionLiteral *)node)->body, env);

		return fn;
	}

	else if (nodeType == "CallExpression")
	{
		Object *fn = Eval(((CallExpression *)node)->function, env);

		if (fn->type() == ERROR_OBJ)
			return fn;

		std::vector<Object *> args;

		for (auto *argument : ((CallExpression *)node)->arguments)
		{
			Object *arg = Eval(argument, env);

			if (arg->type() == ERROR_OBJ)
				return arg;

			args.push_back(arg);
		}

		return evalCallExpression(fn, args);
	}

	else if (nodeType == "ArrayLiteral")
	{
		std::vector<Object *> elems;

		for (auto *element : ((ArrayLiteral *)node)->elements)
		{
			Object *elem = Eval(element, env);

			if (elem->type() == ERROR_OBJ)
				return elem;

			elems.push_back(elem);
		}

		return new Array(elems);
	}

	else if (nodeType == "IndexExpression")
	{
		Object *array = Eval(((IndexExpression *)node)->array, env);

		if (array->type() == ERROR_OBJ)
			return array;

		Object *index = Eval(((IndexExpression *)node)->index, env);

		if (index->type() == ERROR_OBJ)
			return index;

		return evalIndexExpression(array, index, env);
	}

	else if (nodeType == "HashMapLiteral")
		return evalHashMapLiteral((HashMapLiteral *)node, env);

	else if (nodeType == "HashSetLiteral")
		return evalHashSetLiteral((HashSetLiteral *)node, env);

	else if (nodeType == "StackLiteral")
		return evalStackLiteral((StackLiteral *)node, env);

	else if (nodeType == "QueueLiteral")
		return evalQueueLiteral((QueueLiteral *)node, env);

	else if (nodeType == "DequeLiteral")
		return evalDequeLiteral((DequeLiteral *)node, env);

	else if (nodeType == "MaxHeapLiteral")
		return evalMaxHeapLiteral((MaxHeapLiteral *)node, env);

	else if (nodeType == "MinHeapLiteral")
		return evalMinHeapLiteral((MinHeapLiteral *)node, env);

	return __NULL;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x138, %rsp            # imm = 0x138
movq %rdx, %rbx
movq %rsi, %r12
movq %rdi, %r15
movq (%rsi), %rax
leaq 0x28(%rsp), %r14
movq %r14, %rdi
callq *0x10(%rax)
leaq 0xa27e(%rip), %rsi      # 0x291fd
movq %r14, %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f1fa
leaq 0xa2b4(%rip), %rsi      # 0x2924a
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f20d
leaq 0xa2d0(%rip), %rsi      # 0x2927f
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f222
leaq 0xa272(%rip), %rsi      # 0x2923a
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f235
leaq 0xa231(%rip), %rsi      # 0x29212
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f284
leaq 0xa230(%rip), %rsi      # 0x2922a
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f2de
leaq 0xa5b3(%rip), %rsi      # 0x295c6
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f338
leaq 0xa5ae(%rip), %rsi      # 0x295da
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f3cd
leaq 0xa5a4(%rip), %rsi      # 0x295e9
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f472
leaq 0xa200(%rip), %rsi      # 0x2925e
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f5c4
leaq 0xa1f8(%rip), %rsi      # 0x2926f
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f617
leaq 0xa1fe(%rip), %rsi      # 0x2928e
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f708
leaq 0xa1f2(%rip), %rsi      # 0x2929b
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f722
leaq 0xa15d(%rip), %rsi      # 0x2921f
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f92b
leaq 0xa1d0(%rip), %rsi      # 0x292ab
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f9b9
leaq 0xa1c7(%rip), %rsi      # 0x292bb
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f9f5
leaq 0xa0f8(%rip), %rsi      # 0x29205
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fad4
leaq 0xa1a4(%rip), %rsi      # 0x292ca
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fbdc
leaq 0xa19b(%rip), %rsi      # 0x292da
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fc2c
leaq 0xa191(%rip), %rsi      # 0x292e9
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fd75
leaq 0xa187(%rip), %rsi      # 0x292f8
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fd88
leaq 0xa17b(%rip), %rsi      # 0x29305
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fe0f
leaq 0xa16f(%rip), %rsi      # 0x29312
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fe22
leaq 0xa163(%rip), %rsi      # 0x2931f
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fe6a
leaq 0xa159(%rip), %rsi      # 0x2932e
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
jne 0x1f6f2
movq %r15, %rdi
movq %r12, %rsi
movq %rbx, %rdx
callq 0x229d6
jmp 0x1f39a
movq %r15, %rdi
movq %r12, %rsi
movq %rbx, %rdx
callq 0x20030
jmp 0x1f39a
movq 0x48(%r12), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
jmp 0x1f39a
movq %r15, %rdi
movq %r12, %rsi
movq %rbx, %rdx
callq 0x201e8
jmp 0x1f39a
movq 0x48(%r12), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
movq %rax, %r14
movq (%rax), %rax
movq %rsp, %rdi
movq %r14, %rsi
callq *(%rax)
movq 0x8(%rsp), %rdx
cmpq 0x190d9(%rip), %rdx     # 0x38338
jne 0x1f2d7
testq %rdx, %rdx
je 0x1f361
movq 0x190bf(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %bl
jmp 0x1f363
movq 0xb0(%r12), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
movq %rax, %r14
movq (%rax), %rax
movq %rsp, %rdi
movq %r14, %rsi
callq *(%rax)
movq 0x8(%rsp), %rdx
cmpq 0x19087(%rip), %rdx     # 0x38338
jne 0x1f331
testq %rdx, %rdx
je 0x1f3e5
movq 0x1906d(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1f3e8
xorl %ebx, %ebx
jmp 0x1f363
movq 0xb0(%r12), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
movq %rax, %r15
movq (%rax), %rax
movq %rsp, %rdi
movq %r15, %rsi
callq *(%rax)
movq 0x8(%rsp), %rdx
cmpq 0x1902d(%rip), %rdx     # 0x38338
jne 0x1f35a
testq %rdx, %rdx
je 0x1f4f7
movq 0x19013(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1f4fa
xorl %ebp, %ebp
jmp 0x1f3e8
movl $0x10, %edi
callq 0x51b0
movq %rax, %r14
movl 0x48(%r12), %eax
leaq 0x1577f(%rip), %rcx     # 0x34ad0
movq %rcx, (%r14)
movl %eax, 0x8(%r14)
jmp 0x1f39d
xorl %ebp, %ebp
jmp 0x1f4fa
movb $0x1, %bl
leaq 0x10(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x1f37e
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %bl, %bl
jne 0x1f39d
movl $0x10, %edi
callq 0x51b0
leaq 0x157ad(%rip), %rcx     # 0x34b40
movq %rcx, (%rax)
movq %r14, 0x8(%rax)
movq %rax, %r14
leaq 0x38(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x1f3b8
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x51c0
movq %r14, %rax
addq $0x138, %rsp            # imm = 0x138
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
cmpb $0x0, 0x48(%r12)
je 0x1f4eb
leaq 0x18118(%rip), %rax     # 0x374f8
jmp 0x1f6f9
movb $0x1, %bpl
leaq 0x10(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x1f403
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %bpl, %bpl
jne 0x1f39d
leaq 0x128(%rsp), %r15
movq %r15, -0x10(%r15)
movq 0x90(%r12), %rsi
movq 0x98(%r12), %rdx
addq %rsi, %rdx
leaq 0x118(%rsp), %rdi
callq 0xbde8
leaq 0x118(%rsp), %rsi
movq %rbx, %rdi
movq %r14, %rdx
callq 0x1945a
movq 0x118(%rsp), %rdi
cmpq %r15, %rdi
je 0x1f464
movq 0x128(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %bpl, %bpl
jne 0x1f39d
jmp 0x1f6f2
movl $0x28, %edi
callq 0x51b0
movq %rax, %r14
leaq 0x88(%rsp), %r15
movq %r15, -0x10(%r15)
movq 0x48(%r12), %rsi
movq 0x50(%r12), %rdx
addq %rsi, %rdx
leaq 0x78(%rsp), %rdi
callq 0xbde8
leaq 0x156cf(%rip), %rax     # 0x34b78
movq %rax, (%r14)
leaq 0x8(%r14), %rdi
movq %r14, %rax
addq $0x18, %rax
movq %rax, 0x8(%r14)
movq 0x78(%rsp), %rsi
movq 0x80(%rsp), %rdx
addq %rsi, %rdx
callq 0xbde8
movq 0x78(%rsp), %rdi
cmpq %r15, %rdi
je 0x1f39d
movq 0x88(%rsp), %rsi
jmp 0x1fac7
leaq 0x1800e(%rip), %rax     # 0x37500
jmp 0x1f6f9
movb $0x1, %bpl
leaq 0x10(%rsp), %r13
movq -0x10(%r13), %rdi
cmpq %r13, %rdi
je 0x1f515
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %bpl, %bpl
je 0x1f524
xorl %ebp, %ebp
movq %r15, %r14
jmp 0x1f6e9
leaq 0x108(%rsp), %rbp
movq %rbp, -0x10(%rbp)
movq 0x90(%r12), %rsi
movq 0x98(%r12), %rdx
addq %rsi, %rdx
leaq 0xf8(%rsp), %rdi
callq 0xbde8
leaq 0xf8(%rsp), %rsi
movq %rbx, %rdi
callq 0x19326
movq %rax, %r14
movq 0xf8(%rsp), %rdi
cmpq %rbp, %rdi
je 0x1f580
movq 0x108(%rsp), %rsi
incq %rsi
callq 0x51c0
movq (%r14), %rax
movq %rsp, %rdi
movq %r14, %rsi
callq *(%rax)
movq 0x8(%rsp), %rdx
cmpq 0x18da1(%rip), %rdx     # 0x38338
jne 0x1f5bd
testq %rdx, %rdx
je 0x1f66b
movq 0x18d87(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1f66e
xorl %ebp, %ebp
jmp 0x1f66e
movq 0x68(%r12), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
movq %rax, %r14
movq (%rax), %rax
movq %rsp, %rdi
movq %r14, %rsi
callq *(%rax)
movq 0x8(%rsp), %rdx
cmpq 0x18d4a(%rip), %rdx     # 0x38338
jne 0x1f701
testq %rdx, %rdx
je 0x1f8ac
movq 0x18d2c(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %bl
jmp 0x1f8ae
movq 0x48(%r12), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
movq %rax, %r14
movq (%rax), %rax
movq %rsp, %rdi
movq %r14, %rsi
callq *(%rax)
movq 0x8(%rsp), %rdx
cmpq 0x18cf7(%rip), %rdx     # 0x38338
jne 0x1f71b
testq %rdx, %rdx
je 0x1f93b
movq 0x18cd9(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1f93e
movb $0x1, %bpl
movq (%rsp), %rdi
cmpq %r13, %rdi
je 0x1f684
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %bpl, %bpl
jne 0x1f6e5
leaq 0xe8(%rsp), %r13
movq %r13, -0x10(%r13)
movq 0x90(%r12), %rsi
movq 0x98(%r12), %rdx
addq %rsi, %rdx
leaq 0xd8(%rsp), %rdi
callq 0xbde8
leaq 0xd8(%rsp), %rsi
movq %rbx, %rdi
movq %r15, %rdx
callq 0x1945a
movq 0xd8(%rsp), %rdi
cmpq %r13, %rdi
je 0x1f6e5
movq 0xe8(%rsp), %rsi
incq %rsi
callq 0x51c0
xorb $0x1, %bpl
testb %bpl, %bpl
je 0x1f39d
leaq 0x17df7(%rip), %rax     # 0x374f0
movq (%rax), %r14
jmp 0x1f39d
xorl %ebx, %ebx
jmp 0x1f8ae
movq %r15, %rdi
movq %r12, %rsi
movq %rbx, %rdx
callq 0x2109a
jmp 0x1f39a
xorl %ebp, %ebp
jmp 0x1f93e
movq 0x48(%r12), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
movq %rax, %r14
movq (%rax), %rax
movq %rsp, %rdi
movq %r14, %rsi
callq *(%rax)
movq 0x8(%rsp), %rdx
cmpq 0x18bec(%rip), %rdx     # 0x38338
jne 0x1f76b
testq %rdx, %rdx
je 0x1f770
movq 0x18bd6(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %r13b
jmp 0x1f773
xorl %r13d, %r13d
jmp 0x1f773
movb $0x1, %r13b
movq (%rsp), %rdi
leaq 0x10(%rsp), %rax
cmpq %rax, %rdi
je 0x1f78e
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %r13b, %r13b
jne 0x1f7f1
movq %r14, %rdi
callq 0x1ee91
testb %al, %al
je 0x1f7e7
movq 0x50(%r12), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
movq %rax, %r14
movq (%rax), %rax
movq %rsp, %rdi
movq %r14, %rsi
callq *(%rax)
movq 0x8(%rsp), %rdx
cmpq 0x18b6f(%rip), %rdx     # 0x38338
jne 0x1f7f9
testq %rdx, %rdx
je 0x1f7fd
movq 0x18b59(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %al
jmp 0x1f7ff
leaq 0x17d02(%rip), %rax     # 0x374f0
movq (%rax), %r14
xorl %r13d, %r13d
jmp 0x1f89b
xorl %eax, %eax
jmp 0x1f7ff
movb $0x1, %al
movb $0x1, %r13b
testb %al, %al
jne 0x1f852
movl %eax, 0x20(%rsp)
movq (%r14), %rax
leaq 0x50(%rsp), %rdi
movq %r14, %rsi
callq *(%rax)
movq 0x58(%rsp), %rdx
cmpq 0x18ab5(%rip), %rdx     # 0x382d8
jne 0x1f84b
testq %rdx, %rdx
movl 0x20(%rsp), %eax
je 0x1f852
movq 0x18a9b(%rip), %rsi     # 0x382d0
movq 0x50(%rsp), %rdi
callq 0x51d0
testl %eax, %eax
movl 0x20(%rsp), %eax
sete %r13b
jmp 0x1f852
xorl %r13d, %r13d
movl 0x20(%rsp), %eax
testb %al, %al
jne 0x1f872
movq 0x50(%rsp), %rdi
leaq 0x60(%rsp), %rax
cmpq %rax, %rdi
je 0x1f872
movq 0x60(%rsp), %rsi
incq %rsi
callq 0x51c0
movq (%rsp), %rdi
leaq 0x10(%rsp), %rax
cmpq %rax, %rdi
je 0x1f88d
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %r13b, %r13b
cmovneq %r14, %rbp
xorb $0x1, %r13b
movq %rbp, %r14
movq %r14, %rbp
testb %r13b, %r13b
jne 0x1f722
jmp 0x1f39d
movb $0x1, %bl
leaq 0x10(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x1f8c9
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %bl, %bl
jne 0x1f39d
leaq 0xc8(%rsp), %r13
movq %r13, -0x10(%r13)
movq 0x48(%r12), %rsi
movq 0x50(%r12), %rdx
addq %rsi, %rdx
leaq 0xb8(%rsp), %rdi
callq 0xbde8
leaq 0xb8(%rsp), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x2030a
movq %rax, %r14
movq 0xb8(%rsp), %rdi
cmpq %r13, %rdi
je 0x1f39d
movq 0xc8(%rsp), %rsi
jmp 0x1fac7
movq %r12, %rsi
movq %rbx, %rdx
callq 0x210ec
jmp 0x1f39a
movb $0x1, %bpl
leaq 0x10(%rsp), %r13
movq -0x10(%r13), %rdi
cmpq %r13, %rdi
je 0x1f959
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %bpl, %bpl
jne 0x1f39d
movq 0x70(%r12), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
movq %rax, %rbx
movq (%rax), %rax
movq %rsp, %rdi
movq %rbx, %rsi
callq *(%rax)
movq 0x8(%rsp), %rdx
cmpq 0x189ac(%rip), %rdx     # 0x38338
jne 0x1f9b2
testq %rdx, %rdx
je 0x1fa49
movq 0x18992(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1fa4c
xorl %ebp, %ebp
jmp 0x1fa4c
movl $0x30, %edi
callq 0x51b0
movq %rax, %r14
movq 0x60(%r12), %r15
addq $0x48, %r12
leaq 0x151da(%rip), %rax     # 0x34bb0
movq %rax, (%r14)
movq %r14, %rdi
addq $0x8, %rdi
movq %r12, %rsi
callq 0x25244
movq %r15, 0x20(%r14)
movq %rbx, 0x28(%r14)
jmp 0x1f39d
movq 0x48(%r12), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
movq %rax, %r14
movq (%rax), %rax
movq %rsp, %rdi
movq %r14, %rsi
callq *(%rax)
movq 0x8(%rsp), %rdx
cmpq 0x18919(%rip), %rdx     # 0x38338
jne 0x1fbd8
testq %rdx, %rdx
je 0x1fc46
movq 0x188fb(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1fc49
movb $0x1, %bpl
movq (%rsp), %rdi
cmpq %r13, %rdi
je 0x1fa62
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %bpl, %bpl
je 0x1fa6f
movq %rbx, %r14
jmp 0x1f39d
leaq 0xa8(%rsp), %r13
movq %r13, -0x10(%r13)
movq 0x50(%r12), %rsi
movq 0x58(%r12), %rdx
addq %rsi, %rdx
leaq 0x98(%rsp), %rdi
callq 0xbde8
leaq 0x98(%rsp), %rsi
movq %r15, %rdi
movq %r14, %rdx
movq %rbx, %rcx
callq 0x205c8
movq %rax, %r14
movq 0x98(%rsp), %rdi
cmpq %r13, %rdi
je 0x1f39d
movq 0xa8(%rsp), %rsi
incq %rsi
callq 0x51c0
jmp 0x1f39d
xorps %xmm0, %xmm0
movaps %xmm0, 0x50(%rsp)
movq $0x0, 0x60(%rsp)
movq 0x48(%r12), %rbp
movq 0x50(%r12), %rax
movq %rax, 0x20(%rsp)
cmpq %rax, %rbp
sete %r13b
je 0x1fba1
movq (%rbp), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
movq %rax, 0x48(%rsp)
movq (%rax), %rcx
movq %rsp, %rdi
movq %rax, %rsi
callq *(%rcx)
movq 0x8(%rsp), %rdx
cmpq 0x1880c(%rip), %rdx     # 0x38338
jne 0x1fb4b
testq %rdx, %rdx
je 0x1fb50
movq 0x187f6(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %r12b
jmp 0x1fb53
xorl %r12d, %r12d
jmp 0x1fb53
movb $0x1, %r12b
movq (%rsp), %rdi
leaq 0x10(%rsp), %rax
cmpq %rax, %rdi
je 0x1fb6e
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %r12b, %r12b
je 0x1fb7a
movq 0x48(%rsp), %r14
jmp 0x1fb89
leaq 0x50(%rsp), %rdi
leaq 0x48(%rsp), %rsi
callq 0x243bc
testb %r12b, %r12b
jne 0x1fba1
addq $0x8, %rbp
cmpq 0x20(%rsp), %rbp
sete %r13b
jne 0x1fb01
testb $0x1, %r13b
je 0x1fd5a
movl $0x20, %edi
callq 0x51b0
movq %rax, %r14
leaq 0x15029(%rip), %rax     # 0x34be8
movq %rax, (%r14)
movq %r14, %rdi
addq $0x8, %rdi
leaq 0x50(%rsp), %rsi
callq 0x24822
jmp 0x1fd5a
xorl %ebp, %ebp
jmp 0x1fc49
movq 0x48(%r12), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
movq %rax, %r14
movq (%rax), %rax
movq %rsp, %rdi
movq %r14, %rsi
callq *(%rax)
movq 0x8(%rsp), %rdx
cmpq 0x18732(%rip), %rdx     # 0x38338
jne 0x1fc3f
testq %rdx, %rdx
je 0x1fd9b
movq 0x18718(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1fd9e
movq %r15, %rdi
movq %r12, %rsi
movq %rbx, %rdx
callq 0x21da6
jmp 0x1f39a
xorl %ebp, %ebp
jmp 0x1fd9e
movb $0x1, %bpl
leaq 0x10(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x1fc64
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %bpl, %bpl
jne 0x1f39d
movq %r14, 0x70(%rsp)
xorps %xmm0, %xmm0
movaps %xmm0, 0x50(%rsp)
movq $0x0, 0x60(%rsp)
movq 0x50(%r12), %rbp
movq 0x58(%r12), %rax
movq %rax, 0x20(%rsp)
cmpq %rax, %rbp
sete %r13b
je 0x1fd3f
movq (%rbp), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
movq %rax, 0x48(%rsp)
movq (%rax), %rcx
movq %rsp, %rdi
movq %rax, %rsi
callq *(%rcx)
movq 0x8(%rsp), %rdx
cmpq 0x1866e(%rip), %rdx     # 0x38338
jne 0x1fce9
testq %rdx, %rdx
je 0x1fcee
movq 0x18658(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %r12b
jmp 0x1fcf1
xorl %r12d, %r12d
jmp 0x1fcf1
movb $0x1, %r12b
movq (%rsp), %rdi
leaq 0x10(%rsp), %rax
cmpq %rax, %rdi
je 0x1fd0c
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %r12b, %r12b
je 0x1fd18
movq 0x48(%rsp), %r14
jmp 0x1fd27
leaq 0x50(%rsp), %rdi
leaq 0x48(%rsp), %rsi
callq 0x243bc
testb %r12b, %r12b
jne 0x1fd3f
addq $0x8, %rbp
cmpq 0x20(%rsp), %rbp
sete %r13b
jne 0x1fc9f
testb $0x1, %r13b
je 0x1fd5a
leaq 0x50(%rsp), %rdx
movq %r15, %rdi
movq 0x70(%rsp), %rsi
callq 0x2122a
movq %rax, %r14
movq 0x50(%rsp), %rdi
testq %rdi, %rdi
je 0x1f39d
movq 0x60(%rsp), %rsi
subq %rdi, %rsi
jmp 0x1faca
movq %r15, %rdi
movq %r12, %rsi
movq %rbx, %rdx
callq 0x220c2
jmp 0x1f39a
movq %r15, %rdi
movq %r12, %rsi
movq %rbx, %rdx
callq 0x22338
jmp 0x1f39a
movb $0x1, %bpl
leaq 0x10(%rsp), %r13
movq -0x10(%r13), %rdi
cmpq %r13, %rdi
je 0x1fdb9
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %bpl, %bpl
jne 0x1f39d
movq 0x50(%r12), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x1ef50
movq %rax, %rbx
movq (%rax), %rax
movq %rsp, %rdi
movq %rbx, %rsi
callq *(%rax)
movq 0x8(%rsp), %rdx
cmpq 0x1854c(%rip), %rdx     # 0x38338
jne 0x1fe0b
testq %rdx, %rdx
je 0x1fe35
movq 0x18536(%rip), %rsi     # 0x38330
movq (%rsp), %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1fe38
xorl %ebp, %ebp
jmp 0x1fe38
movq %r15, %rdi
movq %r12, %rsi
movq %rbx, %rdx
callq 0x224ca
jmp 0x1f39a
movq %r15, %rdi
movq %r12, %rsi
movq %rbx, %rdx
callq 0x2265c
jmp 0x1f39a
movb $0x1, %bpl
movq (%rsp), %rdi
cmpq %r13, %rdi
je 0x1fe4e
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x51c0
testb %bpl, %bpl
jne 0x1fa67
movq %r15, %rdi
movq %r14, %rsi
movq %rbx, %rdx
callq 0x21a18
jmp 0x1f39a
movq %r15, %rdi
movq %r12, %rsi
movq %rbx, %rdx
callq 0x227ee
jmp 0x1f39a
jmp 0x20009
jmp 0x1ff18
jmp 0x20009
movq %rax, %rbx
movl $0x20, %esi
movq %r14, %rdi
callq 0x51c0
jmp 0x1ff1b
jmp 0x1ff18
jmp 0x20009
jmp 0x20009
jmp 0x20009
jmp 0x20009
movq %rax, %rbx
movl $0x30, %esi
jmp 0x1ff90
jmp 0x20009
movq %rax, %rbx
movq 0x98(%rsp), %rdi
cmpq %r13, %rdi
je 0x2000c
movq 0xa8(%rsp), %rsi
jmp 0x1ffed
jmp 0x1ff18
jmp 0x20009
jmp 0x1ff18
jmp 0x1ff18
jmp 0x20009
movq %rax, %rbx
movq 0xb8(%rsp), %rdi
cmpq %r13, %rdi
je 0x2000c
movq 0xc8(%rsp), %rsi
jmp 0x1ffed
movq %rax, %rbx
movq 0x50(%rsp), %rdi
testq %rdi, %rdi
je 0x2000c
movq 0x60(%rsp), %rsi
subq %rdi, %rsi
jmp 0x1fff0
jmp 0x20009
jmp 0x20009
movq %rax, %rbx
movq (%rsp), %rdi
leaq 0x10(%rsp), %rax
cmpq %rax, %rdi
je 0x2000c
movq 0x10(%rsp), %rsi
jmp 0x1ffed
jmp 0x20009
jmp 0x20009
movq %rax, %rbx
movq 0x78(%rsp), %rdi
cmpq %r15, %rdi
je 0x1ff8b
movq 0x88(%rsp), %rsi
incq %rsi
callq 0x51c0
jmp 0x1ff8b
movq %rax, %rbx
movl $0x28, %esi
movq %r14, %rdi
jmp 0x1fff0
jmp 0x20009
movq %rax, %rbx
movq 0xd8(%rsp), %rdi
cmpq %r13, %rdi
je 0x2000c
movq 0xe8(%rsp), %rsi
jmp 0x1ffed
jmp 0x20009
jmp 0x20009
jmp 0x20009
movq %rax, %rbx
movq 0xf8(%rsp), %rdi
cmpq %rbp, %rdi
je 0x2000c
movq 0x108(%rsp), %rsi
jmp 0x1ffed
jmp 0x20009
jmp 0x20009
movq %rax, %rbx
movq 0x118(%rsp), %rdi
cmpq %r15, %rdi
je 0x2000c
movq 0x128(%rsp), %rsi
incq %rsi
callq 0x51c0
jmp 0x2000c
jmp 0x20009
jmp 0x20009
jmp 0x20009
jmp 0x20009
jmp 0x20009
jmp 0x20009
jmp 0x20009
jmp 0x20009
jmp 0x20009
movq %rax, %rbx
leaq 0x38(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x20027
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x51c0
movq %rbx, %rdi
callq 0x5330
nop