// File: 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
movq %rsp, %rbp
subq $0x680, %rsp            # imm = 0x680
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x418(%rbp)
movq -0x18(%rbp), %rsi
movq (%rsi), %rax
movq 0x10(%rax), %rax
leaq -0x40(%rbp), %rdi
movq %rdi, -0x410(%rbp)
callq *%rax
movq -0x410(%rbp), %rdi
leaq 0x132f9(%rip), %rsi     # 0x453c1
callq 0x385c0
movb %al, -0x401(%rbp)
jmp 0x320d5
movb -0x401(%rbp), %al
testb $0x1, %al
jne 0x320e1
jmp 0x32126
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x336c0
movq %rax, -0x420(%rbp)
jmp 0x320fe
movq -0x420(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x336a3
leaq 0x132e1(%rip), %rsi     # 0x4540e
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x421(%rbp)
jmp 0x3213e
movb -0x421(%rbp), %al
testb $0x1, %al
jne 0x3214a
jmp 0x32182
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x430(%rbp)
jmp 0x3216b
movq -0x430(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
leaq 0x132ba(%rip), %rsi     # 0x45443
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x431(%rbp)
jmp 0x3219a
movb -0x431(%rbp), %al
testb $0x1, %al
jne 0x321a6
jmp 0x321da
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x338a0
movq %rax, -0x440(%rbp)
jmp 0x321c3
movq -0x440(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
leaq 0x1321d(%rip), %rsi     # 0x453fe
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x441(%rbp)
jmp 0x321f2
movb -0x441(%rbp), %al
testb $0x1, %al
jne 0x32201
jmp 0x322e4
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x450(%rbp)
jmp 0x32222
movq -0x450(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0x78(%rbp), %rdi
callq *%rax
jmp 0x3223f
leaq -0x78(%rbp), %rdi
leaq 0x351b6(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, -0x451(%rbp)
leaq -0x78(%rbp), %rdi
callq 0x5518
movb -0x451(%rbp), %al
testb $0x1, %al
jne 0x3226a
jmp 0x3227e
movq -0x58(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movl $0x10, %edi
callq 0x52a0
movq %rax, -0x460(%rbp)
jmp 0x32291
movq -0x460(%rbp), %rdi
movq -0x58(%rbp), %rsi
callq 0x385f0
jmp 0x322a3
movq -0x460(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq -0x460(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
movl $0x10, %esi
callq 0x52b0
jmp 0x336a3
leaq 0x130eb(%rip), %rsi     # 0x453d6
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x461(%rbp)
jmp 0x322fc
movb -0x461(%rbp), %al
testb $0x1, %al
jne 0x3230b
jmp 0x3240b
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0xb0(%rax), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x470(%rbp)
jmp 0x3232f
movq -0x470(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x88(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0xa8(%rbp), %rdi
callq *%rax
jmp 0x32355
leaq -0xa8(%rbp), %rdi
leaq 0x3509d(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, -0x471(%rbp)
leaq -0xa8(%rbp), %rdi
callq 0x5518
movb -0x471(%rbp), %al
testb $0x1, %al
jne 0x32386
jmp 0x3239d
movq -0x88(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq -0x20(%rbp), %rax
movq %rax, -0x480(%rbp)
movq -0x18(%rbp), %rsi
addq $0x90, %rsi
leaq -0xc8(%rbp), %rdi
callq 0x5130
jmp 0x323c1
movq -0x480(%rbp), %rdi
movq -0x88(%rbp), %rdx
leaq -0xc8(%rbp), %rsi
callq 0x2b8b0
jmp 0x323dd
leaq -0xc8(%rbp), %rdi
callq 0x5518
jmp 0x33670
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0xc8(%rbp), %rdi
callq 0x5518
jmp 0x336a3
leaq 0x12fdc(%rip), %rsi     # 0x453ee
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x481(%rbp)
jmp 0x32423
movb -0x481(%rbp), %al
testb $0x1, %al
jne 0x32432
jmp 0x32609
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0xb0(%rax), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x490(%rbp)
jmp 0x32456
movq -0x490(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0xd0(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0xf0(%rbp), %rdi
callq *%rax
jmp 0x3247c
leaq -0xf0(%rbp), %rdi
leaq 0x34f76(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, -0x491(%rbp)
leaq -0xf0(%rbp), %rdi
callq 0x5518
movb -0x491(%rbp), %al
testb $0x1, %al
jne 0x324ad
jmp 0x324c4
movq -0xd0(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq -0x20(%rbp), %rax
movq %rax, -0x4a0(%rbp)
movq -0x18(%rbp), %rsi
addq $0x90, %rsi
leaq -0x118(%rbp), %rdi
callq 0x5130
jmp 0x324e8
movq -0x4a0(%rbp), %rdi
leaq -0x118(%rbp), %rsi
callq 0x2b6f0
movq %rax, -0x4a8(%rbp)
jmp 0x32504
leaq -0x118(%rbp), %rdi
callq 0x5518
movq -0x4a8(%rbp), %rax
movq %rax, -0xf8(%rbp)
movq -0xf8(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0x138(%rbp), %rdi
callq *%rax
jmp 0x32536
leaq -0x138(%rbp), %rdi
leaq 0x34ebc(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, -0x4a9(%rbp)
leaq -0x138(%rbp), %rdi
callq 0x5518
movb -0x4a9(%rbp), %al
testb $0x1, %al
jne 0x32567
jmp 0x3259b
movq -0xf8(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x118(%rbp), %rdi
callq 0x5518
jmp 0x336a3
movq -0x20(%rbp), %rax
movq %rax, -0x4b8(%rbp)
movq -0x18(%rbp), %rsi
addq $0x90, %rsi
leaq -0x158(%rbp), %rdi
callq 0x5130
jmp 0x325bf
movq -0x4b8(%rbp), %rdi
movq -0xd0(%rbp), %rdx
leaq -0x158(%rbp), %rsi
callq 0x2b8b0
jmp 0x325db
leaq -0x158(%rbp), %rdi
callq 0x5518
jmp 0x3366e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x158(%rbp), %rdi
callq 0x5518
jmp 0x336a3
leaq 0x13176(%rip), %rsi     # 0x45786
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x4b9(%rbp)
jmp 0x32621
movb -0x4b9(%rbp), %al
testb $0x1, %al
jne 0x3262d
jmp 0x3269c
movl $0x10, %edi
callq 0x52a0
movq %rax, -0x4c8(%rbp)
jmp 0x32640
movq -0x4c8(%rbp), %rdi
movq -0x18(%rbp), %rax
movl 0x48(%rax), %esi
callq 0x37510
jmp 0x32655
movq -0x4c8(%rbp), %rax
movq %rax, -0x160(%rbp)
movq -0x160(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq -0x4c8(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
movl $0x10, %esi
callq 0x52b0
jmp 0x336a3
leaq 0x130f7(%rip), %rsi     # 0x4579a
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x4c9(%rbp)
jmp 0x326b4
movb -0x4c9(%rbp), %al
testb $0x1, %al
jne 0x326c0
jmp 0x32705
movq -0x18(%rbp), %rax
testb $0x1, 0x48(%rax)
je 0x326dd
leaq 0x33ef7(%rip), %rax     # 0x665c8
movq (%rax), %rax
movq %rax, -0x4d8(%rbp)
jmp 0x326ee
leaq 0x33eec(%rip), %rax     # 0x665d0
movq (%rax), %rax
movq %rax, -0x4d8(%rbp)
movq -0x4d8(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
leaq 0x1309d(%rip), %rsi     # 0x457a9
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x4d9(%rbp)
jmp 0x3271d
movb -0x4d9(%rbp), %al
testb $0x1, %al
jne 0x3272c
jmp 0x327f0
movl $0x28, %edi
callq 0x52a0
movq %rax, -0x4e8(%rbp)
jmp 0x3273f
movb $0x1, -0x189(%rbp)
movq -0x18(%rbp), %rsi
addq $0x48, %rsi
leaq -0x188(%rbp), %rdi
callq 0x5130
jmp 0x3275c
movq -0x4e8(%rbp), %rdi
leaq -0x188(%rbp), %rsi
callq 0x38640
jmp 0x32771
movb $0x0, -0x189(%rbp)
leaq -0x188(%rbp), %rdi
callq 0x5518
movq -0x4e8(%rbp), %rax
movq %rax, -0x168(%rbp)
movq -0x168(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x327cf
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x188(%rbp), %rdi
callq 0x5518
testb $0x1, -0x189(%rbp)
jne 0x327da
jmp 0x327eb
movq -0x4e8(%rbp), %rdi
movl $0x28, %esi
callq 0x52b0
jmp 0x336a3
leaq 0x12c2b(%rip), %rsi     # 0x45422
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x4e9(%rbp)
jmp 0x32808
movb -0x4e9(%rbp), %al
testb $0x1, %al
jne 0x32817
jmp 0x3291f
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x68(%rax), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x4f8(%rbp)
jmp 0x32838
movq -0x4f8(%rbp), %rax
movq %rax, -0x198(%rbp)
movq -0x198(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0x1b8(%rbp), %rdi
callq *%rax
jmp 0x3285e
leaq -0x1b8(%rbp), %rdi
leaq 0x34b94(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, -0x4f9(%rbp)
leaq -0x1b8(%rbp), %rdi
callq 0x5518
movb -0x4f9(%rbp), %al
testb $0x1, %al
jne 0x3288f
jmp 0x328a6
movq -0x198(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq -0x18(%rbp), %rsi
addq $0x48, %rsi
leaq -0x1d8(%rbp), %rdi
callq 0x5130
jmp 0x328bc
movq -0x418(%rbp), %rdi
movq -0x198(%rbp), %rdx
leaq -0x1d8(%rbp), %rsi
callq 0x33a70
movq %rax, -0x508(%rbp)
jmp 0x328df
movq -0x508(%rbp), %rax
movq %rax, -0x8(%rbp)
leaq -0x1d8(%rbp), %rdi
callq 0x5518
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x1d8(%rbp), %rdi
callq 0x5518
jmp 0x336a3
leaq 0x12b0d(%rip), %rsi     # 0x45433
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x509(%rbp)
jmp 0x32937
movb -0x509(%rbp), %al
testb $0x1, %al
jne 0x32946
jmp 0x32ae4
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x518(%rbp)
jmp 0x32967
movq -0x518(%rbp), %rax
movq %rax, -0x1e0(%rbp)
movq -0x1e0(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0x200(%rbp), %rdi
callq *%rax
jmp 0x3298d
leaq -0x200(%rbp), %rdi
leaq 0x34a65(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, -0x519(%rbp)
leaq -0x200(%rbp), %rdi
callq 0x5518
movb -0x519(%rbp), %al
testb $0x1, %al
jne 0x329be
jmp 0x329d5
movq -0x1e0(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x70(%rax), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x528(%rbp)
jmp 0x329f6
movq -0x528(%rbp), %rax
movq %rax, -0x208(%rbp)
movq -0x208(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0x228(%rbp), %rdi
callq *%rax
jmp 0x32a1c
leaq -0x228(%rbp), %rdi
leaq 0x349d6(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, -0x529(%rbp)
leaq -0x228(%rbp), %rdi
callq 0x5518
movb -0x529(%rbp), %al
testb $0x1, %al
jne 0x32a4d
jmp 0x32a64
movq -0x208(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq -0x18(%rbp), %rsi
addq $0x50, %rsi
leaq -0x248(%rbp), %rdi
callq 0x5130
jmp 0x32a7a
movq -0x418(%rbp), %rdi
movq -0x1e0(%rbp), %rdx
movq -0x208(%rbp), %rcx
leaq -0x248(%rbp), %rsi
callq 0x33ca0
movq %rax, -0x538(%rbp)
jmp 0x32aa4
movq -0x538(%rbp), %rax
movq %rax, -0x8(%rbp)
leaq -0x248(%rbp), %rdi
callq 0x5518
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x248(%rbp), %rdi
callq 0x5518
jmp 0x336a3
leaq 0x12967(%rip), %rsi     # 0x45452
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x539(%rbp)
jmp 0x32afc
movb -0x539(%rbp), %al
testb $0x1, %al
jne 0x32b08
jmp 0x32b3c
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x34530
movq %rax, -0x548(%rbp)
jmp 0x32b25
movq -0x548(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
leaq 0x1291c(%rip), %rsi     # 0x4545f
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x549(%rbp)
jmp 0x32b54
movb -0x549(%rbp), %al
testb $0x1, %al
jne 0x32b63
jmp 0x32d4c
jmp 0x32b65
jmp 0x32b67
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x558(%rbp)
jmp 0x32b88
movq -0x558(%rbp), %rax
movq %rax, -0x250(%rbp)
movq -0x250(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0x270(%rbp), %rdi
callq *%rax
jmp 0x32bae
leaq -0x270(%rbp), %rdi
leaq 0x34844(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, -0x559(%rbp)
leaq -0x270(%rbp), %rdi
callq 0x5518
movb -0x559(%rbp), %al
testb $0x1, %al
jne 0x32bdf
jmp 0x32bf6
movq -0x250(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq -0x250(%rbp), %rdi
callq 0x31fc0
movb %al, -0x55a(%rbp)
jmp 0x32c0a
movb -0x55a(%rbp), %al
testb $0x1, %al
jne 0x32c30
jmp 0x32c16
leaq 0x339a3(%rip), %rax     # 0x665c0
movq (%rax), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x50(%rax), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x568(%rbp)
jmp 0x32c51
movq -0x568(%rbp), %rax
movq %rax, -0x278(%rbp)
movq -0x278(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
movb $0x0, -0x2b9(%rbp)
leaq -0x298(%rbp), %rdi
callq *%rax
jmp 0x32c7e
leaq -0x298(%rbp), %rdi
leaq 0x34774(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x569(%rbp)
jne 0x32cd8
movq -0x278(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0x2b8(%rbp), %rdi
callq *%rax
jmp 0x32cb8
movb $0x1, -0x2b9(%rbp)
leaq -0x2b8(%rbp), %rdi
leaq 0x346d3(%rip), %rsi     # 0x673a0
callq 0x16920
movb %al, -0x569(%rbp)
movb -0x569(%rbp), %al
movb %al, -0x56a(%rbp)
testb $0x1, -0x2b9(%rbp)
jne 0x32cef
jmp 0x32cfb
leaq -0x2b8(%rbp), %rdi
callq 0x5518
leaq -0x298(%rbp), %rdi
callq 0x5518
movb -0x56a(%rbp), %al
testb $0x1, %al
jne 0x32d13
jmp 0x32d47
movq -0x278(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x298(%rbp), %rdi
callq 0x5518
jmp 0x336a3
jmp 0x32b65
leaq 0x12690(%rip), %rsi     # 0x453e3
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x56b(%rbp)
jmp 0x32d64
movb -0x56b(%rbp), %al
testb $0x1, %al
jne 0x32d70
jmp 0x32da4
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x345d0
movq %rax, -0x578(%rbp)
jmp 0x32d8d
movq -0x578(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
leaq 0x126c4(%rip), %rsi     # 0x4546f
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x579(%rbp)
jmp 0x32dbc
movb -0x579(%rbp), %al
testb $0x1, %al
jne 0x32dc8
jmp 0x32e43
movl $0x30, %edi
callq 0x52a0
movq %rax, -0x588(%rbp)
jmp 0x32ddb
movq -0x588(%rbp), %rdi
movq -0x18(%rbp), %rax
movq %rax, %rsi
addq $0x48, %rsi
movq 0x60(%rax), %rdx
movq -0x20(%rbp), %rcx
callq 0x386a0
jmp 0x32dfc
movq -0x588(%rbp), %rax
movq %rax, -0x2c8(%rbp)
movq -0x2c8(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq -0x588(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
movl $0x30, %esi
callq 0x52b0
jmp 0x336a3
leaq 0x12635(%rip), %rsi     # 0x4547f
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x589(%rbp)
jmp 0x32e5b
movb -0x589(%rbp), %al
testb $0x1, %al
jne 0x32e6a
jmp 0x33082
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x598(%rbp)
jmp 0x32e8b
movq -0x598(%rbp), %rax
movq %rax, -0x2d0(%rbp)
movq -0x2d0(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0x2f0(%rbp), %rdi
callq *%rax
jmp 0x32eb1
leaq -0x2f0(%rbp), %rdi
leaq 0x34541(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, -0x599(%rbp)
leaq -0x2f0(%rbp), %rdi
callq 0x5518
movb -0x599(%rbp), %al
testb $0x1, %al
jne 0x32ee2
jmp 0x32ef9
movq -0x2d0(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
leaq -0x308(%rbp), %rdi
callq 0x38710
movq -0x18(%rbp), %rax
addq $0x50, %rax
movq %rax, -0x310(%rbp)
movq -0x310(%rbp), %rdi
callq 0x1bf30
movq %rax, -0x318(%rbp)
movq -0x310(%rbp), %rdi
callq 0x1bf60
movq %rax, -0x320(%rbp)
leaq -0x318(%rbp), %rdi
leaq -0x320(%rbp), %rsi
callq 0x1bf90
testb $0x1, %al
jne 0x32f56
jmp 0x3303c
leaq -0x318(%rbp), %rdi
callq 0x1bfd0
movq -0x418(%rbp), %rdi
movq (%rax), %rax
movq %rax, -0x328(%rbp)
movq -0x328(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x5a8(%rbp)
jmp 0x32f8c
movq -0x5a8(%rbp), %rax
movq %rax, -0x330(%rbp)
movq -0x330(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0x350(%rbp), %rdi
callq *%rax
jmp 0x32fb2
leaq -0x350(%rbp), %rdi
leaq 0x34440(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, -0x5a9(%rbp)
leaq -0x350(%rbp), %rdi
callq 0x5518
movb -0x5a9(%rbp), %al
testb $0x1, %al
jne 0x32fe3
jmp 0x33014
movq -0x330(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x33071
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x308(%rbp), %rdi
callq 0x37fb0
jmp 0x336a3
leaq -0x308(%rbp), %rdi
leaq -0x330(%rbp), %rsi
callq 0x37650
jmp 0x33029
jmp 0x3302b
leaq -0x318(%rbp), %rdi
callq 0x1bff0
jmp 0x32f3a
movq -0x418(%rbp), %rdi
movq -0x2d0(%rbp), %rsi
leaq -0x308(%rbp), %rdx
callq 0x34750
movq %rax, -0x5b8(%rbp)
jmp 0x3305f
movq -0x5b8(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
leaq -0x308(%rbp), %rdi
callq 0x37fb0
jmp 0x3368d
leaq 0x12340(%rip), %rsi     # 0x453c9
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x5b9(%rbp)
jmp 0x3309a
movb -0x5b9(%rbp), %al
testb $0x1, %al
jne 0x330a9
jmp 0x33260
leaq -0x368(%rbp), %rdi
callq 0x38710
movq -0x18(%rbp), %rax
addq $0x48, %rax
movq %rax, -0x370(%rbp)
movq -0x370(%rbp), %rdi
callq 0x1bf30
movq %rax, -0x378(%rbp)
movq -0x370(%rbp), %rdi
callq 0x1bf60
movq %rax, -0x380(%rbp)
leaq -0x378(%rbp), %rdi
leaq -0x380(%rbp), %rsi
callq 0x1bf90
testb $0x1, %al
jne 0x33106
jmp 0x331e3
leaq -0x378(%rbp), %rdi
callq 0x1bfd0
movq -0x418(%rbp), %rdi
movq (%rax), %rax
movq %rax, -0x388(%rbp)
movq -0x388(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x5c8(%rbp)
jmp 0x3313c
movq -0x5c8(%rbp), %rax
movq %rax, -0x390(%rbp)
movq -0x390(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0x3b0(%rbp), %rdi
callq *%rax
jmp 0x33162
leaq -0x3b0(%rbp), %rdi
leaq 0x34290(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, -0x5c9(%rbp)
leaq -0x3b0(%rbp), %rdi
callq 0x5518
movb -0x5c9(%rbp), %al
testb $0x1, %al
jne 0x33193
jmp 0x331bb
movq -0x390(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3323e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x3324f
leaq -0x368(%rbp), %rdi
leaq -0x390(%rbp), %rsi
callq 0x37650
jmp 0x331d0
jmp 0x331d2
leaq -0x378(%rbp), %rdi
callq 0x1bff0
jmp 0x330ea
movl $0x20, %edi
callq 0x52a0
movq %rax, -0x5d8(%rbp)
jmp 0x331f6
movq -0x5d8(%rbp), %rdi
leaq -0x368(%rbp), %rsi
callq 0x38730
jmp 0x3320b
movq -0x5d8(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3323e
movq -0x5d8(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
movl $0x20, %esi
callq 0x52b0
jmp 0x3324f
leaq -0x368(%rbp), %rdi
callq 0x37fb0
jmp 0x3368d
leaq -0x368(%rbp), %rdi
callq 0x37fb0
jmp 0x336a3
leaq 0x12227(%rip), %rsi     # 0x4548e
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x5d9(%rbp)
jmp 0x33278
movb -0x5d9(%rbp), %al
testb $0x1, %al
jne 0x33287
jmp 0x333e3
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x5e8(%rbp)
jmp 0x332a8
movq -0x5e8(%rbp), %rax
movq %rax, -0x3b8(%rbp)
movq -0x3b8(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0x3d8(%rbp), %rdi
callq *%rax
jmp 0x332ce
leaq -0x3d8(%rbp), %rdi
leaq 0x34124(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, -0x5e9(%rbp)
leaq -0x3d8(%rbp), %rdi
callq 0x5518
movb -0x5e9(%rbp), %al
testb $0x1, %al
jne 0x332ff
jmp 0x33316
movq -0x3b8(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x50(%rax), %rsi
movq -0x20(%rbp), %rdx
callq 0x32080
movq %rax, -0x5f8(%rbp)
jmp 0x33337
movq -0x5f8(%rbp), %rax
movq %rax, -0x3e0(%rbp)
movq -0x3e0(%rbp), %rsi
movq (%rsi), %rax
movq (%rax), %rax
leaq -0x400(%rbp), %rdi
callq *%rax
jmp 0x3335d
leaq -0x400(%rbp), %rdi
leaq 0x34095(%rip), %rsi     # 0x67400
callq 0x16920
movb %al, -0x5f9(%rbp)
leaq -0x400(%rbp), %rdi
callq 0x5518
movb -0x5f9(%rbp), %al
testb $0x1, %al
jne 0x3338e
jmp 0x333a5
movq -0x3e0(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
movq -0x418(%rbp), %rdi
movq -0x3b8(%rbp), %rsi
movq -0x3e0(%rbp), %rdx
movq -0x20(%rbp), %rcx
callq 0x34c60
movq %rax, -0x608(%rbp)
jmp 0x333cc
movq -0x608(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
leaq 0x120b4(%rip), %rsi     # 0x4549e
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x609(%rbp)
jmp 0x333fb
movb -0x609(%rbp), %al
testb $0x1, %al
jne 0x33407
jmp 0x3343b
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x34f90
movq %rax, -0x618(%rbp)
jmp 0x33424
movq -0x618(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
leaq 0x1206b(%rip), %rsi     # 0x454ad
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x619(%rbp)
jmp 0x33453
movb -0x619(%rbp), %al
testb $0x1, %al
jne 0x3345f
jmp 0x33493
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x35280
movq %rax, -0x628(%rbp)
jmp 0x3347c
movq -0x628(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
leaq 0x12022(%rip), %rsi     # 0x454bc
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x629(%rbp)
jmp 0x334ab
movb -0x629(%rbp), %al
testb $0x1, %al
jne 0x334b7
jmp 0x334eb
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x354f0
movq %rax, -0x638(%rbp)
jmp 0x334d4
movq -0x638(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
leaq 0x11fd7(%rip), %rsi     # 0x454c9
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x639(%rbp)
jmp 0x33503
movb -0x639(%rbp), %al
testb $0x1, %al
jne 0x3350f
jmp 0x33543
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x35690
movq %rax, -0x648(%rbp)
jmp 0x3352c
movq -0x648(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
leaq 0x11f8c(%rip), %rsi     # 0x454d6
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x649(%rbp)
jmp 0x3355b
movb -0x649(%rbp), %al
testb $0x1, %al
jne 0x33567
jmp 0x3359b
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x35830
movq %rax, -0x658(%rbp)
jmp 0x33584
movq -0x658(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
leaq 0x11f41(%rip), %rsi     # 0x454e3
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x659(%rbp)
jmp 0x335b3
movb -0x659(%rbp), %al
testb $0x1, %al
jne 0x335bf
jmp 0x335f3
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x359d0
movq %rax, -0x668(%rbp)
jmp 0x335dc
movq -0x668(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
leaq 0x11ef8(%rip), %rsi     # 0x454f2
leaq -0x40(%rbp), %rdi
callq 0x385c0
movb %al, -0x669(%rbp)
jmp 0x3360b
movb -0x669(%rbp), %al
testb $0x1, %al
jne 0x33617
jmp 0x33648
movq -0x418(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x35ba0
movq %rax, -0x678(%rbp)
jmp 0x33634
movq -0x678(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x3368d
jmp 0x3364a
jmp 0x3364c
jmp 0x3364e
jmp 0x33650
jmp 0x33652
jmp 0x33654
jmp 0x33656
jmp 0x33658
jmp 0x3365a
jmp 0x3365c
jmp 0x3365e
jmp 0x33660
jmp 0x33662
jmp 0x33664
jmp 0x33666
jmp 0x33668
jmp 0x3366a
jmp 0x3366c
jmp 0x3366e
jmp 0x33670
jmp 0x33672
jmp 0x33674
jmp 0x33676
jmp 0x33678
leaq 0x32f41(%rip), %rax     # 0x665c0
movq (%rax), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x50(%rbp)
leaq -0x40(%rbp), %rdi
callq 0x5518
movq -0x8(%rbp), %rax
addq $0x680, %rsp            # imm = 0x680
popq %rbp
retq
leaq -0x40(%rbp), %rdi
callq 0x5518
movq -0x48(%rbp), %rdi
callq 0x5490
nopw %cs:(%rax,%rax)