// File: /workspace/github_cpp_makefile_star2_O3/CMU-SAFARI[P]Register-Interval/main.cpp
// Function: create_control_flow_graph(char*)
vector<basicBlock*> create_control_flow_graph(char* file_name){
    /* The control flow analysis of nvdisasm tool generates a CFG that its nodes are abstract basic blocks. So
     we first extract the abstract basic blocks from graphviz dot code (the output of nvdisasm tool) and then  we will create basic blocks and CFG.*/
    
    vector<basicBlock*> abstract_basic_blocks;
    
    //**********************getting input file and finding abstract basic blocks*******************************
        fstream file (file_name, fstream::in);
        
	char ch;
	string cfgString;
	string str = "";
	bool start = false;
	bool ready = false;
	bool OK = false;
	while (file >> noskipws >> ch)
	{
		cfgString = cfgString + ch;
	}

	for (int i = 0; i < cfgString.size(); i++){
		if (start){
			str = str + cfgString[i];
		}

		if (cfgString[i] == '"'){
			if (!start){
				start = true;
			}
			else{
				ready = true;
				start = false;
			}
		}

		if (ready){
			if (cfgString[i + 1] == '\n' || cfgString[i + 1] == 13){
				OK = true;
				ready = false;
			}
			else{
				ready = false;
				str = "";
			}
		}

		if (OK){
			str.erase(str.size() - 1, 1);
			auto temp = new basicBlock(str);
			abstract_basic_blocks.push_back(temp);
			OK = false;
			str = "";
		}
	}
	//******************************************************************************************

	//***************************setting code of abstract basic blocks*************************************
	int found1 = 0;
	int found2 = 0;
	string code;
	for (int i = 0; i < abstract_basic_blocks.size(); i++){
		code = "";
		found1 = cfgString.find("<entry>", found1 + 1, 7);
		found2 = cfgString.find("}\"]", found2 + 1, 3);
		for (int j = found1; j < found2 - 2; j++){
			code = code + cfgString[j];
		}
		abstract_basic_blocks[i]->set_code(code);
	}
	//******************************************************************************************

	//********************************Setting successors of abstract basic blocks******************************
	size_t found = 0;
	string tmp;
	int count = 0;
	for (int i = 0; i < abstract_basic_blocks.size(); i++){
		str = "\"";
		str = str + abstract_basic_blocks[i]->get_name();
		str = str + "\"";
		str = str + ":exit";
		found = 0;
		found = cfgString.find(str, found + 1);
		while (found != string::npos){
			count = 0;
			tmp = "";
			for (int j = found + 1; count < 3; j++){
				if (count == 2){
					tmp = tmp + cfgString[j];
				}

				if (cfgString[j] == '"')
					count++;
			}
			tmp.erase(tmp.end() - 1);
			for (int j = 0; j < abstract_basic_blocks.size(); j++){
				if (abstract_basic_blocks[j]->get_name() == tmp){
					abstract_basic_blocks[i]->add_successor(abstract_basic_blocks[j]);
					break;
				}
			}

			found = cfgString.find(str, found + 1);
		}
	}
	
	count = 0;
	for (int i = 0; i < abstract_basic_blocks.size(); i++){
		str = "\"";
		str = str + abstract_basic_blocks[i]->get_name();
		str = str + "\"";
		str = str + ":entry:s";
		found = 0;
		found = cfgString.find(str, found + 1);
		while (found != string::npos){
			count = 0;
			tmp = "";
			for (int j = found + 1; count < 3; j++){
				if (count == 2){
					tmp = tmp + cfgString[j];
				}

				if (cfgString[j] == '"')
					count++;
			}
			tmp.erase(tmp.end() - 1);
			for (int j = 0; j < abstract_basic_blocks.size(); j++){
				if (abstract_basic_blocks[j]->get_name() == tmp){
					abstract_basic_blocks[i]->add_successor(abstract_basic_blocks[j]);
					break;
				}
			}

			found = cfgString.find(str, found + 1);
		}
	}
	//************************************************************************************************

	//********************************Setting predecessors of abstract basic blocks**********************************
	vector<basicBlock*> x;
	for (int i = 0; i < abstract_basic_blocks.size(); i++){
		for (int j = 0; j < abstract_basic_blocks.size(); j++){
			x = abstract_basic_blocks[j]->get_successors();
			for (int k = 0; k < x.size(); k++){
				if (x[k]->get_name() == abstract_basic_blocks[i]->get_name()){
					abstract_basic_blocks[i]->add_predecessor(abstract_basic_blocks[j]);
				}
			}
		}
	}
	//************************************************************************************************
	
	//**************************Splitting abstract basic blocks to regular basic blocks***********************************
	auto basic_blocks = split_abstract_basic_blocks(abstract_basic_blocks);
	
	//***********************Extracting Registers of each basicBlock***************************************
	found = 0;
	for (int i = 0; i < basic_blocks.size(); i++){
		found = 0;
		code = basic_blocks[i]->get_code();
		found = code.find("R", found + 1, 1);
		while (found != string::npos){
			str = "R";
			if (code[found + 1] > 47 && code[found + 1] < 58){
				for (int j = found + 1; code[j] >47 && code[j] < 58; j++){
					str = str + code[j];
				}
				basic_blocks[i]->add_register(str);
			}

			found = code.find("R", found + 1, 1);
		}
	}
	//************************************************************************************************
        
        return basic_blocks;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x398, %rsp            # imm = 0x398
movq %rdi, -0xe8(%rbp)
xorl %ebx, %ebx
movq %rbx, -0x90(%rbp)
xorps %xmm0, %xmm0
movaps %xmm0, -0xa0(%rbp)
leaq -0x3b8(%rbp), %rdi
movl $0x8, %edx
callq 0x2290
leaq -0xf8(%rbp), %rax
movq %rax, -0x10(%rax)
movq %rbx, -0x8(%rax)
movb $0x0, (%rax)
leaq -0x70(%rbp), %rax
movq %rax, -0x10(%rax)
leaq 0x552b(%rip), %rdx      # 0xb0b6
leaq -0x80(%rbp), %rdi
movq %rdx, %rsi
callq 0xaa48
leaq -0x3b8(%rbp), %rbx
leaq -0x39(%rbp), %r14
leaq -0xc0(%rbp), %r15
leaq -0x108(%rbp), %r12
movq -0x3b8(%rbp), %rax
movq -0x18(%rax), %rax
andl $0xffffefff, -0x3a0(%rbp,%rax) # imm = 0xFFFFEFFF
movq %rbx, %rdi
movq %r14, %rsi
callq 0x2280
movq (%rax), %rcx
movq -0x18(%rcx), %rcx
testb $0x5, 0x20(%rax,%rcx)
jne 0x5c50
movb -0x39(%rbp), %r13b
leaq -0xb0(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0x108(%rbp), %rsi
movq -0x100(%rbp), %rdx
addq %rsi, %rdx
movq %r15, %rdi
callq 0x975c
movq -0xb8(%rbp), %rsi
movsbl %r13b, %r8d
movl $0x1, %ecx
movq %r15, %rdi
xorl %edx, %edx
callq 0x2390
movq %r12, %rdi
movq %r15, %rsi
callq 0x2270
movq -0xc0(%rbp), %rdi
leaq -0xb0(%rbp), %rax
cmpq %rax, %rdi
je 0x5bb0
callq 0x21c0
jmp 0x5bb0
cmpq $0x0, -0x100(%rbp)
je 0x5e02
xorl %r13d, %r13d
xorl %r15d, %r15d
movq -0x108(%rbp), %rax
testb $0x1, %r15b
je 0x5d9d
movb (%rax,%r13), %r14b
leaq -0xb0(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rdx
addq %rsi, %rdx
leaq -0xc0(%rbp), %rbx
movq %rbx, %rdi
callq 0x975c
movq -0xb8(%rbp), %rsi
movsbl %r14b, %r8d
movl $0x1, %ecx
movq %rbx, %rdi
xorl %edx, %edx
callq 0x2390
leaq -0x80(%rbp), %rdi
movq %rbx, %rsi
callq 0x2270
movq -0xc0(%rbp), %rdi
leaq -0xb0(%rbp), %rax
cmpq %rax, %rdi
je 0x5cdf
callq 0x21c0
movq -0x108(%rbp), %rax
cmpb $0x22, (%rax,%r13)
sete %r14b
testb %r15b, %r14b
je 0x5def
movzbl 0x1(%rax,%r13), %eax
cmpl $0xa, %eax
je 0x5d0c
cmpl $0xd, %eax
jne 0x5da8
movq -0x78(%rbp), %rsi
decq %rsi
movl $0x1, %edx
leaq -0x80(%rbp), %rdi
callq 0x2090
movl $0xf8, %edi
callq 0x21e0
movq %rax, %r12
leaq -0x160(%rbp), %rax
movq %rax, -0x170(%rbp)
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rdx
addq %rsi, %rdx
leaq -0x170(%rbp), %rbx
movq %rbx, %rdi
callq 0x975c
movq %r12, %rdi
movq %rbx, %rsi
callq 0x2c28
movq -0x170(%rbp), %rdi
leaq -0x160(%rbp), %rax
cmpq %rax, %rdi
je 0x5d79
callq 0x21c0
movq %r12, -0xc0(%rbp)
movq -0x98(%rbp), %rsi
cmpq -0x90(%rbp), %rsi
je 0x5dc3
movq %r12, (%rsi)
addq $0x8, -0x98(%rbp)
jmp 0x5dd6
cmpb $0x22, (%rax,%r13)
sete %r14b
jmp 0x5def
movq -0x78(%rbp), %rdx
leaq -0x80(%rbp), %rdi
xorl %esi, %esi
leaq 0x52fd(%rip), %rcx      # 0xb0b6
xorl %r8d, %r8d
callq 0x2300
jmp 0x5def
leaq -0xa0(%rbp), %rdi
leaq -0xc0(%rbp), %rdx
callq 0x9efe
movq -0x78(%rbp), %rdx
leaq -0x80(%rbp), %rdi
xorl %esi, %esi
leaq 0x52cf(%rip), %rcx      # 0xb0b6
xorl %r8d, %r8d
callq 0x2300
xorb %r14b, %r15b
incq %r13
cmpq %r13, -0x100(%rbp)
ja 0x5c64
leaq -0xb0(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq $0x0, -0xb8(%rbp)
movb $0x0, -0xb0(%rbp)
movq -0xa0(%rbp), %rax
movq -0x98(%rbp), %rcx
cmpq %rax, %rcx
je 0x5ff1
leaq -0xd0(%rbp), %r14
xorl %r13d, %r13d
leaq -0xe0(%rbp), %rbx
movq $0x0, -0x38(%rbp)
movq $0x0, -0x30(%rbp)
movq -0xb8(%rbp), %rdx
leaq -0xc0(%rbp), %rdi
xorl %esi, %esi
leaq 0x5245(%rip), %rcx      # 0xb0b6
xorl %r8d, %r8d
callq 0x2300
movq %r13, -0x130(%rbp)
movq -0x30(%rbp), %rdx
shlq $0x20, %rdx
movabsq $0x100000000, %r15      # imm = 0x100000000
addq %r15, %rdx
sarq $0x20, %rdx
movl $0x7, %ecx
leaq -0x108(%rbp), %r12
movq %r12, %rdi
leaq 0x5173(%rip), %rsi      # 0xb022
callq 0x2360
movq %rax, %r13
movq -0x38(%rbp), %rdx
shlq $0x20, %rdx
addq %r15, %rdx
sarq $0x20, %rdx
movl $0x3, %ecx
movq %r12, %rdi
leaq 0x5155(%rip), %rsi      # 0xb02a
callq 0x2360
movq %rax, -0x38(%rbp)
addl $-0x2, %eax
movq %r13, -0x30(%rbp)
cmpl %r13d, %eax
jle 0x5f70
movq -0x30(%rbp), %rcx
movslq %ecx, %r15
movq -0x38(%rbp), %rax
movl %eax, %r13d
subl %ecx, %r13d
addl $-0x2, %r13d
movq -0x108(%rbp), %rax
movb (%rax,%r15), %r12b
movq %r14, -0xe0(%rbp)
movq -0xc0(%rbp), %rsi
movq -0xb8(%rbp), %rdx
addq %rsi, %rdx
movq %rbx, %rdi
callq 0x975c
movq -0xd8(%rbp), %rsi
movsbl %r12b, %r8d
movl $0x1, %ecx
movq %rbx, %rdi
xorl %edx, %edx
callq 0x2390
leaq -0xc0(%rbp), %rdi
movq %rbx, %rsi
callq 0x2270
movq -0xe0(%rbp), %rdi
cmpq %r14, %rdi
je 0x5f68
callq 0x21c0
incq %r15
decl %r13d
jne 0x5f03
movq -0xa0(%rbp), %rax
movq -0x130(%rbp), %r13
movq (%rax,%r13,8), %r15
leaq -0x180(%rbp), %r12
movq %r12, -0x190(%rbp)
movq -0xc0(%rbp), %rsi
movq -0xb8(%rbp), %rdx
addq %rsi, %rdx
leaq -0x190(%rbp), %rdi
callq 0x975c
movq %r15, %rdi
leaq -0x190(%rbp), %rsi
callq 0x2e24
movq -0x190(%rbp), %rdi
cmpq %r12, %rdi
je 0x5fcd
callq 0x21c0
incq %r13
movq -0xa0(%rbp), %rax
movq -0x98(%rbp), %rcx
movq %rcx, %rdx
subq %rax, %rdx
sarq $0x3, %rdx
cmpq %r13, %rdx
ja 0x5e5a
leaq -0xd0(%rbp), %rdx
movq %rdx, -0x10(%rdx)
movq $0x0, -0x8(%rdx)
movb $0x0, (%rdx)
cmpq %rax, %rcx
je 0x687a
leaq -0x50(%rbp), %r14
movq $0x0, -0x30(%rbp)
leaq -0x128(%rbp), %rbx
leaq -0x60(%rbp), %r13
movq -0x78(%rbp), %rdx
movl $0x1, %r8d
leaq -0x80(%rbp), %rdi
xorl %esi, %esi
leaq 0x4ff0(%rip), %rcx      # 0xb02e
callq 0x2300
movq -0xa0(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rax
leaq -0x118(%rbp), %rcx
movq %rcx, -0x128(%rbp)
movq 0x8(%rax), %rsi
movq 0x10(%rax), %rdx
addq %rsi, %rdx
movq %rbx, %rdi
callq 0x975c
movq -0x80(%rbp), %rcx
movq -0x78(%rbp), %r8
movq %rbx, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x2220
movq %r14, -0x60(%rbp)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
je 0x60a7
movq %rdx, -0x60(%rbp)
movq (%rcx), %rdx
movq %rdx, -0x50(%rbp)
jmp 0x60ae
movups (%rcx), %xmm0
movups %xmm0, (%r14)
movq 0x8(%rax), %rdx
movq %rdx, -0x58(%rbp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
leaq -0x80(%rbp), %rdi
movq %r13, %rsi
callq 0x2270
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
je 0x60df
callq 0x21c0
movq -0x128(%rbp), %rdi
leaq -0x118(%rbp), %rax
cmpq %rax, %rdi
je 0x60f7
callq 0x21c0
movq %r14, -0x60(%rbp)
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rdx
addq %rsi, %rdx
movq %r13, %rdi
callq 0x975c
movq %r13, %rdi
leaq 0x4f16(%rip), %rsi      # 0xb02e
callq 0x23a0
leaq -0x80(%rbp), %rdi
movq %r13, %rsi
callq 0x2270
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
je 0x6137
callq 0x21c0
movq %r14, -0x60(%rbp)
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rdx
addq %rsi, %rdx
movq %r13, %rdi
callq 0x975c
movq %r13, %rdi
leaq 0x4ed8(%rip), %rsi      # 0xb030
callq 0x23a0
leaq -0x80(%rbp), %rdi
movq %r13, %rsi
callq 0x2270
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
je 0x6177
callq 0x21c0
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rcx
movl $0x1, %edx
leaq -0x108(%rbp), %rdi
callq 0x2360
cmpq $-0x1, %rax
je 0x633f
movq %rax, %r15
movq -0xd8(%rbp), %rdx
leaq -0xe0(%rbp), %rdi
xorl %esi, %esi
leaq 0x4f02(%rip), %rcx      # 0xb0b6
xorl %r8d, %r8d
callq 0x2300
incq %r15
movq %r15, -0x38(%rbp)
movslq %r15d, %r15
xorl %r12d, %r12d
movq -0x108(%rbp), %rax
cmpl $0x2, %r12d
jne 0x6232
movb (%rax,%r15), %bl
movq %r14, -0x60(%rbp)
movq -0xe0(%rbp), %rsi
movq -0xd8(%rbp), %rdx
addq %rsi, %rdx
movq %r13, %rdi
callq 0x975c
movq -0x58(%rbp), %rsi
movsbl %bl, %r8d
movl $0x1, %ecx
movq %r13, %rdi
xorl %edx, %edx
callq 0x2390
leaq -0xe0(%rbp), %rdi
movq %r13, %rsi
callq 0x2270
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
je 0x622b
callq 0x21c0
movq -0x108(%rbp), %rax
xorl %ecx, %ecx
cmpb $0x22, (%rax,%r15)
sete %cl
incq %r15
addl %ecx, %r12d
cmpl $0x3, %r12d
jb 0x61d0
movq -0xd8(%rbp), %rsi
decq %rsi
movl $0x1, %edx
leaq -0xe0(%rbp), %rdi
callq 0x2260
movq -0xa0(%rbp), %rax
cmpq %rax, -0x98(%rbp)
je 0x6313
xorl %r15d, %r15d
movq (%rax,%r15,8), %rax
movq %r14, -0x60(%rbp)
movq 0x8(%rax), %rsi
movq 0x10(%rax), %rdx
addq %rsi, %rdx
movq %r13, %rdi
callq 0x975c
movq -0x58(%rbp), %rdx
cmpq -0xd8(%rbp), %rdx
jne 0x62c1
movq -0x60(%rbp), %r12
testq %rdx, %rdx
je 0x62c9
movq -0xe0(%rbp), %rsi
movq %r12, %rdi
callq 0x21f0
testl %eax, %eax
sete %bl
jmp 0x62cb
movq -0x60(%rbp), %r12
xorl %ebx, %ebx
jmp 0x62cb
movb $0x1, %bl
cmpq %r14, %r12
je 0x62d8
movq %r12, %rdi
callq 0x21c0
testb %bl, %bl
jne 0x62fb
incq %r15
movq -0xa0(%rbp), %rax
movq -0x98(%rbp), %rcx
subq %rax, %rcx
sarq $0x3, %rcx
cmpq %r15, %rcx
ja 0x627a
jmp 0x6313
movq -0xa0(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movq (%rax,%r15,8), %rsi
callq 0x2f1c
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rcx
leaq -0x108(%rbp), %rdi
movq -0x38(%rbp), %rdx
callq 0x2360
movq %rax, %r15
cmpq $-0x1, %rax
leaq -0x128(%rbp), %rbx
jne 0x619d
movq -0x30(%rbp), %rdi
incq %rdi
movq -0xa0(%rbp), %rax
movq -0x98(%rbp), %rcx
movq %rcx, %rdx
subq %rax, %rdx
sarq $0x3, %rdx
movq %rdi, -0x30(%rbp)
cmpq %rdi, %rdx
ja 0x6027
cmpq %rax, %rcx
je 0x687a
movq $0x0, -0x30(%rbp)
leaq -0x128(%rbp), %rbx
leaq -0x60(%rbp), %r13
movq -0x78(%rbp), %rdx
movl $0x1, %r8d
leaq -0x80(%rbp), %rdi
xorl %esi, %esi
leaq 0x4c90(%rip), %rcx      # 0xb02e
callq 0x2300
movq -0xa0(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rax
leaq -0x118(%rbp), %rcx
movq %rcx, -0x128(%rbp)
movq 0x8(%rax), %rsi
movq 0x10(%rax), %rdx
addq %rsi, %rdx
movq %rbx, %rdi
callq 0x975c
movq -0x80(%rbp), %rcx
movq -0x78(%rbp), %r8
movq %rbx, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x2220
movq %r14, -0x60(%rbp)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
je 0x6407
movq %rdx, -0x60(%rbp)
movq (%rcx), %rdx
movq %rdx, -0x50(%rbp)
jmp 0x640e
movups (%rcx), %xmm0
movups %xmm0, (%r14)
movq 0x8(%rax), %rdx
movq %rdx, -0x58(%rbp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
leaq -0x80(%rbp), %rdi
movq %r13, %rsi
callq 0x2270
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
je 0x643f
callq 0x21c0
movq -0x128(%rbp), %rdi
leaq -0x118(%rbp), %rax
cmpq %rax, %rdi
je 0x6457
callq 0x21c0
movq %r14, -0x60(%rbp)
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rdx
addq %rsi, %rdx
movq %r13, %rdi
callq 0x975c
movq %r13, %rdi
leaq 0x4bb6(%rip), %rsi      # 0xb02e
callq 0x23a0
leaq -0x80(%rbp), %rdi
movq %r13, %rsi
callq 0x2270
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
je 0x6497
callq 0x21c0
movq %r14, -0x60(%rbp)
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rdx
addq %rsi, %rdx
movq %r13, %rdi
callq 0x975c
movq %r13, %rdi
leaq 0x4b7e(%rip), %rsi      # 0xb036
callq 0x23a0
leaq -0x80(%rbp), %rdi
movq %r13, %rsi
callq 0x2270
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
je 0x64d7
callq 0x21c0
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rcx
movl $0x1, %edx
leaq -0x108(%rbp), %rdi
callq 0x2360
cmpq $-0x1, %rax
je 0x669f
movq %rax, %r15
movq -0xd8(%rbp), %rdx
leaq -0xe0(%rbp), %rdi
xorl %esi, %esi
leaq 0x4ba2(%rip), %rcx      # 0xb0b6
xorl %r8d, %r8d
callq 0x2300
incq %r15
movq %r15, -0x38(%rbp)
movslq %r15d, %r15
xorl %r12d, %r12d
movq -0x108(%rbp), %rax
cmpl $0x2, %r12d
jne 0x6592
movb (%rax,%r15), %bl
movq %r14, -0x60(%rbp)
movq -0xe0(%rbp), %rsi
movq -0xd8(%rbp), %rdx
addq %rsi, %rdx
movq %r13, %rdi
callq 0x975c
movq -0x58(%rbp), %rsi
movsbl %bl, %r8d
movl $0x1, %ecx
movq %r13, %rdi
xorl %edx, %edx
callq 0x2390
leaq -0xe0(%rbp), %rdi
movq %r13, %rsi
callq 0x2270
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
je 0x658b
callq 0x21c0
movq -0x108(%rbp), %rax
xorl %ecx, %ecx
cmpb $0x22, (%rax,%r15)
sete %cl
incq %r15
addl %ecx, %r12d
cmpl $0x3, %r12d
jb 0x6530
movq -0xd8(%rbp), %rsi
decq %rsi
movl $0x1, %edx
leaq -0xe0(%rbp), %rdi
callq 0x2260
movq -0xa0(%rbp), %rax
cmpq %rax, -0x98(%rbp)
je 0x6673
xorl %r15d, %r15d
movq (%rax,%r15,8), %rax
movq %r14, -0x60(%rbp)
movq 0x8(%rax), %rsi
movq 0x10(%rax), %rdx
addq %rsi, %rdx
movq %r13, %rdi
callq 0x975c
movq -0x58(%rbp), %rdx
cmpq -0xd8(%rbp), %rdx
jne 0x6621
movq -0x60(%rbp), %r12
testq %rdx, %rdx
je 0x6629
movq -0xe0(%rbp), %rsi
movq %r12, %rdi
callq 0x21f0
testl %eax, %eax
sete %bl
jmp 0x662b
movq -0x60(%rbp), %r12
xorl %ebx, %ebx
jmp 0x662b
movb $0x1, %bl
cmpq %r14, %r12
je 0x6638
movq %r12, %rdi
callq 0x21c0
testb %bl, %bl
jne 0x665b
incq %r15
movq -0xa0(%rbp), %rax
movq -0x98(%rbp), %rcx
subq %rax, %rcx
sarq $0x3, %rcx
cmpq %r15, %rcx
ja 0x65da
jmp 0x6673
movq -0xa0(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movq (%rax,%r15,8), %rsi
callq 0x2f1c
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rcx
leaq -0x108(%rbp), %rdi
movq -0x38(%rbp), %rdx
callq 0x2360
movq %rax, %r15
cmpq $-0x1, %rax
leaq -0x128(%rbp), %rbx
jne 0x64fd
movq -0x30(%rbp), %rdi
incq %rdi
movq -0xa0(%rbp), %rax
movq -0x98(%rbp), %rcx
movq %rcx, %rdx
subq %rax, %rdx
sarq $0x3, %rdx
movq %rdi, -0x30(%rbp)
cmpq %rdi, %rdx
ja 0x6387
cmpq %rax, %rcx
je 0x687a
movq $0x0, -0x38(%rbp)
xorl %r13d, %r13d
cmpq %rax, %rcx
je 0x687d
xorl %ebx, %ebx
movq %r13, %r12
movq (%rax,%rbx,8), %rsi
addq $0x78, %rsi
leaq -0x60(%rbp), %rdi
callq 0x8ecc
movq %rbx, -0x130(%rbp)
movq -0x60(%rbp), %r13
movq -0x58(%rbp), %rbx
xorps %xmm0, %xmm0
movaps %xmm0, -0x60(%rbp)
movq $0x0, -0x50(%rbp)
testq %r12, %r12
je 0x6737
movq %r12, %rdi
callq 0x21c0
movq -0x60(%rbp), %rdi
testq %rdi, %rdi
je 0x6737
callq 0x21c0
subq %r13, %rbx
je 0x6836
sarq $0x3, %rbx
cmpq $0x1, %rbx
adcq $0x0, %rbx
xorl %r15d, %r15d
movq %r13, -0x30(%rbp)
movq (%r13,%r15,8), %rax
movq %r14, -0x60(%rbp)
movq 0x8(%rax), %rsi
movq 0x10(%rax), %rdx
addq %rsi, %rdx
leaq -0x60(%rbp), %rdi
callq 0x975c
movq -0xa0(%rbp), %rax
movq -0x38(%rbp), %rcx
movq (%rax,%rcx,8), %rax
leaq -0x118(%rbp), %rcx
movq %rcx, -0x128(%rbp)
movq 0x8(%rax), %rsi
movq 0x10(%rax), %rdx
addq %rsi, %rdx
leaq -0x128(%rbp), %rdi
callq 0x975c
movq -0x58(%rbp), %rdx
cmpq -0x120(%rbp), %rdx
jne 0x67d1
movq -0x128(%rbp), %r12
testq %rdx, %rdx
je 0x67dd
movq -0x60(%rbp), %rdi
movq %r12, %rsi
callq 0x21f0
testl %eax, %eax
sete %r13b
jmp 0x67e0
movq -0x128(%rbp), %r12
xorl %r13d, %r13d
jmp 0x67e0
movb $0x1, %r13b
leaq -0x118(%rbp), %rax
cmpq %rax, %r12
je 0x67f4
movq %r12, %rdi
callq 0x21c0
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
je 0x6802
callq 0x21c0
testb %r13b, %r13b
je 0x6826
movq -0xa0(%rbp), %rax
movq -0x38(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movq -0x130(%rbp), %rcx
movq (%rax,%rcx,8), %rsi
callq 0x2eae
incq %r15
cmpq %r15, %rbx
movq -0x30(%rbp), %r13
jne 0x6753
movq -0x130(%rbp), %rbx
incq %rbx
movq -0xa0(%rbp), %rax
movq -0x98(%rbp), %rcx
movq %rcx, %rdx
subq %rax, %rdx
sarq $0x3, %rdx
movq %r13, %r12
cmpq %rbx, %rdx
ja 0x66ed
movq -0x38(%rbp), %rdi
incq %rdi
movq %rdi, -0x38(%rbp)
cmpq %rdi, %rdx
ja 0x66df
jmp 0x687d
xorl %r13d, %r13d
leaq -0x1a8(%rbp), %rdi
leaq -0xa0(%rbp), %rsi
callq 0x8ecc
leaq -0x1a8(%rbp), %rsi
movq -0xe8(%rbp), %rdi
movq %r13, -0x30(%rbp)
callq 0x7a35
movq -0x1a8(%rbp), %rdi
testq %rdi, %rdi
je 0x68b8
callq 0x21c0
movq -0xe8(%rbp), %rcx
movq (%rcx), %rax
cmpq %rax, 0x8(%rcx)
je 0x6a9f
leaq -0x50(%rbp), %r14
xorl %r15d, %r15d
leaq -0x60(%rbp), %rbx
leaq 0x4742(%rip), %r12      # 0xb020
movq (%rax,%r15,8), %rax
movq %r14, -0x60(%rbp)
movq 0x28(%rax), %rsi
movq 0x30(%rax), %rdx
addq %rsi, %rdx
movq %rbx, %rdi
callq 0x975c
movq %r15, -0x38(%rbp)
leaq -0xc0(%rbp), %rdi
movq %rbx, %rsi
callq 0x2270
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
je 0x691a
callq 0x21c0
movl $0x1, %edx
movl $0x1, %ecx
leaq -0xc0(%rbp), %rdi
movq %r12, %rsi
callq 0x2360
cmpq $-0x1, %rax
je 0x6a7a
movq %rax, %r15
movq -0x78(%rbp), %rdx
movl $0x1, %r8d
leaq -0x80(%rbp), %rdi
xorl %esi, %esi
movq %r12, %rcx
callq 0x2300
movq -0xc0(%rbp), %rax
movb 0x1(%rax,%r15), %cl
incq %r15
addb $-0x30, %cl
cmpb $0x9, %cl
ja 0x6a4f
movslq %r15d, %rcx
movb (%rax,%rcx), %r13b
leal -0x30(%r13), %eax
cmpb $0x9, %al
ja 0x69e6
movslq %r15d, %r12
incq %r12
movq %r14, -0x60(%rbp)
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rdx
addq %rsi, %rdx
movq %rbx, %rdi
callq 0x975c
movq -0x58(%rbp), %rsi
movsbl %r13b, %r8d
movl $0x1, %ecx
movq %rbx, %rdi
xorl %edx, %edx
callq 0x2390
leaq -0x80(%rbp), %rdi
movq %rbx, %rsi
callq 0x2270
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
je 0x69d0
callq 0x21c0
movq -0xc0(%rbp), %rax
movb (%rax,%r12), %r13b
leal -0x30(%r13), %eax
incq %r12
cmpb $0xa, %al
jb 0x6988
movq -0xe8(%rbp), %rax
movq (%rax), %rax
movq -0x38(%rbp), %rcx
movq (%rax,%rcx,8), %r12
leaq -0x140(%rbp), %rax
movq %rax, -0x150(%rbp)
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rdx
addq %rsi, %rdx
leaq -0x150(%rbp), %rdi
movq -0x30(%rbp), %r13
callq 0x975c
addq $0xc0, %r12
movq %r12, %rdi
leaq -0x150(%rbp), %rsi
callq 0x9d96
movq -0x150(%rbp), %rdi
leaq -0x140(%rbp), %rax
cmpq %rax, %rdi
je 0x6a4f
callq 0x21c0
movl $0x1, %ecx
leaq -0xc0(%rbp), %rdi
leaq 0x45be(%rip), %r12      # 0xb020
movq %r12, %rsi
movq %r15, %rdx
callq 0x2360
movq %rax, %r15
cmpq $-0x1, %rax
jne 0x6940
movq -0x38(%rbp), %r15
incq %r15
movq -0xe8(%rbp), %rcx
movq (%rcx), %rax
movq 0x8(%rcx), %rcx
subq %rax, %rcx
sarq $0x3, %rcx
cmpq %r15, %rcx
ja 0x68de
testq %r13, %r13
je 0x6aac
movq %r13, %rdi
callq 0x21c0
movq -0xe0(%rbp), %rdi
leaq -0xd0(%rbp), %rax
cmpq %rax, %rdi
je 0x6ac4
callq 0x21c0
movq -0xc0(%rbp), %rdi
leaq -0xb0(%rbp), %rax
cmpq %rax, %rdi
je 0x6adc
callq 0x21c0
movq -0x80(%rbp), %rdi
leaq -0x70(%rbp), %rax
cmpq %rax, %rdi
je 0x6aee
callq 0x21c0
movq -0x108(%rbp), %rdi
leaq -0xf8(%rbp), %rax
cmpq %rax, %rdi
je 0x6b06
callq 0x21c0
leaq -0x3b8(%rbp), %rdi
callq 0x2080
movq -0xa0(%rbp), %rdi
testq %rdi, %rdi
je 0x6b23
callq 0x21c0
movq -0xe8(%rbp), %rax
addq $0x398, %rsp            # imm = 0x398
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %r15
movq -0x1a8(%rbp), %rdi
testq %rdi, %rdi
je 0x6b50
callq 0x21c0
movq -0x30(%rbp), %r12
jmp 0x6ce2
movq %rax, %r15
jmp 0x6cdf
movq %rax, %r15
jmp 0x6d4d
movq %rax, %r15
movq -0x170(%rbp), %rdi
leaq -0x160(%rbp), %rax
cmpq %rax, %rdi
je 0x6b89
callq 0x21c0
jmp 0x6b89
movq %rax, %r15
movq %r12, %rdi
jmp 0x6d36
jmp 0x6c23
jmp 0x6c23
jmp 0x6c23
jmp 0x6c79
jmp 0x6cfa
jmp 0x6cf5
jmp 0x6cf5
jmp 0x6bd9
jmp 0x6cf5
jmp 0x6cfa
jmp 0x6cf5
jmp 0x6c85
jmp 0x6cfa
jmp 0x6cf5
jmp 0x6cf5
movq %rax, %r15
movq -0x128(%rbp), %rdi
leaq -0x118(%rbp), %rax
cmpq %rax, %rdi
jne 0x6d06
jmp 0x6d0b
jmp 0x6cf5
jmp 0x6cfa
jmp 0x6cf5
movq %rax, %r15
movq -0x190(%rbp), %rdi
cmpq %r12, %rdi
jne 0x6d1e
jmp 0x6d23
jmp 0x6c79
jmp 0x6c23
movq %rax, %r15
jmp 0x6d3b
jmp 0x6c79
jmp 0x6cf5
movq %rax, %r15
jmp 0x6ce2
jmp 0x6cf5
movq %rax, %r15
movq -0x150(%rbp), %rdi
leaq -0x140(%rbp), %rax
cmpq %rax, %rdi
jne 0x6cc6
jmp 0x6ccb
jmp 0x6cf5
jmp 0x6cf5
movq %rax, %r15
movq -0xe0(%rbp), %rdi
cmpq %r14, %rdi
jne 0x6d1e
jmp 0x6d23
movq %rax, %r15
jmp 0x6d23
jmp 0x6cf5
jmp 0x6cf5
movq %rax, %r15
jmp 0x6ccb
movq %rax, %r15
movq -0x30(%rbp), %r13
jmp 0x6cea
movq %rax, %r15
jmp 0x6cea
movq %rax, %r15
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
je 0x6cea
callq 0x21c0
jmp 0x6cea
jmp 0x6cf5
movq %rax, %r15
movq -0x30(%rbp), %r13
jmp 0x6ccb
movq %rax, %r15
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
movq -0x30(%rbp), %r13
je 0x6ccb
callq 0x21c0
movq -0xe8(%rbp), %rax
movq (%rax), %rdi
testq %rdi, %rdi
je 0x6cdf
callq 0x21c0
movq %r13, %r12
movq %r12, %r13
testq %r12, %r12
je 0x6d0b
movq %r13, %rdi
jmp 0x6d06
jmp 0x6cf5
jmp 0x6cfa
jmp 0x6cf5
movq %rax, %r15
jmp 0x6d0b
movq %rax, %r15
movq -0x60(%rbp), %rdi
cmpq %r14, %rdi
je 0x6d0b
callq 0x21c0
movq -0xe0(%rbp), %rdi
leaq -0xd0(%rbp), %rax
cmpq %rax, %rdi
je 0x6d23
callq 0x21c0
movq -0xc0(%rbp), %rdi
leaq -0xb0(%rbp), %rax
cmpq %rax, %rdi
je 0x6d3b
callq 0x21c0
movq -0x80(%rbp), %rdi
leaq -0x70(%rbp), %rax
cmpq %rax, %rdi
je 0x6d4d
callq 0x21c0
leaq -0xf8(%rbp), %rax
movq -0x108(%rbp), %rdi
cmpq %rax, %rdi
je 0x6d65
callq 0x21c0
leaq -0x3b8(%rbp), %rdi
callq 0x2080
movq -0xa0(%rbp), %rdi
testq %rdi, %rdi
je 0x6d82
callq 0x21c0
movq %r15, %rdi
callq 0x2370