// File: toxaart[P]hierarchical_block_sparse_lib/source/HierarchicalBlockSparseMatrix.h
// Function: hbsm::HierarchicalBlockSparseMatrix<double>::inv_chol(hbsm::HierarchicalBlockSparseMatrix<double> const&, hbsm::HierarchicalBlockSparseMatrix<double>&)
void HierarchicalBlockSparseMatrix<Treal>::inv_chol(HierarchicalBlockSparseMatrix<Treal> const & A, HierarchicalBlockSparseMatrix<Treal> & Z){


			if(!Z.empty()) throw std::runtime_error("Error in HierarchicalBlockSparseMatrix::inv_chol(): non-empty matrix to write result!");
			if(A.nRows_orig != A.nCols_orig) throw std::runtime_error("Error in HierarchicalBlockSparseMatrix::inv_chol(): call for non-square matrix!");

			Z.set_params(A.get_params());

			Z.resize(A.nRows_orig, A.nCols_orig);

			if(Z.lowest_level()){

				if(Z.get_first_row_position() > Z.get_n_rows()-1 || Z.get_first_col_position() > Z.get_n_cols()-1) return;

				int blocksize = Z.nRows;

				int n = Z.nRows;

				if(Z.on_bottom_boundary()) n = Z.get_n_rows() % Z.blocksize; // fill only necessary elements

				for(int i = 0; i < n; ++i) Z.submatrix[i*blocksize + i] = 1.0;

				Z.submatrix[0] = std::sqrt(1/A.submatrix[0]);
				for (int i = 1; i < n; i++) {
					Treal R;
					for (int j = 0; j < i; j++) {
						R = 0;

						for (int k = 0; k < n; k++)
							R += A.submatrix[k*blocksize+j] * Z.submatrix[i*blocksize+k];

						R *= Z.submatrix[j*blocksize+j];

						for (int k = 0; k < n; k++)
							Z.submatrix[i*blocksize+k] -= Z.submatrix[j*blocksize+k] * R;
					}
					R = 0;
					for (int k = 0; k < n; k++)
						R += A.submatrix[k*blocksize+i] * Z.submatrix[i*blocksize+k];

					R = std::sqrt(1/R);
					for (int k = 0; k < n; k++)
						Z.submatrix[i*blocksize+k] *= R;
				}

			   return;


			}

			// Z_00 = invChol(A_00)
			if(A.children[0] != NULL){
				Z.children[0] = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
				Z.children[0]->parent = &Z;
				inv_chol(*A.children[0], *Z.children[0]);
			}


			if(Z.children[0] == NULL) throw std::runtime_error("Error in HierarchicalBlockSparseMatrix::inv_chol(): smth went wrong since Z_00 is NULL!");

			// R = Z_00^T * A_01
			std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > R;

			if(A.children[2] != NULL){
				R = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
				multiply(*Z.children[0], true, *A.children[2], false, *R);
			}

			// T = Z_00 * R
			std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > T;
			if(R != NULL){
				T = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
				multiply(*Z.children[0], false, *R, false, *T);
			}


			// X = -T
			std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > X;
			if(T != NULL){
				X = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
				X->rescale(*T,-1.0);
			}

			// Y = A_10 * X
			std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > Y;

			if(A.children[1] != NULL && X != NULL){
				Y = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
				multiply(*A.children[1], false, *X, false, *Y);
			}


			// Q = Y + A_11
			std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > Q;
			if(A.children[3] != NULL){
				if(Y != NULL){
					Q = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
					add(*Y, *A.children[3], *Q);
				}
				else{
					Q = A.children[3];
				}
			}
			else{
				Q = Y;
			}

			// Z_11 = invChol(Q)
			if(Z.children[3] == NULL){
				if(Q != NULL){
					Z.children[3] = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
					Z.children[3]->parent = &Z;
					inv_chol(*Q, *Z.children[3]);
				}
			}
			else throw std::runtime_error("Error in HierarchicalBlockSparseMatrix::inv_chol(): smth went wrong since Z_11 was not NULL!");

			// Z_01 = X * Z_11
			if(Z.children[2] == NULL){
				if(X != NULL){
					Z.children[2] = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
					multiply(*X, false, *Z.children[3], false, *Z.children[2]);
				}
			}
			else std::runtime_error("Error in HierarchicalBlockSparseMatrix::inv_chol(): smth went wrong since Z_01 was not NULL!");

			// Z_10 = 0
			assert(Z.children[1] == NULL);

			return;

		}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x270, %rsp            # imm = 0x270
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x10(%rbp), %rdi
callq 0x230a0
testb $0x1, %al
jne 0x12b8c
movl $0x10, %edi
callq 0x20d0
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x138(%rbp)
leaq 0x24828(%rip), %rsi     # 0x37376
callq 0x20a0
jmp 0x12b55
movq -0x138(%rbp), %rdi
movq 0x2e48d(%rip), %rsi     # 0x40ff0
movq 0x2e456(%rip), %rdx     # 0x40fc0
callq 0x2320
movq -0x138(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
callq 0x2150
jmp 0x137df
movq -0x8(%rbp), %rax
movl 0x8(%rax), %eax
movq -0x8(%rbp), %rcx
cmpl 0xc(%rcx), %eax
je 0x12bf8
movl $0x10, %edi
callq 0x20d0
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x140(%rbp)
leaq 0x24812(%rip), %rsi     # 0x373cc
callq 0x20a0
jmp 0x12bc1
movq -0x140(%rbp), %rdi
movq 0x2e421(%rip), %rsi     # 0x40ff0
movq 0x2e3ea(%rip), %rdx     # 0x40fc0
callq 0x2320
movq -0x140(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
callq 0x2150
jmp 0x137df
movq -0x10(%rbp), %rax
movq %rax, -0x148(%rbp)
movq -0x8(%rbp), %rdi
callq 0x243e0
movq -0x148(%rbp), %rdi
movl %eax, -0x20(%rbp)
leaq -0x20(%rbp), %rsi
callq 0x8570
movq -0x10(%rbp), %rdi
movq -0x8(%rbp), %rax
movl 0x8(%rax), %esi
movq -0x8(%rbp), %rax
movl 0xc(%rax), %edx
xorl %eax, %eax
movl %eax, %ecx
callq 0x8600
movq -0x10(%rbp), %rdi
callq 0x23500
testb $0x1, %al
jne 0x12c4c
jmp 0x12fdb
movq -0x10(%rbp), %rdi
callq 0x24660
movl %eax, -0x14c(%rbp)
movq -0x10(%rbp), %rdi
callq 0x24470
movl %eax, %ecx
movl -0x14c(%rbp), %eax
subl $0x1, %ecx
cmpl %ecx, %eax
jg 0x12c9a
movq -0x10(%rbp), %rdi
callq 0x24cd0
movl %eax, -0x150(%rbp)
movq -0x10(%rbp), %rdi
callq 0x24540
movl %eax, %ecx
movl -0x150(%rbp), %eax
subl $0x1, %ecx
cmpl %ecx, %eax
jle 0x12c9f
jmp 0x137d6
movq -0x10(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x24(%rbp)
movq -0x10(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x28(%rbp)
movq -0x10(%rbp), %rdi
callq 0x24400
testb $0x1, %al
jne 0x12cc0
jmp 0x12cd4
movq -0x10(%rbp), %rdi
callq 0x24470
movq -0x10(%rbp), %rcx
cltd
idivl 0x10(%rcx)
movl %edx, -0x28(%rbp)
movl $0x0, -0x2c(%rbp)
movl -0x2c(%rbp), %eax
cmpl -0x28(%rbp), %eax
jge 0x12d14
movq -0x10(%rbp), %rdi
addq $0x70, %rdi
movl -0x2c(%rbp), %eax
imull -0x24(%rbp), %eax
addl -0x2c(%rbp), %eax
movslq %eax, %rsi
callq 0x22b60
movsd 0x2331b(%rip), %xmm0    # 0x36020
movsd %xmm0, (%rax)
movl -0x2c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x2c(%rbp)
jmp 0x12cdb
movq -0x8(%rbp), %rdi
addq $0x70, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x245a0
movsd 0x232f3(%rip), %xmm0    # 0x36020
divsd (%rax), %xmm0
callq 0x2180
movsd %xmm0, -0x158(%rbp)
movq -0x10(%rbp), %rdi
addq $0x70, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x22b60
movsd -0x158(%rbp), %xmm0
movsd %xmm0, (%rax)
movl $0x1, -0x30(%rbp)
movl -0x30(%rbp), %eax
cmpl -0x28(%rbp), %eax
jge 0x12fd6
movl $0x0, -0x3c(%rbp)
movl -0x3c(%rbp), %eax
cmpl -0x30(%rbp), %eax
jge 0x12ede
xorps %xmm0, %xmm0
movsd %xmm0, -0x38(%rbp)
movl $0x0, -0x40(%rbp)
movl -0x40(%rbp), %eax
cmpl -0x28(%rbp), %eax
jge 0x12e01
movq -0x8(%rbp), %rdi
addq $0x70, %rdi
movl -0x40(%rbp), %eax
imull -0x24(%rbp), %eax
addl -0x3c(%rbp), %eax
movslq %eax, %rsi
callq 0x245a0
movsd (%rax), %xmm0
movsd %xmm0, -0x160(%rbp)
movq -0x10(%rbp), %rdi
addq $0x70, %rdi
movl -0x30(%rbp), %eax
imull -0x24(%rbp), %eax
addl -0x40(%rbp), %eax
movslq %eax, %rsi
callq 0x22b60
movsd -0x160(%rbp), %xmm0
movsd (%rax), %xmm2
movsd -0x38(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x38(%rbp)
movl -0x40(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x40(%rbp)
jmp 0x12d90
movq -0x10(%rbp), %rdi
addq $0x70, %rdi
movl -0x3c(%rbp), %eax
imull -0x24(%rbp), %eax
addl -0x3c(%rbp), %eax
movslq %eax, %rsi
callq 0x22b60
movsd (%rax), %xmm0
mulsd -0x38(%rbp), %xmm0
movsd %xmm0, -0x38(%rbp)
movl $0x0, -0x44(%rbp)
movl -0x44(%rbp), %eax
cmpl -0x28(%rbp), %eax
jge 0x12ece
movq -0x10(%rbp), %rdi
addq $0x70, %rdi
movl -0x3c(%rbp), %eax
imull -0x24(%rbp), %eax
addl -0x44(%rbp), %eax
movslq %eax, %rsi
callq 0x22b60
movsd (%rax), %xmm0
movsd %xmm0, -0x170(%rbp)
movsd -0x38(%rbp), %xmm0
movsd %xmm0, -0x168(%rbp)
movq -0x10(%rbp), %rdi
addq $0x70, %rdi
movl -0x30(%rbp), %eax
imull -0x24(%rbp), %eax
addl -0x44(%rbp), %eax
movslq %eax, %rsi
callq 0x22b60
movsd -0x170(%rbp), %xmm0
movsd -0x168(%rbp), %xmm2
movsd (%rax), %xmm1
movq %xmm0, %rcx
movabsq $-0x8000000000000000, %rdx # imm = 0x8000000000000000
xorq %rdx, %rcx
movq %rcx, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, (%rax)
movl -0x44(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x44(%rbp)
jmp 0x12e30
jmp 0x12ed0
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
jmp 0x12d75
xorps %xmm0, %xmm0
movsd %xmm0, -0x38(%rbp)
movl $0x0, -0x48(%rbp)
movl -0x48(%rbp), %eax
cmpl -0x28(%rbp), %eax
jge 0x12f5e
movq -0x8(%rbp), %rdi
addq $0x70, %rdi
movl -0x48(%rbp), %eax
imull -0x24(%rbp), %eax
addl -0x30(%rbp), %eax
movslq %eax, %rsi
callq 0x245a0
movsd (%rax), %xmm0
movsd %xmm0, -0x178(%rbp)
movq -0x10(%rbp), %rdi
addq $0x70, %rdi
movl -0x30(%rbp), %eax
imull -0x24(%rbp), %eax
addl -0x48(%rbp), %eax
movslq %eax, %rsi
callq 0x22b60
movsd -0x178(%rbp), %xmm0
movsd (%rax), %xmm2
movsd -0x38(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x38(%rbp)
movl -0x48(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x48(%rbp)
jmp 0x12eed
movsd 0x230ba(%rip), %xmm0    # 0x36020
divsd -0x38(%rbp), %xmm0
callq 0x2180
movsd %xmm0, -0x38(%rbp)
movl $0x0, -0x4c(%rbp)
movl -0x4c(%rbp), %eax
cmpl -0x28(%rbp), %eax
jge 0x12fc6
movsd -0x38(%rbp), %xmm0
movsd %xmm0, -0x180(%rbp)
movq -0x10(%rbp), %rdi
addq $0x70, %rdi
movl -0x30(%rbp), %eax
imull -0x24(%rbp), %eax
addl -0x4c(%rbp), %eax
movslq %eax, %rsi
callq 0x22b60
movsd -0x180(%rbp), %xmm0
mulsd (%rax), %xmm0
movsd %xmm0, (%rax)
movl -0x4c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x4c(%rbp)
jmp 0x12f7c
jmp 0x12fc8
movl -0x30(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x30(%rbp)
jmp 0x12d62
jmp 0x137d6
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x12ff2
jmp 0x13068
leaq -0x60(%rbp), %rdi
callq 0x245c0
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
leaq -0x60(%rbp), %rsi
callq 0x235b0
leaq -0x60(%rbp), %rdi
callq 0x235e0
movq -0x10(%rbp), %rax
movq %rax, -0x190(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
callq 0x23570
movq -0x190(%rbp), %rcx
movq %rcx, 0x68(%rax)
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
callq 0x24630
movq %rax, -0x188(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
callq 0x24630
movq -0x188(%rbp), %rdi
movq %rax, %rsi
callq 0x12b10
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x27380
testb $0x1, %al
jne 0x1307f
jmp 0x130db
movl $0x10, %edi
callq 0x20d0
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x198(%rbp)
leaq 0x2437f(%rip), %rsi     # 0x3741c
callq 0x20a0
jmp 0x130a4
movq -0x198(%rbp), %rdi
movq 0x2df3e(%rip), %rsi     # 0x40ff0
movq 0x2df07(%rip), %rdx     # 0x40fc0
callq 0x2320
movq -0x198(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
callq 0x2150
jmp 0x137df
leaq -0x70(%rbp), %rdi
callq 0x23030
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
addq $0x20, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x13102
jmp 0x131a7
leaq -0x80(%rbp), %rdi
callq 0x245c0
jmp 0x1310d
leaq -0x70(%rbp), %rdi
movq %rdi, -0x1b0(%rbp)
leaq -0x80(%rbp), %rsi
movq %rsi, -0x1b8(%rbp)
callq 0x235b0
movq -0x1b8(%rbp), %rdi
callq 0x235e0
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
callq 0x24630
movq %rax, -0x1a8(%rbp)
movq -0x8(%rbp), %rdi
addq $0x48, %rdi
callq 0x24630
movq -0x1b0(%rbp), %rdi
movq %rax, -0x1a0(%rbp)
callq 0x24630
movq -0x1a8(%rbp), %rdi
movq -0x1a0(%rbp), %rdx
movq %rax, %r8
movq %rsp, %rax
movq $0x0, (%rax)
xorl %ecx, %ecx
movl %ecx, %r9d
movl $0x1, %esi
callq 0x9580
jmp 0x13194
jmp 0x131a7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x137cb
leaq -0x90(%rbp), %rdi
callq 0x23030
leaq -0x70(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x131c9
jmp 0x13270
leaq -0xa0(%rbp), %rdi
callq 0x245c0
jmp 0x131d7
leaq -0x90(%rbp), %rdi
movq %rdi, -0x1d0(%rbp)
leaq -0xa0(%rbp), %rsi
movq %rsi, -0x1d8(%rbp)
callq 0x235b0
movq -0x1d8(%rbp), %rdi
callq 0x235e0
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
callq 0x24630
movq %rax, -0x1c8(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x24630
movq -0x1d0(%rbp), %rdi
movq %rax, -0x1c0(%rbp)
callq 0x24630
movq -0x1c8(%rbp), %rdi
movq -0x1c0(%rbp), %rdx
movq %rax, %r8
movq %rsp, %rax
movq $0x0, (%rax)
xorl %ecx, %ecx
movl %ecx, %r9d
movl %ecx, %esi
callq 0x9580
jmp 0x1325d
jmp 0x13270
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x137bf
leaq -0xb0(%rbp), %rdi
callq 0x23030
leaq -0x90(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x13295
jmp 0x1331b
leaq -0xc0(%rbp), %rdi
callq 0x245c0
jmp 0x132a3
leaq -0xb0(%rbp), %rdi
movq %rdi, -0x1e8(%rbp)
leaq -0xc0(%rbp), %rsi
movq %rsi, -0x1f0(%rbp)
callq 0x235b0
movq -0x1f0(%rbp), %rdi
callq 0x235e0
movq -0x1e8(%rbp), %rdi
callq 0x23570
movq %rax, -0x1e0(%rbp)
leaq -0x90(%rbp), %rdi
callq 0x24630
movq -0x1e0(%rbp), %rdi
movq %rax, %rsi
movsd 0x22e2f(%rip), %xmm0    # 0x36130
callq 0x12870
jmp 0x13308
jmp 0x1331b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x137b3
leaq -0xd0(%rbp), %rdi
callq 0x23030
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
addq $0x10, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x13345
jmp 0x13408
leaq -0xb0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x1335e
jmp 0x13408
leaq -0xe0(%rbp), %rdi
callq 0x245c0
jmp 0x1336c
leaq -0xd0(%rbp), %rdi
movq %rdi, -0x208(%rbp)
leaq -0xe0(%rbp), %rsi
movq %rsi, -0x210(%rbp)
callq 0x235b0
movq -0x210(%rbp), %rdi
callq 0x235e0
movq -0x8(%rbp), %rdi
addq $0x38, %rdi
callq 0x24630
movq %rax, -0x200(%rbp)
leaq -0xb0(%rbp), %rdi
callq 0x24630
movq -0x208(%rbp), %rdi
movq %rax, -0x1f8(%rbp)
callq 0x24630
movq -0x200(%rbp), %rdi
movq -0x1f8(%rbp), %rdx
movq %rax, %r8
movq %rsp, %rax
movq $0x0, (%rax)
xorl %ecx, %ecx
movl %ecx, %r9d
movl %ecx, %esi
callq 0x9580
jmp 0x133f5
jmp 0x13408
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x137a7
leaq -0xf0(%rbp), %rdi
callq 0x23030
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x13432
jmp 0x13502
leaq -0xd0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x1344b
jmp 0x134e8
leaq -0x100(%rbp), %rdi
callq 0x245c0
jmp 0x13459
leaq -0xf0(%rbp), %rdi
movq %rdi, -0x228(%rbp)
leaq -0x100(%rbp), %rsi
movq %rsi, -0x230(%rbp)
callq 0x235b0
movq -0x230(%rbp), %rdi
callq 0x235e0
leaq -0xd0(%rbp), %rdi
callq 0x24630
movq %rax, -0x220(%rbp)
movq -0x8(%rbp), %rdi
addq $0x58, %rdi
callq 0x24630
movq -0x228(%rbp), %rdi
movq %rax, -0x218(%rbp)
callq 0x24630
movq -0x220(%rbp), %rdi
movq -0x218(%rbp), %rsi
movq %rax, %rdx
xorl %eax, %eax
movl %eax, %ecx
callq 0x8f30
jmp 0x134d5
jmp 0x13500
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x1379b
movq -0x8(%rbp), %rsi
addq $0x28, %rsi
addq $0x30, %rsi
leaq -0xf0(%rbp), %rdi
callq 0x273b0
jmp 0x13515
leaq -0xf0(%rbp), %rdi
leaq -0xd0(%rbp), %rsi
callq 0x273b0
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x27380
testb $0x1, %al
jne 0x13533
jmp 0x135d5
leaq -0xf0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x1354c
jmp 0x135d3
leaq -0x110(%rbp), %rdi
callq 0x245c0
jmp 0x1355a
movq -0x10(%rbp), %rdi
addq $0x58, %rdi
leaq -0x110(%rbp), %rsi
movq %rsi, -0x248(%rbp)
callq 0x235b0
movq -0x248(%rbp), %rdi
callq 0x235e0
movq -0x10(%rbp), %rdi
movq %rdi, -0x240(%rbp)
addq $0x58, %rdi
callq 0x23570
movq -0x240(%rbp), %rcx
movq %rcx, 0x68(%rax)
leaq -0xf0(%rbp), %rdi
callq 0x24630
movq %rax, -0x238(%rbp)
movq -0x10(%rbp), %rdi
addq $0x58, %rdi
callq 0x24630
movq -0x238(%rbp), %rdi
movq %rax, %rsi
callq 0x12b10
jmp 0x135d1
jmp 0x135d3
jmp 0x13636
movl $0x10, %edi
callq 0x20d0
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x250(%rbp)
leaq 0x23e81(%rip), %rsi     # 0x37474
callq 0x20a0
jmp 0x135fa
movq -0x250(%rbp), %rdi
movq 0x2d9e8(%rip), %rsi     # 0x40ff0
movq 0x2d9b1(%rip), %rdx     # 0x40fc0
callq 0x2320
jmp 0x137e8
movq -0x250(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
callq 0x2150
jmp 0x1379b
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x20, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x27380
testb $0x1, %al
jne 0x13654
jmp 0x13703
leaq -0xb0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x1366d
jmp 0x13701
leaq -0x120(%rbp), %rdi
callq 0x245c0
jmp 0x1367b
movq -0x10(%rbp), %rdi
addq $0x48, %rdi
leaq -0x120(%rbp), %rsi
movq %rsi, -0x268(%rbp)
callq 0x235b0
movq -0x268(%rbp), %rdi
callq 0x235e0
leaq -0xb0(%rbp), %rdi
callq 0x24630
movq %rax, -0x260(%rbp)
movq -0x10(%rbp), %rdi
addq $0x58, %rdi
callq 0x24630
movq %rax, -0x258(%rbp)
movq -0x10(%rbp), %rdi
addq $0x48, %rdi
callq 0x24630
movq -0x260(%rbp), %rdi
movq -0x258(%rbp), %rdx
movq %rax, %r8
movq %rsp, %rax
movq $0x0, (%rax)
xorl %ecx, %ecx
movl %ecx, %r9d
movl %ecx, %esi
callq 0x9580
jmp 0x136ff
jmp 0x13701
jmp 0x13724
leaq 0x23dc7(%rip), %rsi     # 0x374d1
leaq -0x130(%rbp), %rdi
callq 0x20a0
jmp 0x13718
leaq -0x130(%rbp), %rdi
callq 0x23b8
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x10, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x27380
testb $0x1, %al
jne 0x1373f
jmp 0x13741
jmp 0x13760
leaq 0x23de6(%rip), %rdi     # 0x3752e
leaq 0x22fd0(%rip), %rsi     # 0x3671f
movl $0xca5, %edx            # imm = 0xCA5
leaq 0x23de9(%rip), %rcx     # 0x37544
callq 0x2120
leaq -0xf0(%rbp), %rdi
callq 0x235e0
leaq -0xd0(%rbp), %rdi
callq 0x235e0
leaq -0xb0(%rbp), %rdi
callq 0x235e0
leaq -0x90(%rbp), %rdi
callq 0x235e0
leaq -0x70(%rbp), %rdi
callq 0x235e0
jmp 0x137d6
leaq -0xf0(%rbp), %rdi
callq 0x235e0
leaq -0xd0(%rbp), %rdi
callq 0x235e0
leaq -0xb0(%rbp), %rdi
callq 0x235e0
leaq -0x90(%rbp), %rdi
callq 0x235e0
leaq -0x70(%rbp), %rdi
callq 0x235e0
jmp 0x137df
addq $0x270, %rsp            # imm = 0x270
popq %rbp
retq
movq -0x18(%rbp), %rdi
callq 0x2340
nopl (%rax,%rax)