// File: /workspace/github_cpp_makefile_star2_O2/CMU-SAFARI[P]MQSim/src/exec/Host_System.cpp
// Function: Host_System::Host_System(Host_Parameter_Set*, bool, SSD_Components::Host_Interface_Base*)
Host_System::Host_System(Host_Parameter_Set* parameters, bool preconditioning_required, SSD_Components::Host_Interface_Base* ssd_host_interface):
	MQSimEngine::Sim_Object("Host"), preconditioning_required(preconditioning_required)
{
	Simulator->AddObject(this);

	//Create the main components of the host system
	if (((SSD_Components::Host_Interface_NVMe*)ssd_host_interface)->GetType() == HostInterface_Types::SATA) {
		this->SATA_hba = new Host_Components::SATA_HBA(ID() + ".SATA_HBA", ((SSD_Components::Host_Interface_SATA*)ssd_host_interface)->Get_ncq_depth(), parameters->SATA_Processing_Delay, NULL, NULL);
	} else {
		this->SATA_hba = NULL;
	}
	this->Link = new Host_Components::PCIe_Link(this->ID() + ".PCIeLink", NULL, NULL, parameters->PCIe_Lane_Bandwidth, parameters->PCIe_Lane_Count);
	this->PCIe_root_complex = new Host_Components::PCIe_Root_Complex(this->Link, ssd_host_interface->GetType(), this->SATA_hba, NULL);
	this->Link->Set_root_complex(this->PCIe_root_complex);
	this->PCIe_switch = new Host_Components::PCIe_Switch(this->Link, ssd_host_interface);
	this->Link->Set_pcie_switch(this->PCIe_switch);
	Simulator->AddObject(this->Link);

	//Create IO flows
	LHA_type address_range_per_flow = ssd_host_interface->Get_max_logical_sector_address() / parameters->IO_Flow_Definitions.size();
	for (uint16_t flow_id = 0; flow_id < parameters->IO_Flow_Definitions.size(); flow_id++) {
		Host_Components::IO_Flow_Base* io_flow = NULL;
		//No flow should ask for I/O queue id 0, it is reserved for NVMe Admin command queue pair
		//Hence, we use flow_id + 1 (which is equal to 1, 2, ...) as the requested I/O queue id
		uint16_t nvme_sq_size = 0, nvme_cq_size = 0;
		switch (((SSD_Components::Host_Interface_NVMe*)ssd_host_interface)->GetType()) {
			case HostInterface_Types::NVME:
				nvme_sq_size = ((SSD_Components::Host_Interface_NVMe*)ssd_host_interface)->Get_submission_queue_depth();
				nvme_cq_size = ((SSD_Components::Host_Interface_NVMe*)ssd_host_interface)->Get_completion_queue_depth();
				break;
			default:
				break;
		}

		switch (parameters->IO_Flow_Definitions[flow_id]->Type) {
			case Flow_Type::SYNTHETIC: {
				IO_Flow_Parameter_Set_Synthetic* flow_param = (IO_Flow_Parameter_Set_Synthetic*)parameters->IO_Flow_Definitions[flow_id];
				if (flow_param->Working_Set_Percentage > 100 || flow_param->Working_Set_Percentage < 1) {
					flow_param->Working_Set_Percentage = 100;
				}
				io_flow = new Host_Components::IO_Flow_Synthetic(this->ID() + ".IO_Flow.Synth.No_" + std::to_string(flow_id), flow_id,
					Utils::Logical_Address_Partitioning_Unit::Start_lha_available_to_flow(flow_id),
					Utils::Logical_Address_Partitioning_Unit::End_lha_available_to_flow(flow_id),
					((double)flow_param->Working_Set_Percentage / 100.0), FLOW_ID_TO_Q_ID(flow_id), nvme_sq_size, nvme_cq_size,
					flow_param->Priority_Class, flow_param->Read_Percentage / double(100.0), flow_param->Address_Distribution, flow_param->Percentage_of_Hot_Region / double(100.0),
					flow_param->Request_Size_Distribution, flow_param->Average_Request_Size, flow_param->Variance_Request_Size,
					flow_param->Synthetic_Generator_Type, (flow_param->Bandwidth == 0? 0 :NanoSecondCoeff / ((flow_param->Bandwidth / SECTOR_SIZE_IN_BYTE) / flow_param->Average_Request_Size)),
					flow_param->Average_No_of_Reqs_in_Queue, flow_param->Generated_Aligned_Addresses, flow_param->Address_Alignment_Unit,
					flow_param->Seed, flow_param->Stop_Time, flow_param->Initial_Occupancy_Percentage / double(100.0), flow_param->Total_Requests_To_Generate, ssd_host_interface->GetType(), this->PCIe_root_complex, this->SATA_hba,
					parameters->Enable_ResponseTime_Logging, parameters->ResponseTime_Logging_Period_Length, parameters->Input_file_path + ".IO_Flow.No_" + std::to_string(flow_id) + ".log");
				this->IO_flows.push_back(io_flow);
				break;
			}
			case Flow_Type::TRACE: {
				IO_Flow_Parameter_Set_Trace_Based * flow_param = (IO_Flow_Parameter_Set_Trace_Based*)parameters->IO_Flow_Definitions[flow_id];
				io_flow = new Host_Components::IO_Flow_Trace_Based(this->ID() + ".IO_Flow.Trace." + flow_param->File_Path, flow_id,
					Utils::Logical_Address_Partitioning_Unit::Start_lha_available_to_flow(flow_id), Utils::Logical_Address_Partitioning_Unit::End_lha_available_to_flow(flow_id),
					FLOW_ID_TO_Q_ID(flow_id), nvme_sq_size, nvme_cq_size,
					flow_param->Priority_Class, flow_param->Initial_Occupancy_Percentage / double(100.0),
					flow_param->File_Path, flow_param->Time_Unit, flow_param->Relay_Count, flow_param->Percentage_To_Be_Executed,
					ssd_host_interface->GetType(), this->PCIe_root_complex, this->SATA_hba,
					parameters->Enable_ResponseTime_Logging, parameters->ResponseTime_Logging_Period_Length, parameters->Input_file_path + ".IO_Flow.No_" + std::to_string(flow_id) + ".log");

				this->IO_flows.push_back(io_flow);
				break;
			}
			default:
				throw "The specified IO flow type is not supported.\n";
		}
		Simulator->AddObject(io_flow);
	}
	this->PCIe_root_complex->Set_io_flows(&this->IO_flows);
	if (((SSD_Components::Host_Interface_NVMe*)ssd_host_interface)->GetType() == HostInterface_Types::SATA) {
		this->SATA_hba->Set_io_flows(&this->IO_flows);
		this->SATA_hba->Set_root_complex(this->PCIe_root_complex);
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x258, %rsp            # imm = 0x258
movq %rcx, %r12
movl %edx, %ebx
movq %rdi, %r15
leaq 0x34328(%rip), %rsi     # 0x44e38
leaq 0x40(%rsp), %rdi
leaq 0xc8(%rsp), %rdx
callq 0x7150
leaq 0x40(%rsp), %rsi
movq %r15, %rdi
callq 0x11bca
leaq 0x40(%rsp), %rdi
callq 0x7678
leaq 0x4fe28(%rip), %rax     # 0x60968
movq %rax, (%r15)
leaq 0x4fe56(%rip), %rax     # 0x609a0
movq %rax, 0x30(%r15)
leaq 0x58(%r15), %rax
movq %rax, 0x18(%rsp)
xorpd %xmm0, %xmm0
movupd %xmm0, 0x58(%r15)
andq $0x0, 0x68(%r15)
movb %bl, 0x78(%r15)
callq 0x1f784
movq %rax, %rdi
movq %r15, %rsi
callq 0x1f7f2
cmpl $0x0, 0x38(%r12)
movq %r15, 0x8(%rsp)
je 0x10b8e
andq $0x0, 0x50(%r15)
jmp 0x10c08
movl $0x1b0, %edi            # imm = 0x1B0
callq 0x7370
movq %rax, %r14
leaq 0x8(%r15), %rsi
leaq 0x40(%rsp), %rdi
callq 0x7480
leaq 0x3428d(%rip), %rdx     # 0x44e3d
leaq 0x1b8(%rsp), %rdi
leaq 0x40(%rsp), %rsi
callq 0x9b29
movq %r12, %rdi
callq 0x37014
leaq 0x51967(%rip), %rcx     # 0x62538
movq (%rcx), %rcx
movzwl %ax, %edx
leaq 0x1b8(%rsp), %rsi
movq %r14, %rdi
xorl %r8d, %r8d
xorl %r9d, %r9d
callq 0x1cf70
movq %r14, 0x50(%r15)
leaq 0x1b8(%rsp), %rdi
callq 0x7678
leaq 0x40(%rsp), %rdi
callq 0x7678
movl $0x100, %edi            # imm = 0x100
callq 0x7370
movq %rax, %r14
leaq 0x8(%r15), %rsi
leaq 0xc8(%rsp), %rdi
movq %rsi, 0xa8(%rsp)
callq 0x7480
leaq 0x34212(%rip), %rdx     # 0x44e47
leaq 0x40(%rsp), %rdi
leaq 0xc8(%rsp), %rsi
callq 0x9b29
leaq 0x5181a(%rip), %rax     # 0x62468
movsd (%rax), %xmm0
leaq 0x51817(%rip), %rax     # 0x62470
movl (%rax), %r8d
subq $0x8, %rsp
leaq 0x48(%rsp), %rsi
pushq $0x14
popq %r9
movq %r14, %rdi
xorl %edx, %edx
xorl %ecx, %ecx
pushq $0x2
pushq $0x6
pushq $0x80
callq 0x1c5f8
addq $0x20, %rsp
movq %r14, 0x40(%r15)
leaq 0x40(%rsp), %rdi
callq 0x7678
leaq 0xc8(%rsp), %rdi
callq 0x7678
pushq $0x20
popq %rdi
callq 0x7370
movq %rax, %r14
movl 0x38(%r12), %edx
movq 0x40(%r15), %rsi
movq 0x50(%r15), %rcx
movq %rax, %rdi
xorl %r8d, %r8d
callq 0x1cda0
movq %r14, 0x38(%r15)
movq 0x40(%r15), %rdi
movq %r14, %rsi
callq 0x1c6aa
pushq $0x10
popq %rdi
callq 0x7370
movq %rax, %r14
movq 0x40(%r15), %rsi
movq %rax, %rdi
movq %r12, %rdx
callq 0x1cf18
movq %r14, 0x48(%r15)
movq 0x40(%r15), %rdi
movq %r14, %rsi
callq 0x1c6b0
callq 0x1f784
movq 0x40(%r15), %rsi
movq %rax, %rdi
callq 0x1f7f2
movq %r12, 0x20(%rsp)
movq %r12, %rdi
callq 0x345a6
movw $0x1, %ax
leaq 0x40(%rsp), %r15
movq %rax, 0xc0(%rsp)
decl %eax
movzwl %ax, %ebp
leaq 0x51833(%rip), %rax     # 0x62568
movq (%rax), %rcx
movq 0x8(%rax), %rax
subq %rcx, %rax
sarq $0x3, %rax
cmpq %rbp, %rax
jbe 0x113e0
andq $0x0, 0x28(%rsp)
movq 0x20(%rsp), %rdi
cmpl $0x1, 0x38(%rdi)
jne 0x10d7a
callq 0x35228
movl %eax, %ebx
movq 0x20(%rsp), %rdi
callq 0x35230
leaq 0x517f3(%rip), %rcx     # 0x62568
movq (%rcx), %rcx
jmp 0x10d7e
xorl %ebx, %ebx
xorl %eax, %eax
movq (%rcx,%rbp,8), %r12
movl 0xc(%r12), %ecx
movzwl %ax, %eax
movq %rax, 0xb0(%rsp)
movzwl %bx, %eax
movq %rax, 0xb8(%rsp)
movzwl 0xc0(%rsp), %eax
movl %eax, 0x34(%rsp)
cmpl $0x1, %ecx
je 0x10eee
testl %ecx, %ecx
jne 0x1142b
movl 0x4c(%r12), %eax
addl $-0x65, %eax
cmpl $-0x65, %eax
ja 0x10dd0
movl $0x64, 0x4c(%r12)
movl $0x520, %edi            # imm = 0x520
callq 0x7370
movq %rax, %r14
leaq 0x198(%rsp), %rbx
movq %rbx, %rdi
movq 0xa8(%rsp), %rsi
callq 0x7480
leaq 0xc8(%rsp), %rdi
movq %rbx, %rsi
leaq 0x3404a(%rip), %rdx     # 0x44e51
callq 0x9b29
leaq 0x178(%rsp), %rbx
movq %rbx, %rdi
movl %ebp, %esi
callq 0x9baf
movq %r15, %rdi
leaq 0xc8(%rsp), %rsi
movq %rbx, %rdx
callq 0x9b48
movl %ebp, %edi
callq 0x40ef6
movq %rax, %rbx
movl %ebp, %edi
callq 0x40f5a
movq %rax, %r10
movl 0x10(%r12), %ecx
movl 0x4c(%r12), %r13d
movsbl 0x54(%r12), %r15d
movl 0x58(%r12), %edx
movsbl 0x5c(%r12), %r11d
movl 0x64(%r12), %esi
movl 0x68(%r12), %edi
movl 0x6c(%r12), %r8d
movl 0x50(%r12), %r9d
movl 0x78(%r12), %eax
testl %eax, %eax
movq %r14, 0x10(%rsp)
movq %rcx, 0x98(%rsp)
movq %rdx, 0x90(%rsp)
movq %rsi, 0x88(%rsp)
movq %rdi, 0x80(%rsp)
movq %r8, 0x78(%rsp)
movq %r9, 0x70(%rsp)
movq %rbx, 0x68(%rsp)
movq %r10, 0x60(%rsp)
movl %r11d, 0xa4(%rsp)
movl %r15d, 0xa0(%rsp)
movq %r13, 0x110(%rsp)
je 0x1114b
shrl $0x9, %eax
xorl %edx, %edx
divl %edi
movl %eax, %ecx
movl $0x3b9aca00, %eax       # imm = 0x3B9ACA00
xorl %edx, %edx
divl %ecx
movq %rax, 0x38(%rsp)
jmp 0x11154
movl $0x6d0, %edi            # imm = 0x6D0
callq 0x7370
movq %rax, 0x10(%rsp)
leaq 0x198(%rsp), %rbx
movq %rbx, %rdi
movq 0xa8(%rsp), %rsi
callq 0x7480
leaq 0xc8(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
leaq 0x33f4c(%rip), %rdx     # 0x44e76
callq 0x9b29
leaq 0x50(%r12), %r13
movq %r15, %rdi
movq %r14, %rsi
movq %r13, %rdx
callq 0x11c6d
movl %ebp, %edi
callq 0x40ef6
movq %rax, 0x98(%rsp)
leaq 0x1d8(%rsp), %rbx
movl %ebp, %edi
callq 0x40f5a
movq %rax, 0x90(%rsp)
movl 0x10(%r12), %eax
movq %rax, 0x88(%rsp)
movl 0x38(%r12), %eax
cvtsi2sd %rax, %xmm0
divsd 0x33ea9(%rip), %xmm0    # 0x44e30
movsd %xmm0, 0x80(%rsp)
movq %rbx, %rdi
movq %r13, %rsi
callq 0x7480
movl 0x78(%r12), %eax
movq %rax, 0x78(%rsp)
movl 0x70(%r12), %eax
movq %rax, 0x68(%rsp)
movl 0x74(%r12), %eax
movq %rax, 0x70(%rsp)
movq 0x20(%rsp), %rax
movl 0x38(%rax), %eax
movq %rax, 0x38(%rsp)
movq 0x8(%rsp), %rax
movq 0x38(%rax), %rcx
movq %rcx, 0x60(%rsp)
movq 0x50(%rax), %r12
leaq 0x51561(%rip), %rax     # 0x62540
movb (%rax), %r14b
leaq 0x5148f(%rip), %rax     # 0x62478
movq (%rax), %r15
leaq 0x158(%rsp), %rdi
leaq 0x5154d(%rip), %rsi     # 0x62548
leaq 0x33e62(%rip), %rdx     # 0x44e64
callq 0x11c18
leaq 0x138(%rsp), %rbx
movq %rbx, %rdi
movl %ebp, %esi
callq 0x9baf
leaq 0x178(%rsp), %r13
movq %r13, %rdi
leaq 0x158(%rsp), %rsi
movq %rbx, %rdx
callq 0x9b48
leaq 0x218(%rsp), %rbx
movq %rbx, %rdi
movq %r13, %rsi
leaq 0x33e28(%rip), %rdx     # 0x44e71
callq 0x9b29
subq $0x8, %rsp
movzbl %r14b, %eax
movq 0x18(%rsp), %r13
movq %r13, %rdi
leaq 0x48(%rsp), %r14
movq %r14, %rsi
movl %ebp, %edx
movq 0xa0(%rsp), %rcx
movq 0x98(%rsp), %r8
movl 0x3c(%rsp), %r9d
movsd 0x88(%rsp), %xmm0
movq %rbx, %rbp
pushq %rbx
pushq %r15
pushq %rax
pushq %r12
pushq 0x88(%rsp)
pushq 0x68(%rsp)
pushq 0xa0(%rsp)
pushq 0xb0(%rsp)
pushq 0xc0(%rsp)
leaq 0x228(%rsp), %rbx
pushq %rbx
pushq 0xe0(%rsp)
pushq 0x110(%rsp)
pushq 0x120(%rsp)
callq 0x1ae14
addq $0x70, %rsp
movq %r13, 0x28(%rsp)
movq %rbp, %rdi
callq 0x7678
leaq 0x178(%rsp), %rdi
callq 0x7678
leaq 0x138(%rsp), %rdi
callq 0x7678
leaq 0x158(%rsp), %rdi
callq 0x7678
movq %rbx, %rdi
callq 0x7678
movq %r14, %rdi
callq 0x7678
leaq 0xc8(%rsp), %rdi
callq 0x7678
leaq 0x198(%rsp), %rdi
callq 0x7678
movq 0x18(%rsp), %rdi
leaq 0x28(%rsp), %rsi
callq 0x11c50
movq %r14, %r15
jmp 0x113bf
movq $0x0, 0x38(%rsp)
movl 0x74(%r12), %eax
movq %rax, 0x130(%rsp)
movb 0x5d(%r12), %r15b
movl 0x60(%r12), %eax
movq %rax, 0x128(%rsp)
movl 0x70(%r12), %eax
movq %rax, 0x120(%rsp)
movl 0x38(%r12), %eax
cvtsi2sd %rax, %xmm0
movq 0x80(%r12), %rax
movq %rax, 0x118(%rsp)
divsd 0x33c8e(%rip), %xmm0    # 0x44e30
movsd %xmm0, 0xe8(%rsp)
movl 0x88(%r12), %eax
movq %rax, 0x108(%rsp)
movq 0x20(%rsp), %rax
movl 0x38(%rax), %eax
movq %rax, 0x100(%rsp)
movq 0x8(%rsp), %rax
movq 0x38(%rax), %rcx
movq %rcx, 0xf8(%rsp)
movq 0x50(%rax), %rax
movq %rax, 0xf0(%rsp)
leaq 0x51351(%rip), %rax     # 0x62540
movb (%rax), %r13b
leaq 0x5127f(%rip), %rax     # 0x62478
movq (%rax), %r12
leaq 0x138(%rsp), %rdi
leaq 0x5133d(%rip), %rsi     # 0x62548
leaq 0x33c52(%rip), %rdx     # 0x44e64
callq 0x11c18
leaq 0x1f8(%rsp), %rbx
movq %rbx, %rdi
movl %ebp, %esi
callq 0x9baf
leaq 0x158(%rsp), %r14
movq %r14, %rdi
leaq 0x138(%rsp), %rsi
movq %rbx, %rdx
callq 0x9b48
leaq 0x238(%rsp), %rbx
movq %rbx, %rdi
movq %r14, %rsi
leaq 0x33c18(%rip), %rdx     # 0x44e71
callq 0x9b29
cvtsi2sdq 0x110(%rsp), %xmm0
movsd 0x33bc0(%rip), %xmm3    # 0x44e30
divsd %xmm3, %xmm0
cvtsi2sdl 0xa0(%rsp), %xmm1
divsd %xmm3, %xmm1
cvtsi2sdl 0xa4(%rsp), %xmm2
divsd %xmm3, %xmm2
subq $0x8, %rsp
movzbl %r13b, %r10d
movzbl %r15b, %eax
movq 0x18(%rsp), %r14
movq %r14, %rdi
leaq 0x48(%rsp), %r15
movq %r15, %rsi
movl %ebp, %edx
movq 0x70(%rsp), %rcx
movq 0x68(%rsp), %r8
movl 0x3c(%rsp), %r9d
movsd 0xf0(%rsp), %xmm3
pushq %rbx
pushq %r12
pushq %r10
pushq 0x110(%rsp)
pushq 0x120(%rsp)
pushq 0x130(%rsp)
pushq 0x140(%rsp)
pushq 0x158(%rsp)
pushq 0x168(%rsp)
pushq 0x178(%rsp)
pushq %rax
pushq 0x190(%rsp)
pushq 0xa0(%rsp)
pushq 0xe0(%rsp)
pushq 0xf0(%rsp)
pushq 0x100(%rsp)
pushq 0x110(%rsp)
pushq 0x120(%rsp)
pushq 0x130(%rsp)
pushq 0x150(%rsp)
pushq 0x160(%rsp)
callq 0x1a2b4
addq $0xb0, %rsp
movq %r14, 0x28(%rsp)
movq %rbx, %rdi
callq 0x7678
leaq 0x158(%rsp), %rdi
callq 0x7678
leaq 0x1f8(%rsp), %rdi
callq 0x7678
leaq 0x138(%rsp), %rdi
callq 0x7678
movq %r15, %rdi
callq 0x7678
leaq 0x178(%rsp), %rdi
callq 0x7678
leaq 0xc8(%rsp), %rdi
callq 0x7678
leaq 0x198(%rsp), %rdi
callq 0x7678
movq 0x18(%rsp), %rdi
leaq 0x28(%rsp), %rsi
callq 0x11c50
callq 0x1f784
movq 0x28(%rsp), %rsi
movq %rax, %rdi
callq 0x1f7f2
movq 0xc0(%rsp), %rax
incl %eax
jmp 0x10d21
movq 0x8(%rsp), %r15
movq 0x38(%r15), %rdi
movq 0x18(%rsp), %rsi
callq 0x1cf10
movq 0x20(%rsp), %rax
cmpl $0x0, 0x38(%rax)
jne 0x11419
movq 0x50(%r15), %rdi
movq 0x18(%rsp), %rsi
callq 0x1d764
movq 0x38(%r15), %rsi
movq 0x50(%r15), %rdi
callq 0x1d76a
addq $0x258, %rsp            # imm = 0x258
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
pushq $0x8
popq %rdi
callq 0x71b0
leaq 0x33a4c(%rip), %rcx     # 0x44e86
movq %rcx, (%rax)
movq 0x50afc(%rip), %rsi     # 0x61f40
movq %rax, %rdi
xorl %edx, %edx
callq 0x7590
movq %rax, %rbx
jmp 0x11468
movq %rax, %rbx
jmp 0x11472
movq %rax, %rbx
leaq 0x1b8(%rsp), %rdi
callq 0x7678
leaq 0x40(%rsp), %rdi
callq 0x7678
jmp 0x114a2
jmp 0x11476
movq %rax, %rbx
jmp 0x11659
movq %rax, %rbx
leaq 0x40(%rsp), %rdi
callq 0x7678
jmp 0x11490
movq %rax, %rbx
leaq 0xc8(%rsp), %rdi
callq 0x7678
jmp 0x114a2
movq %rax, %rbx
movq %r14, %rdi
callq 0x7340
jmp 0x11666
movq %rax, %rbx
leaq 0x40(%rsp), %rdi
callq 0x7678
jmp 0x1167d
movq %rax, %rbx
jmp 0x1167d
jmp 0x114cb
movq %rax, %rbx
jmp 0x1166b
jmp 0x11663
movq %rax, %rbx
jmp 0x115d0
movq %rax, %rbx
jmp 0x1156d
movq %rax, %rbx
jmp 0x115c3
movq %rax, %rbx
jmp 0x115f6
movq %rax, %rbx
jmp 0x11553
movq %rax, %rbx
movq 0x8(%rsp), %r15
jmp 0x11622
movq %rax, %rbx
jmp 0x11560
movq %rax, %rbx
jmp 0x115dd
movq %rax, %rbx
jmp 0x115b6
movq %rax, %rbx
movq 0x8(%rsp), %r15
movq 0x10(%rsp), %r14
jmp 0x11659
movq %rax, %rbx
jmp 0x11546
movq %rax, %rbx
leaq 0x218(%rsp), %rdi
callq 0x7678
leaq 0x178(%rsp), %rdi
callq 0x7678
leaq 0x138(%rsp), %rdi
callq 0x7678
leaq 0x158(%rsp), %rdi
callq 0x7678
leaq 0x1d8(%rsp), %rdi
callq 0x7678
jmp 0x1162b
movq %rax, %rbx
movq 0x8(%rsp), %r15
jmp 0x11615
movq %rax, %rbx
jmp 0x11635
movq %rax, %rbx
movq 0x8(%rsp), %r15
movq 0x10(%rsp), %r14
jmp 0x1164c
movq %rax, %rbx
leaq 0x238(%rsp), %rdi
callq 0x7678
leaq 0x158(%rsp), %rdi
callq 0x7678
leaq 0x1f8(%rsp), %rdi
callq 0x7678
leaq 0x138(%rsp), %rdi
callq 0x7678
movq 0x10(%rsp), %r14
jmp 0x115ec
movq %rax, %rbx
jmp 0x11603
movq %rax, %rbx
leaq 0x40(%rsp), %rdi
callq 0x7678
leaq 0x178(%rsp), %rdi
callq 0x7678
movq 0x8(%rsp), %r15
leaq 0xc8(%rsp), %rdi
callq 0x7678
leaq 0x198(%rsp), %rdi
callq 0x7678
jmp 0x11659
jmp 0x11663
jmp 0x11663
movq %rax, %rbx
leaq 0x40(%rsp), %rdi
callq 0x7678
movq 0x8(%rsp), %r15
movq 0x10(%rsp), %r14
leaq 0xc8(%rsp), %rdi
callq 0x7678
leaq 0x198(%rsp), %rdi
callq 0x7678
movq %r14, %rdi
callq 0x7340
jmp 0x1166b
movq %rax, %rbx
movq 0x8(%rsp), %r15
movq 0x18(%rsp), %rdi
callq 0xb5a0
movq %r15, %rdi
callq 0x11c8c
movq %rbx, %rdi
callq 0x75d0
nop