// File: aadityanaik[P]LongNums/src/longnums.cpp
// Function: LongNumber::operator*(LongNumber)
LongNumber LongNumber::operator*(LongNumber X) {
	LongNumber answer;

	if((*this) == 0 || X == 0) {
		return answer;
	}

	if(this->absolute() < std::numeric_limits<int>::max()){
		long int multiplier = this->absolute().toLong();
		answer = X * multiplier;
	} else if(X.absolute() < std::numeric_limits<int>::max()) {
		long int multiplier = X.absolute().toLong();
		answer = (*this) * multiplier;
	} else {
		//determine the value of the position to split the numbers
		//(*this) will be split into x1, x2 and X will be split into y1 and y2
		//z2 = x1y1, z0 = x2y2 and z1 = x1y2 + x2y1 = (x1 + x2) (y1 + y2) - z2 - z0
		//to be returned: z2 * b^2 + z1 * b + z0 where b is BASE ^ midpos

		//determining midpos
		int midpos, numZero;
		if((*this) >= X) {
			midpos = this->digits.size() / 2;
			//numZero = this->digits.size() - midpos;
			numZero = midpos;
		} else {
			midpos = X.digits.size() / 2;
			//numZero = X.digits.size() - midpos;
			numZero = midpos;
		}

		//declaring x1, x2, y1, y2 using vector constructor
		LongNumber x1, x2, y1, y2, z0, z1, z2;
		if(this->digits.size() <= numZero) {
			x1 = 0;
			x2.digits = this->digits;
		} else {
			x1.digits = std::vector<int>(this->digits.begin() + numZero, this->digits.end());
			x2.digits = std::vector<int>(this->digits.begin(), this->digits.begin() + numZero);
		}

		if(X.digits.size() <= numZero) {
			y1 = 0;
			y2.digits = X.digits;
		} else {
			y1.digits = std::vector<int>(X.digits.begin() + numZero, X.digits.end());
			y2.digits = std::vector<int>(X.digits.begin(), X.digits.begin() + numZero);
		}

		//removing trailing zeroes from x2 and y2
		while(*(x2.digits.end() - 1) == 0 && x2.digits.size() > 1) {
			x2.digits.erase(x2.digits.end() - 1);
		}

		while(*(y2.digits.end() - 1) == 0 && y2.digits.size() > 1) {
			y2.digits.erase(y2.digits.end() - 1);
		}

		//to find z2
		z2 = x1 * y1;

		//to find z0
		z0 = x2 * y2;

		//to find z1
		{
			LongNumber sumX, sumY, prodSums;
			sumX = x1 + x2;
			sumY = y1 + y2;
			prodSums = sumX * sumY;

			z1 = prodSums - z2 - z0;
		}		

		//get the answer
		//first append twice the number of zeros of numZeros to z2 and numZeros to z1
		for(int i = 1; i <= 2 * numZero; i++) {
			if(z2 != 0) {
				z2 = z2 * BASE;
			}

			if(i <= numZero && z1 != 0) {
				z1 = z1 * BASE;
			}
		}
		answer = z2 + z1 + z0;
	}

	answer.negative = negative ^ X.negative;

	return answer;
}

// Assembly:
subq $0x7e8, %rsp            # imm = 0x7E8
movq %rdx, 0xa8(%rsp)
movq %rdi, 0xb0(%rsp)
movq %rdi, %rax
movq %rax, 0xb8(%rsp)
movq %rdi, 0x7e0(%rsp)
movq %rsi, 0x7d8(%rsp)
movq %rdx, 0x7d0(%rsp)
movq 0x7d8(%rsp), %rax
movq %rax, 0xc0(%rsp)
movb $0x0, 0x7cf(%rsp)
callq 0x2a10
movq $0x0, 0x7a0(%rsp)
movb $0x0, 0x767(%rsp)
leaq 0x7a8(%rsp), %rdi
leaq 0x7a0(%rsp), %rsi
callq 0x30a0
jmp 0x45c2
movq 0xc0(%rsp), %rdi
leaq 0x7a8(%rsp), %rsi
callq 0x37e0
movb %al, 0xa7(%rsp)
jmp 0x45e0
movb 0xa7(%rsp), %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, 0xa6(%rsp)
jne 0x4650
jmp 0x45f7
movq $0x0, 0x768(%rsp)
leaq 0x770(%rsp), %rdi
leaq 0x768(%rsp), %rsi
callq 0x30a0
jmp 0x461a
movq 0xa8(%rsp), %rdi
movb $0x1, 0x767(%rsp)
leaq 0x770(%rsp), %rsi
callq 0x37e0
movb %al, 0xa5(%rsp)
jmp 0x4640
movb 0xa5(%rsp), %al
movb %al, 0xa6(%rsp)
jmp 0x4650
movb 0xa6(%rsp), %al
movb %al, 0xa4(%rsp)
testb $0x1, 0x767(%rsp)
jne 0x466a
jmp 0x4677
leaq 0x770(%rsp), %rdi
callq 0x2a80
leaq 0x7a8(%rsp), %rdi
callq 0x2a80
movb 0xa4(%rsp), %al
testb $0x1, %al
jne 0x4694
jmp 0x471c
movb $0x1, 0x7cf(%rsp)
movl $0x1, 0x760(%rsp)
jmp 0x5b60
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x470a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
testb $0x1, 0x767(%rsp)
jne 0x46fb
jmp 0x4708
leaq 0x770(%rsp), %rdi
callq 0x2a80
jmp 0x470a
leaq 0x7a8(%rsp), %rdi
callq 0x2a80
jmp 0x5b87
movq 0xc0(%rsp), %rsi
leaq 0x740(%rsp), %rdi
callq 0x3240
jmp 0x4733
callq 0x76d0
cltq
movq %rax, 0x718(%rsp)
leaq 0x720(%rsp), %rdi
leaq 0x718(%rsp), %rsi
callq 0x30a0
jmp 0x4759
leaq 0x740(%rsp), %rdi
leaq 0x720(%rsp), %rsi
callq 0x34f0
movb %al, 0xa3(%rsp)
leaq 0x720(%rsp), %rdi
callq 0x2a80
leaq 0x740(%rsp), %rdi
callq 0x2a80
movb 0xa3(%rsp), %al
testb $0x1, %al
jne 0x479f
jmp 0x4884
movq 0xc0(%rsp), %rsi
leaq 0x6f0(%rsp), %rdi
callq 0x3240
jmp 0x47b6
leaq 0x6f0(%rsp), %rdi
movq %rdi, 0x90(%rsp)
callq 0x3180
movq 0x90(%rsp), %rdi
movq %rax, 0x98(%rsp)
callq 0x2a80
movq 0x98(%rsp), %rax
movq 0xa8(%rsp), %rsi
movq %rax, 0x710(%rsp)
movq 0x710(%rsp), %rdx
leaq 0x6d0(%rsp), %rdi
callq 0x5bb0
jmp 0x480f
movq 0xb0(%rsp), %rdi
leaq 0x6d0(%rsp), %rsi
callq 0x81f0
jmp 0x4826
leaq 0x6d0(%rsp), %rdi
callq 0x2a80
jmp 0x5b15
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x740(%rsp), %rdi
callq 0x2a80
jmp 0x5b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x6d0(%rsp), %rdi
callq 0x2a80
jmp 0x5b87
movq 0xa8(%rsp), %rsi
leaq 0x6b0(%rsp), %rdi
callq 0x3240
jmp 0x489b
callq 0x76d0
cltq
movq %rax, 0x688(%rsp)
leaq 0x690(%rsp), %rdi
leaq 0x688(%rsp), %rsi
callq 0x30a0
jmp 0x48c1
leaq 0x6b0(%rsp), %rdi
leaq 0x690(%rsp), %rsi
callq 0x34f0
movb %al, 0x8f(%rsp)
leaq 0x690(%rsp), %rdi
callq 0x2a80
leaq 0x6b0(%rsp), %rdi
callq 0x2a80
movb 0x8f(%rsp), %al
testb $0x1, %al
jne 0x4907
jmp 0x49e6
movq 0xa8(%rsp), %rsi
leaq 0x660(%rsp), %rdi
callq 0x3240
jmp 0x491e
leaq 0x660(%rsp), %rdi
movq %rdi, 0x78(%rsp)
callq 0x3180
movq 0x78(%rsp), %rdi
movq %rax, 0x80(%rsp)
callq 0x2a80
movq 0x80(%rsp), %rax
movq 0xc0(%rsp), %rsi
movq %rax, 0x680(%rsp)
movq 0x680(%rsp), %rdx
leaq 0x640(%rsp), %rdi
callq 0x5bb0
jmp 0x4971
movq 0xb0(%rsp), %rdi
leaq 0x640(%rsp), %rsi
callq 0x81f0
jmp 0x4988
leaq 0x640(%rsp), %rdi
callq 0x2a80
jmp 0x5b13
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x6b0(%rsp), %rdi
callq 0x2a80
jmp 0x5b87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x640(%rsp), %rdi
callq 0x2a80
jmp 0x5b87
movq 0xa8(%rsp), %rsi
movq 0xc0(%rsp), %rdi
callq 0x3840
movb %al, 0x77(%rsp)
jmp 0x4a01
movb 0x77(%rsp), %al
testb $0x1, %al
jne 0x4a0b
jmp 0x4a32
movq 0xc0(%rsp), %rdi
callq 0x7fb0
shrq %rax
movl %eax, 0x63c(%rsp)
movl 0x63c(%rsp), %eax
movl %eax, 0x638(%rsp)
jmp 0x4a57
movq 0xa8(%rsp), %rdi
callq 0x7fb0
shrq %rax
movl %eax, 0x63c(%rsp)
movl 0x63c(%rsp), %eax
movl %eax, 0x638(%rsp)
leaq 0x618(%rsp), %rdi
callq 0x2a10
jmp 0x4a66
leaq 0x5f8(%rsp), %rdi
callq 0x2a10
jmp 0x4a75
leaq 0x5d8(%rsp), %rdi
callq 0x2a10
jmp 0x4a84
leaq 0x5b8(%rsp), %rdi
callq 0x2a10
jmp 0x4a93
leaq 0x598(%rsp), %rdi
callq 0x2a10
jmp 0x4aa2
leaq 0x578(%rsp), %rdi
callq 0x2a10
jmp 0x4ab1
leaq 0x558(%rsp), %rdi
callq 0x2a10
jmp 0x4ac0
movq 0xc0(%rsp), %rdi
callq 0x7fb0
movslq 0x638(%rsp), %rcx
cmpq %rcx, %rax
ja 0x4bcc
movq $0x0, 0x550(%rsp)
leaq 0x618(%rsp), %rdi
leaq 0x550(%rsp), %rsi
callq 0x3100
jmp 0x4b01
movq 0xc0(%rsp), %rsi
leaq 0x5f8(%rsp), %rdi
callq 0x7780
jmp 0x4b18
jmp 0x4d74
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5b04
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5af7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5aea
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5add
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5ad0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5ac3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5ab6
movq 0xc0(%rsp), %rdi
callq 0x7b90
movq %rax, 0x528(%rsp)
movslq 0x638(%rsp), %rsi
leaq 0x528(%rsp), %rdi
callq 0x8230
movq 0xc0(%rsp), %rdi
movq %rax, 0x530(%rsp)
callq 0x7c00
movq %rax, 0x520(%rsp)
leaq 0x51f(%rsp), %rdi
movq %rdi, 0x68(%rsp)
callq 0x8270
movq 0x68(%rsp), %rcx
movq 0x530(%rsp), %rsi
movq 0x520(%rsp), %rdx
leaq 0x538(%rsp), %rdi
callq 0x8280
jmp 0x4c49
leaq 0x618(%rsp), %rdi
leaq 0x538(%rsp), %rsi
movq %rsi, 0x58(%rsp)
callq 0x8310
movq 0x58(%rsp), %rdi
callq 0x7720
leaq 0x51f(%rsp), %rdi
callq 0x8350
movq 0xc0(%rsp), %rdi
callq 0x7b90
movq 0xc0(%rsp), %rdi
movq %rax, 0x4f8(%rsp)
callq 0x7b90
movq %rax, 0x4e8(%rsp)
movslq 0x638(%rsp), %rsi
leaq 0x4e8(%rsp), %rdi
callq 0x8230
movq %rax, 0x4f0(%rsp)
leaq 0x4e7(%rsp), %rdi
movq %rdi, 0x60(%rsp)
callq 0x8270
movq 0x60(%rsp), %rcx
movq 0x4f8(%rsp), %rsi
movq 0x4f0(%rsp), %rdx
leaq 0x500(%rsp), %rdi
callq 0x8280
jmp 0x4cf7
leaq 0x5f8(%rsp), %rdi
leaq 0x500(%rsp), %rsi
callq 0x8310
leaq 0x500(%rsp), %rdi
callq 0x7720
leaq 0x4e7(%rsp), %rdi
callq 0x8350
jmp 0x4d74
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x51f(%rsp), %rdi
callq 0x8350
jmp 0x5ab6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x4e7(%rsp), %rdi
callq 0x8350
jmp 0x5ab6
movq 0xa8(%rsp), %rdi
callq 0x7fb0
movslq 0x638(%rsp), %rcx
cmpq %rcx, %rax
ja 0x4dcd
movq $0x0, 0x4d8(%rsp)
leaq 0x5d8(%rsp), %rdi
leaq 0x4d8(%rsp), %rsi
callq 0x3100
jmp 0x4db1
movq 0xa8(%rsp), %rsi
leaq 0x5b8(%rsp), %rdi
callq 0x7780
jmp 0x4dc8
jmp 0x4f75
movq 0xa8(%rsp), %rdi
callq 0x7b90
movq %rax, 0x4b0(%rsp)
movslq 0x638(%rsp), %rsi
leaq 0x4b0(%rsp), %rdi
callq 0x8230
movq 0xa8(%rsp), %rdi
movq %rax, 0x4b8(%rsp)
callq 0x7c00
movq %rax, 0x4a8(%rsp)
leaq 0x4a7(%rsp), %rdi
movq %rdi, 0x50(%rsp)
callq 0x8270
movq 0x50(%rsp), %rcx
movq 0x4b8(%rsp), %rsi
movq 0x4a8(%rsp), %rdx
leaq 0x4c0(%rsp), %rdi
callq 0x8280
jmp 0x4e4a
leaq 0x5d8(%rsp), %rdi
leaq 0x4c0(%rsp), %rsi
movq %rsi, 0x40(%rsp)
callq 0x8310
movq 0x40(%rsp), %rdi
callq 0x7720
leaq 0x4a7(%rsp), %rdi
callq 0x8350
movq 0xa8(%rsp), %rdi
callq 0x7b90
movq 0xa8(%rsp), %rdi
movq %rax, 0x480(%rsp)
callq 0x7b90
movq %rax, 0x470(%rsp)
movslq 0x638(%rsp), %rsi
leaq 0x470(%rsp), %rdi
callq 0x8230
movq %rax, 0x478(%rsp)
leaq 0x46f(%rsp), %rdi
movq %rdi, 0x48(%rsp)
callq 0x8270
movq 0x48(%rsp), %rcx
movq 0x480(%rsp), %rsi
movq 0x478(%rsp), %rdx
leaq 0x488(%rsp), %rdi
callq 0x8280
jmp 0x4ef8
leaq 0x5b8(%rsp), %rdi
leaq 0x488(%rsp), %rsi
callq 0x8310
leaq 0x488(%rsp), %rdi
callq 0x7720
leaq 0x46f(%rsp), %rdi
callq 0x8350
jmp 0x4f75
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x4a7(%rsp), %rdi
callq 0x8350
jmp 0x5ab6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x46f(%rsp), %rdi
callq 0x8350
jmp 0x5ab6
jmp 0x4f77
leaq 0x5f8(%rsp), %rdi
callq 0x7c00
movq %rax, 0x458(%rsp)
leaq 0x458(%rsp), %rdi
movl $0x1, %esi
callq 0x7e60
movq %rax, 0x460(%rsp)
leaq 0x460(%rsp), %rdi
callq 0x7c30
movq %rax, %rcx
xorl %eax, %eax
cmpl $0x0, (%rcx)
movb %al, 0x3f(%rsp)
jne 0x4fd9
leaq 0x5f8(%rsp), %rdi
callq 0x7fb0
cmpq $0x1, %rax
seta %al
movb %al, 0x3f(%rsp)
movb 0x3f(%rsp), %al
testb $0x1, %al
jne 0x4fe3
jmp 0x5057
leaq 0x5f8(%rsp), %rdi
movq %rdi, 0x28(%rsp)
callq 0x7c00
movq %rax, 0x440(%rsp)
leaq 0x440(%rsp), %rdi
movl $0x1, %esi
callq 0x7e60
movq %rax, 0x448(%rsp)
leaq 0x450(%rsp), %rdi
leaq 0x448(%rsp), %rsi
callq 0x7d20
movq 0x28(%rsp), %rdi
movq 0x450(%rsp), %rsi
callq 0x7eb0
movq %rax, 0x30(%rsp)
jmp 0x5045
movq 0x30(%rsp), %rax
movq %rax, 0x438(%rsp)
jmp 0x4f77
jmp 0x5059
leaq 0x5b8(%rsp), %rdi
callq 0x7c00
movq %rax, 0x428(%rsp)
leaq 0x428(%rsp), %rdi
movl $0x1, %esi
callq 0x7e60
movq %rax, 0x430(%rsp)
leaq 0x430(%rsp), %rdi
callq 0x7c30
movq %rax, %rcx
xorl %eax, %eax
cmpl $0x0, (%rcx)
movb %al, 0x27(%rsp)
jne 0x50bb
leaq 0x5b8(%rsp), %rdi
callq 0x7fb0
cmpq $0x1, %rax
seta %al
movb %al, 0x27(%rsp)
movb 0x27(%rsp), %al
testb $0x1, %al
jne 0x50c5
jmp 0x5139
leaq 0x5b8(%rsp), %rdi
movq %rdi, 0x10(%rsp)
callq 0x7c00
movq %rax, 0x410(%rsp)
leaq 0x410(%rsp), %rdi
movl $0x1, %esi
callq 0x7e60
movq %rax, 0x418(%rsp)
leaq 0x420(%rsp), %rdi
leaq 0x418(%rsp), %rsi
callq 0x7d20
movq 0x10(%rsp), %rdi
movq 0x420(%rsp), %rsi
callq 0x7eb0
movq %rax, 0x18(%rsp)
jmp 0x5127
movq 0x18(%rsp), %rax
movq %rax, 0x408(%rsp)
jmp 0x5059
leaq 0x3c8(%rsp), %rdi
leaq 0x5d8(%rsp), %rsi
callq 0x2a90
jmp 0x5150
leaq 0x3e8(%rsp), %rdi
leaq 0x618(%rsp), %rsi
leaq 0x3c8(%rsp), %rdx
callq 0x4540
jmp 0x516f
leaq 0x558(%rsp), %rdi
leaq 0x3e8(%rsp), %rsi
callq 0x81f0
jmp 0x5186
leaq 0x3e8(%rsp), %rdi
callq 0x2a80
leaq 0x3c8(%rsp), %rdi
callq 0x2a80
leaq 0x388(%rsp), %rdi
leaq 0x5b8(%rsp), %rsi
callq 0x2a90
jmp 0x51b7
leaq 0x3a8(%rsp), %rdi
leaq 0x5f8(%rsp), %rsi
leaq 0x388(%rsp), %rdx
callq 0x4540
jmp 0x51d6
leaq 0x598(%rsp), %rdi
leaq 0x3a8(%rsp), %rsi
callq 0x81f0
jmp 0x51ed
leaq 0x3a8(%rsp), %rdi
callq 0x2a80
leaq 0x388(%rsp), %rdi
callq 0x2a80
leaq 0x368(%rsp), %rdi
callq 0x2a10
jmp 0x5216
leaq 0x348(%rsp), %rdi
callq 0x2a10
jmp 0x5225
leaq 0x328(%rsp), %rdi
callq 0x2a10
jmp 0x5234
leaq 0x2e8(%rsp), %rdi
leaq 0x5f8(%rsp), %rsi
callq 0x2a90
jmp 0x524b
leaq 0x308(%rsp), %rdi
leaq 0x618(%rsp), %rsi
leaq 0x2e8(%rsp), %rdx
callq 0x38c0
jmp 0x526a
leaq 0x368(%rsp), %rdi
leaq 0x308(%rsp), %rsi
callq 0x81f0
jmp 0x5281
leaq 0x308(%rsp), %rdi
callq 0x2a80
leaq 0x2e8(%rsp), %rdi
callq 0x2a80
leaq 0x2a8(%rsp), %rdi
leaq 0x5b8(%rsp), %rsi
callq 0x2a90
jmp 0x52b2
leaq 0x2c8(%rsp), %rdi
leaq 0x5d8(%rsp), %rsi
leaq 0x2a8(%rsp), %rdx
callq 0x38c0
jmp 0x52d1
leaq 0x348(%rsp), %rdi
leaq 0x2c8(%rsp), %rsi
callq 0x81f0
jmp 0x52e8
leaq 0x2c8(%rsp), %rdi
callq 0x2a80
leaq 0x2a8(%rsp), %rdi
callq 0x2a80
leaq 0x268(%rsp), %rdi
leaq 0x348(%rsp), %rsi
callq 0x2a90
jmp 0x5319
leaq 0x288(%rsp), %rdi
leaq 0x368(%rsp), %rsi
leaq 0x268(%rsp), %rdx
callq 0x4540
jmp 0x5338
leaq 0x328(%rsp), %rdi
leaq 0x288(%rsp), %rsi
callq 0x81f0
jmp 0x534f
leaq 0x288(%rsp), %rdi
callq 0x2a80
leaq 0x268(%rsp), %rdi
callq 0x2a80
leaq 0x208(%rsp), %rdi
leaq 0x558(%rsp), %rsi
callq 0x2a90
jmp 0x5380
leaq 0x228(%rsp), %rdi
leaq 0x328(%rsp), %rsi
leaq 0x208(%rsp), %rdx
callq 0x3e20
jmp 0x539f
leaq 0x1e8(%rsp), %rdi
leaq 0x598(%rsp), %rsi
callq 0x2a90
jmp 0x53b6
leaq 0x248(%rsp), %rdi
leaq 0x228(%rsp), %rsi
leaq 0x1e8(%rsp), %rdx
callq 0x3e20
jmp 0x53d5
leaq 0x578(%rsp), %rdi
leaq 0x248(%rsp), %rsi
callq 0x81f0
jmp 0x53ec
leaq 0x248(%rsp), %rdi
callq 0x2a80
leaq 0x1e8(%rsp), %rdi
callq 0x2a80
leaq 0x228(%rsp), %rdi
callq 0x2a80
leaq 0x208(%rsp), %rdi
callq 0x2a80
leaq 0x328(%rsp), %rdi
callq 0x2a80
leaq 0x348(%rsp), %rdi
callq 0x2a80
leaq 0x368(%rsp), %rdi
callq 0x2a80
movl $0x1, 0x1e4(%rsp)
movl 0x1e4(%rsp), %eax
movl 0x638(%rsp), %ecx
shll %ecx
cmpl %ecx, %eax
jg 0x5915
movq $0x0, 0x1b8(%rsp)
leaq 0x1c0(%rsp), %rdi
leaq 0x1b8(%rsp), %rsi
callq 0x30a0
jmp 0x548d
leaq 0x558(%rsp), %rdi
leaq 0x1c0(%rsp), %rsi
callq 0x3890
movb %al, 0xf(%rsp)
jmp 0x54a8
leaq 0x1c0(%rsp), %rdi
callq 0x2a80
movb 0xf(%rsp), %al
testb $0x1, %al
jne 0x54c2
jmp 0x57c3
movslq 0x9caf(%rip), %rdx      # 0xf178
leaq 0x198(%rsp), %rdi
leaq 0x558(%rsp), %rsi
callq 0x5bb0
jmp 0x54e0
leaq 0x558(%rsp), %rdi
leaq 0x198(%rsp), %rsi
callq 0x81f0
jmp 0x54f7
leaq 0x198(%rsp), %rdi
callq 0x2a80
jmp 0x57c3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5540
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x3e8(%rsp), %rdi
callq 0x2a80
leaq 0x3c8(%rsp), %rdi
callq 0x2a80
jmp 0x5ab6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5589
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x3a8(%rsp), %rdi
callq 0x2a80
leaq 0x388(%rsp), %rdi
callq 0x2a80
jmp 0x5ab6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5765
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5758
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x574b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x561d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x308(%rsp), %rdi
callq 0x2a80
leaq 0x2e8(%rsp), %rdi
callq 0x2a80
jmp 0x574b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5666
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x2c8(%rsp), %rdi
callq 0x2a80
leaq 0x2a8(%rsp), %rdi
callq 0x2a80
jmp 0x574b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x56af
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x288(%rsp), %rdi
callq 0x2a80
leaq 0x268(%rsp), %rdi
callq 0x2a80
jmp 0x574b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x573e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5731
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5724
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x248(%rsp), %rdi
callq 0x2a80
leaq 0x1e8(%rsp), %rdi
callq 0x2a80
leaq 0x228(%rsp), %rdi
callq 0x2a80
leaq 0x208(%rsp), %rdi
callq 0x2a80
leaq 0x328(%rsp), %rdi
callq 0x2a80
leaq 0x348(%rsp), %rdi
callq 0x2a80
leaq 0x368(%rsp), %rdi
callq 0x2a80
jmp 0x5ab6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x1c0(%rsp), %rdi
callq 0x2a80
jmp 0x5ab6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x198(%rsp), %rdi
callq 0x2a80
jmp 0x5ab6
movl 0x1e4(%rsp), %ecx
movl 0x638(%rsp), %edx
movb $0x0, 0x16f(%rsp)
xorl %eax, %eax
cmpl %edx, %ecx
movb %al, 0xe(%rsp)
jg 0x5833
movq $0x0, 0x170(%rsp)
leaq 0x178(%rsp), %rdi
leaq 0x170(%rsp), %rsi
callq 0x30a0
jmp 0x5806
movb $0x1, 0x16f(%rsp)
leaq 0x578(%rsp), %rdi
leaq 0x178(%rsp), %rsi
callq 0x3890
movb %al, 0xd(%rsp)
jmp 0x5829
movb 0xd(%rsp), %al
movb %al, 0xe(%rsp)
jmp 0x5833
movb 0xe(%rsp), %al
movb %al, 0xc(%rsp)
testb $0x1, 0x16f(%rsp)
jne 0x5847
jmp 0x5854
leaq 0x178(%rsp), %rdi
callq 0x2a80
movb 0xc(%rsp), %al
testb $0x1, %al
jne 0x5861
jmp 0x58fd
movslq 0x9910(%rip), %rdx      # 0xf178
leaq 0x148(%rsp), %rdi
leaq 0x578(%rsp), %rsi
callq 0x5bb0
jmp 0x587f
leaq 0x578(%rsp), %rdi
leaq 0x148(%rsp), %rsi
callq 0x81f0
jmp 0x5896
leaq 0x148(%rsp), %rdi
callq 0x2a80
jmp 0x58fd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
testb $0x1, 0x16f(%rsp)
jne 0x58c5
jmp 0x58d2
leaq 0x178(%rsp), %rdi
callq 0x2a80
jmp 0x5ab6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x148(%rsp), %rdi
callq 0x2a80
jmp 0x5ab6
jmp 0x58ff
movl 0x1e4(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x1e4(%rsp)
jmp 0x5452
leaq 0xe8(%rsp), %rdi
leaq 0x578(%rsp), %rsi
callq 0x2a90
jmp 0x592c
leaq 0x108(%rsp), %rdi
leaq 0x558(%rsp), %rsi
leaq 0xe8(%rsp), %rdx
callq 0x38c0
jmp 0x594b
leaq 0xc8(%rsp), %rdi
leaq 0x598(%rsp), %rsi
callq 0x2a90
jmp 0x5962
leaq 0x128(%rsp), %rdi
leaq 0x108(%rsp), %rsi
leaq 0xc8(%rsp), %rdx
callq 0x38c0
jmp 0x5981
movq 0xb0(%rsp), %rdi
leaq 0x128(%rsp), %rsi
callq 0x81f0
jmp 0x5998
leaq 0x128(%rsp), %rdi
callq 0x2a80
leaq 0xc8(%rsp), %rdi
callq 0x2a80
leaq 0x108(%rsp), %rdi
callq 0x2a80
leaq 0xe8(%rsp), %rdi
callq 0x2a80
leaq 0x558(%rsp), %rdi
callq 0x2a80
leaq 0x578(%rsp), %rdi
callq 0x2a80
leaq 0x598(%rsp), %rdi
callq 0x2a80
leaq 0x5b8(%rsp), %rdi
callq 0x2a80
leaq 0x5d8(%rsp), %rdi
callq 0x2a80
leaq 0x5f8(%rsp), %rdi
callq 0x2a80
leaq 0x618(%rsp), %rdi
callq 0x2a80
jmp 0x5b13
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5aa9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5a9c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
jmp 0x5a8f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x798(%rsp)
movl %eax, 0x794(%rsp)
leaq 0x128(%rsp), %rdi
callq 0x2a80
leaq 0xc8(%rsp), %rdi
callq 0x2a80
leaq 0x108(%rsp), %rdi
callq 0x2a80
leaq 0xe8(%rsp), %rdi
callq 0x2a80
leaq 0x558(%rsp), %rdi
callq 0x2a80
leaq 0x578(%rsp), %rdi
callq 0x2a80
leaq 0x598(%rsp), %rdi
callq 0x2a80
leaq 0x5b8(%rsp), %rdi
callq 0x2a80
leaq 0x5d8(%rsp), %rdi
callq 0x2a80
leaq 0x5f8(%rsp), %rdi
callq 0x2a80
leaq 0x618(%rsp), %rdi
callq 0x2a80
jmp 0x5b87
jmp 0x5b15
movq 0xb0(%rsp), %rax
movq 0xa8(%rsp), %rdx
movq 0xc0(%rsp), %rcx
movb 0x18(%rcx), %cl
andb $0x1, %cl
movzbl %cl, %ecx
movb 0x18(%rdx), %dl
andb $0x1, %dl
movzbl %dl, %edx
xorl %edx, %ecx
cmpl $0x0, %ecx
setne %cl
andb $0x1, %cl
movb %cl, 0x18(%rax)
movb $0x1, 0x7cf(%rsp)
movl $0x1, 0x760(%rsp)
testb $0x1, 0x7cf(%rsp)
jne 0x5b77
movq 0xb0(%rsp), %rdi
callq 0x2a80
movq 0xb8(%rsp), %rax
addq $0x7e8, %rsp            # imm = 0x7E8
retq
movq 0xb0(%rsp), %rdi
callq 0x2a80
movq 0x798(%rsp), %rdi
callq 0x2260
nopw %cs:(%rax,%rax)