// File: /workspace/github_cpp_makefile_star2_O2/nataly-enne[P]pet-fera/pet_fera_cadastrar.cpp
// Function: cadastrar(std::map<int, MAMIFERO_NATIVO, std::less<int>, std::allocator<std::pair<int const, MAMIFERO_NATIVO>>>&, std::map<int, MAMIFERO_EXOTICO, std::less<int>, std::allocator<std::pair<int const, MAMIFERO_EXOTICO>>>&, std::map<int, VETERINARIO, std::less<int>, std::allocator<std::pair<int const, VETERINARIO>>>, std::map<int, TRATADOR, std::less<int>, std::allocator<std::pair<int const, TRATADOR>>>)
void cadastrar(map <int, MAMIFERO_NATIVO> &mamiferos_nat, map <int, MAMIFERO_EXOTICO> &mamiferos_ex, map <int, VETERINARIO> vets, map <int, TRATADOR> tratadores){
	int id;
	string classe, nome_cientifico, dieta, veterinario, tratador, nome_batismo, autorizacao, autorizacao_IBAMA, origem, cor, nome, id_string, sexo_string, tamanho_string;
	char sexo, tipo_animal, continuar = 's', sucesso, tipo = 'm';
	double tamanho;
	bool check;
	unsigned int old_size;
	ofstream nativos;
	ofstream exoticos;

	do{
		cout << "Deseja cadastrar um MAMIFERO NATIVO ou MAMIFERO EXÓTICO? \n n - NATIVO\n e - EXÓTICO" << endl;
		cin >> tipo_animal;
		if(tipo_animal != 'n' && tipo_animal != 'e'){
			cout << "Tipo invalido, tente novamente!" << endl;
			continuar = 's';
			continue;
		}
		else{
			// Recebe o ID e verifica se é valido.
			do{
				cout << "Digite o id:" << endl;
				cin >> id_string;
				if(!verifica_ID(mamiferos_nat, mamiferos_ex, tipo_animal, id_string, sucesso)){
					cout << "O ID deve conter apenas inteiros ou ID já cadastrado!" << endl << endl;
				}
				else{
					stringstream ss(id_string); // Converte string para int.
					ss >> id;
				}

			}while(sucesso == 'n');

			classe = "Mammalia";

			// Recebe o nome e verifica se é valido.
			do{
				cout << "Digite o nome:" << endl;
				cin.ignore();
				getline(cin, nome);
				if(!verifica_nome(nome, sucesso)){
					cout << "ERRO: só pode ser inserido letra ou espaço!" << endl << endl;
				}
				transform(nome.begin(), nome.end(), nome.begin(), ::tolower); // Converte a string nome para caracteres maiúsculos.
			}while(sucesso == 'n');

			// Recebe o nome cientifico e verifica se é valido.
			do{
				cout << "Digite o nome científico:" << endl;
				getline(cin, nome_cientifico);
				if(!verifica_nome_cient(nome_cientifico, sucesso)){
					cout << "ERRO: só pode ser inserido letra, espaço ou traço!" << endl << endl;
				}
			}while(sucesso == 'n');

			// Recebe a dieta e verifica se não possui caracteres proibidos.
			do{
				cout << "Digite a dieta: " << endl;
				getline(cin, dieta);
				if(!verifica_dieta(dieta, sucesso)){
					cout << "ERRO: só pode ser inserido letra ou espaço!" << endl << endl;
				}
			}while(sucesso == 'n');

			// Recebe o nome do veterinario e verifica se não possui caracteres proibidos.
			do{
				cout << "Digite o nome do veterinario: " << endl;
				getline(cin, veterinario);
				
				if(!verifica_nome(veterinario, sucesso)){
					cout << "ERRO: só pode ser inserido letra ou espaço!" << endl << endl;
				}
				check = check_vet(vets, veterinario);
				if(!check){
					cout << endl;
					cout << "ERRO: Veterinario não cadastrado!" << endl;
					sucesso = 'n';
				}
			}while(sucesso == 'n');

			// Recebe o nome do tratador e verifica se não possui caracter proibido, se já foi cadastrado ou se possui nivel de segurança adequado.
			do{
				cout << "Digite o nome do tratador: " << endl;
				getline(cin, tratador);
				if(!verifica_nome(tratador, sucesso)){
					cout << "ERRO: só pode ser inserido letra ou espaço!" << endl << endl;
				}
				check = check_tratador(0, tratadores, tratador, tipo);
				if(!check){
					cout << endl;
					cout << "ERRO: Tratador não cadastrado ou não se adequa!" << endl << endl;
					sucesso = 'n';
				}
			}while(sucesso == 'n');

			// Recebe o nome e verifica se é valido.
			do{
				cout << "Digite o nome de batismo: " << endl;
				getline(cin, nome_batismo);
				if(!verifica_nome(nome_batismo, sucesso)){
					cout << "ERRO: só pode ser inserido letra ou espaço!" << endl << endl;
				}
				transform(nome_batismo.begin(), nome_batismo.end(), nome_batismo.begin(), ::tolower); // Converte a string nome_batismo para caracteres minusculos.
			}while(sucesso == 'n');

			// Recebe o sexo do animal e verifica se é F ou M.
			do{
				cout << "Digite o sexo do animal: " << endl;
				getline(cin, sexo_string);
				transform(sexo_string.begin(), sexo_string.end(), sexo_string.begin(), ::toupper); // Converte a string sexo para caracteres maiúsculos.
				if(sexo_string != "F" && sexo_string != "M" ){
					sucesso = 'n';
					cout << "ERRO: só são permitidos F ou M!" << endl << endl;
				}
				else{
					sexo = (char)sexo_string[0];
					sucesso = 's';
				}
			}while(sucesso == 'n');

			// Recebe o tamanho do animal e verifica se não há caracteres proibidos.
			do{
				cout << "Digite o tamanho do animal: " << endl;
				getline(cin, tamanho_string);
				if(!verifica_tamanho(tamanho_string, sucesso)){
					cout << "ERRO: o tamanho do animal tem que ter apenas um '.' " << endl << endl;
				}
				tamanho = stod(tamanho_string);
			}while(sucesso == 'n');

			do{
				cout << "Digite a cor do pelo: " << endl;
				getline(cin, cor);
				if(!verifica_cor(cor, sucesso)){
					cout << "ERRO: a cor do animal deve conter letras, espaço ou '-'" << endl << endl;
				}
			}while(sucesso == 'n');
			
			// Verifica se a autorizacao está no formato correto.
			do{
				cout << "Insira a autorizacao do IBAMA: " << endl;
				getline(cin, autorizacao_IBAMA);
				if(!verifica_autorizacao(autorizacao_IBAMA, sucesso)){
					cout << "ERRO: A autorizacao deve conter letras, numeros ou '-'" << endl << endl;
				}
			}while(sucesso == 'n');
			

			if(tipo_animal == 'n'){
				old_size = mamiferos_nat.size();

				// Verifica se foi passado uma string.
				do{
					cout << "Digite a UF de origem: " << endl;
					getline(cin, origem);
					if(!verifica_origem(origem, sucesso)){
						cout << "ERRO: Deve-se colocar apenas letras!" << endl << endl;
					}
				}while(sucesso == 'n');
				
				// Verifica se a autorizacao está no formato correto.
				do{
					cout << "Insira a autorizacao do animal: " << endl;
					getline(cin, autorizacao);
					if(!verifica_autorizacao(autorizacao, sucesso)){
						cout << "ERRO: A autorizacao deve conter letras, numeros e '-'" << endl << endl;
					}
				}while(sucesso == 'n');

				// Armazenando no map dados do tipo mamífero nativo passados pelo usuário.
				mamiferos_nat.insert(pair <int, MAMIFERO_NATIVO> (id, MAMIFERO_NATIVO(id, classe, nome, nome_cientifico,sexo, tamanho, dieta, veterinario, tratador, nome_batismo, cor, autorizacao_IBAMA, origem, autorizacao)));
				
				if (mamiferos_nat.size() == old_size){
					cout << "Falha no cadastro do animal! Tente novamente!" << endl;
					continuar = 's';
					continue;
				}
			}
			else{
				old_size = mamiferos_ex.size();

				// Verifica se foi passado uma string.
				do{
					cout << "Digite o País de origem: " << endl;
					getline(cin, origem);
					if(!verifica_origem(origem, sucesso)){
						cout << "ERRO: Deve-se colocar apenas letras!" << endl << endl;
					}
				}while(sucesso == 'n');

				// Verifica se a autorizacao está no formato correto.
				do{
					cout << "Insira a autorizacao do animal: " << endl;
					getline(cin, autorizacao);
					if(!verifica_autorizacao(autorizacao, sucesso)){
						cout << "ERRO: A autorizacao deve conter letras, numeros e '-'"<< endl << endl;
					}
				}while(sucesso == 'n');

				// Armazenando no map dados do tipo mamífero exótico passados pelo usuário.
				mamiferos_ex.insert(pair <int, MAMIFERO_EXOTICO> (id, MAMIFERO_EXOTICO(id, classe, nome, nome_cientifico,sexo, tamanho, dieta,veterinario, tratador, nome_batismo, cor, autorizacao_IBAMA, origem, autorizacao)));
				
				if (mamiferos_ex.size() == old_size){
					cout << "Falha no cadastro do animal! Tente novamente!" << endl;
					continuar = 's';
					continue;
				}
			
			}

		}
		cout << "\nAnimal cadastrado com sucesso!" << endl << endl;
		cout << "Deseja cadastrar um novo animal? s/n" << endl;
		cin >> continuar;
	}while(continuar == 's');

	if(!mamiferos_nat.empty()){
		nativos.open("mamiferos_nat.txt");
		for(auto it = mamiferos_nat.begin(); it != mamiferos_nat.end(); it++){
			nativos << (*it).second;
		}
		nativos.close();
	}
	if(!mamiferos_ex.empty()){
		exoticos.open("mamiferos_ex.txt");
		for(auto it = mamiferos_ex.begin(); it != mamiferos_ex.end(); it++){
			exoticos << (*it).second;
		}
		exoticos.close();
	}	
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xc58, %rsp            # imm = 0xC58
movq %rcx, -0x100(%rbp)
movq %rdx, -0x108(%rbp)
movq %rsi, %rbx
movq %rdi, %r14
leaq -0x218(%rbp), %rcx
movq %rcx, -0x10(%rcx)
andq $0x0, -0x8(%rcx)
leaq -0x1b8(%rbp), %rdx
movq %rdx, -0x10(%rdx)
andq $0x0, -0x8(%rdx)
xorl %eax, %eax
movb %al, (%rcx)
leaq -0x198(%rbp), %rcx
movq %rcx, -0x10(%rcx)
andq $0x0, -0x8(%rcx)
leaq -0x138(%rbp), %rsi
movq %rsi, -0x10(%rsi)
andq $0x0, -0x8(%rsi)
movb %al, (%rdx)
movb %al, (%rcx)
leaq -0x118(%rbp), %rcx
movq %rcx, -0x10(%rcx)
andq $0x0, -0x8(%rcx)
leaq -0xe8(%rbp), %rdx
movq %rdx, -0x10(%rdx)
andq $0x0, -0x8(%rdx)
movb %al, (%rsi)
movb %al, (%rcx)
leaq -0xc8(%rbp), %rcx
movq %rcx, -0x10(%rcx)
andq $0x0, -0x8(%rcx)
leaq -0x178(%rbp), %rsi
movq %rsi, -0x10(%rsi)
andq $0x0, -0x8(%rsi)
movb %al, (%rdx)
movb %al, (%rcx)
leaq -0xa8(%rbp), %rcx
movq %rcx, -0x10(%rcx)
andq $0x0, -0x8(%rcx)
leaq -0x158(%rbp), %rdx
movq %rdx, -0x10(%rdx)
andq $0x0, -0x8(%rdx)
movb %al, (%rsi)
movb %al, (%rcx)
leaq -0x88(%rbp), %rcx
movq %rcx, -0x10(%rcx)
andq $0x0, -0x8(%rcx)
leaq -0x1f8(%rbp), %rsi
movq %rsi, -0x10(%rsi)
andq $0x0, -0x8(%rsi)
movb %al, (%rdx)
movb %al, (%rcx)
leaq -0x68(%rbp), %rcx
movq %rcx, -0x10(%rcx)
andq $0x0, -0x8(%rcx)
leaq -0x1d8(%rbp), %rdx
movq %rdx, -0x10(%rdx)
andq $0x0, -0x8(%rdx)
movb %al, (%rsi)
movb %al, (%rcx)
movb %al, (%rdx)
movb $0x73, -0x2a(%rbp)
leaq -0xc80(%rbp), %rdi
callq 0x3350
movq %r14, -0x40(%rbp)
movq %rbx, -0x48(%rbp)
leaq -0xa80(%rbp), %rdi
callq 0x3350
movq 0x22b3a(%rip), %r13     # 0x30fc8
movq 0x22b4b(%rip), %rbx     # 0x30fe0
leaq -0x568(%rbp), %r12
movq %r13, %rdi
leaq 0x15a2e(%rip), %rsi     # 0x23ed4
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0x2b(%rbp), %rsi
callq 0x3280
movzbl -0x2b(%rbp), %eax
cmpl $0x6e, %eax
je 0xe4ea
cmpl $0x65, %eax
je 0xe4ea
movq %r13, %rdi
leaq 0x15616(%rip), %rsi     # 0x23aed
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movb $0x73, -0x2a(%rbp)
jmp 0xe49c
movq %r13, %rdi
leaq 0x1520b(%rip), %rsi     # 0x236ff
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0x208(%rbp), %rsi
callq 0x3260
movb -0x2b(%rbp), %r14b
movq %r12, %rdi
leaq -0x208(%rbp), %rsi
callq 0x3290
movsbl %r14b, %edx
movq -0x40(%rbp), %rdi
movq -0x48(%rbp), %rsi
movq %r12, %rcx
leaq -0x29(%rbp), %r8
callq 0x214bd
movl %eax, %r15d
movq %r12, %rdi
callq 0x3100
testb %r15b, %r15b
je 0xe57a
leaq -0x6f8(%rbp), %r14
movq %r14, %rdi
leaq -0x208(%rbp), %rsi
pushq $0x18
popq %rdx
callq 0x3300
movq %r14, %rdi
leaq -0x30(%rbp), %rsi
callq 0x3150
movq %r14, %rdi
callq 0x3170
jmp 0xe599
movq %r13, %rdi
leaq 0x15188(%rip), %rsi     # 0x2370c
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xe4ea
leaq -0x228(%rbp), %rdi
leaq 0x15978(%rip), %rsi     # 0x23f29
callq 0x33b0
movq %r13, %rdi
leaq 0x15183(%rip), %rsi     # 0x23743
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
callq 0x3380
movq %rbx, %rdi
leaq -0x98(%rbp), %rsi
callq 0x3060
leaq -0x98(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x21b16
testb %al, %al
jne 0xe617
movq %r13, %rdi
leaq 0x15150(%rip), %rsi     # 0x23752
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
movq -0x98(%rbp), %r15
movq -0x90(%rbp), %r12
xorl %r14d, %r14d
cmpq %r14, %r12
je 0xe640
movsbl (%r15,%r14), %edi
callq 0x32c0
movb %al, (%r15,%r14)
incq %r14
jmp 0xe628
cmpb $0x6e, -0x29(%rbp)
je 0xe5b6
movq %r13, %rdi
leaq 0x154c2(%rip), %rsi     # 0x23b16
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0x1c8(%rbp), %rsi
callq 0x3060
leaq -0x1c8(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x21bd2
testb %al, %al
jne 0xe6a3
movq %r13, %rdi
leaq 0x154a3(%rip), %rsi     # 0x23b31
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xe64a
movq %r13, %rdi
leaq 0x154b4(%rip), %rsi     # 0x23b67
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0x1a8(%rbp), %rsi
callq 0x3060
leaq -0x1a8(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x22195
testb %al, %al
jne 0xe702
movq %r13, %rdi
leaq 0x15065(%rip), %rsi     # 0x23752
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xe6a9
jmp 0xe72d
movq %r13, %rdi
callq 0x3110
movq %r13, %rdi
leaq 0x1547b(%rip), %rsi     # 0x23b97
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movb $0x6e, -0x29(%rbp)
movq %r13, %rdi
leaq 0x15441(%rip), %rsi     # 0x23b78
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0x148(%rbp), %rsi
callq 0x3060
leaq -0x148(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x21b16
testb %al, %al
jne 0xe786
movq %r13, %rdi
leaq 0x14fe1(%rip), %rsi     # 0x23752
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
leaq -0x548(%rbp), %rdi
leaq -0x148(%rbp), %rsi
callq 0x3290
movq -0x108(%rbp), %rdi
leaq -0x548(%rbp), %r14
movq %r14, %rsi
callq 0x20e46
movl %eax, %r15d
movq %r14, %rdi
callq 0x3100
testb %r15b, %r15b
je 0xe70a
cmpb $0x6e, -0x29(%rbp)
je 0xe72d
movq %r13, %rdi
leaq 0x153e3(%rip), %rsi     # 0x23bba
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0x128(%rbp), %rsi
callq 0x3060
leaq -0x128(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x21b16
testb %al, %al
jne 0xe826
movq %r13, %rdi
leaq 0x14f41(%rip), %rsi     # 0x23752
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
leaq -0x528(%rbp), %rdi
leaq -0x128(%rbp), %rsi
callq 0x3290
xorl %edi, %edi
movq -0x100(%rbp), %rsi
leaq -0x528(%rbp), %r14
movq %r14, %rdx
pushq $0x6d
popq %rcx
callq 0x20eb7
movl %eax, %r15d
movq %r14, %rdi
callq 0x3100
testb %r15b, %r15b
je 0xe870
cmpb $0x6e, -0x29(%rbp)
je 0xe7cd
jmp 0xe8a0
movq %r13, %rdi
callq 0x3110
movq %r13, %rdi
leaq 0x15354(%rip), %rsi     # 0x23bd6
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
movb $0x6e, -0x29(%rbp)
jmp 0xe7cd
movq %r13, %rdi
leaq 0x1535e(%rip), %rsi     # 0x23c08
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0xf8(%rbp), %rsi
callq 0x3060
leaq -0xf8(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x21b16
testb %al, %al
jne 0xe8f9
movq %r13, %rdi
leaq 0x14e6e(%rip), %rsi     # 0x23752
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
movq -0xf8(%rbp), %r15
movq -0xf0(%rbp), %r12
xorl %r14d, %r14d
cmpq %r14, %r12
je 0xe922
movsbl (%r15,%r14), %edi
callq 0x32c0
movb %al, (%r15,%r14)
incq %r14
jmp 0xe90a
cmpb $0x6e, -0x29(%rbp)
je 0xe8a0
movq %r13, %rdi
leaq 0x152ed(%rip), %rsi     # 0x23c23
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0x78(%rbp), %rsi
callq 0x3060
movq -0x78(%rbp), %r15
movq -0x70(%rbp), %r12
xorl %r14d, %r14d
cmpq %r14, %r12
je 0xe972
movsbl (%r15,%r14), %edi
callq 0x33a0
movb %al, (%r15,%r14)
incq %r14
jmp 0xe95a
leaq -0x78(%rbp), %rdi
leaq 0x152c0(%rip), %rsi     # 0x23c3d
callq 0xb86b
leaq -0x568(%rbp), %r12
testb %al, %al
je 0xe9d0
leaq -0x78(%rbp), %rdi
leaq 0x152a7(%rip), %rsi     # 0x23c3f
callq 0xb86b
testb %al, %al
je 0xe9d0
movb $0x6e, -0x29(%rbp)
movq %r13, %rdi
leaq 0x15292(%rip), %rsi     # 0x23c41
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xe92c
jmp 0xe9dd
movq -0x78(%rbp), %rax
movb (%rax), %al
movb %al, -0x2c(%rbp)
movb $0x73, -0x29(%rbp)
movq %r13, %rdi
leaq 0x1527c(%rip), %rsi     # 0x23c63
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0x1e8(%rbp), %rsi
callq 0x3060
leaq -0x508(%rbp), %rdi
leaq -0x1e8(%rbp), %rsi
callq 0x3290
leaq -0x508(%rbp), %r14
movq %r14, %rdi
leaq -0x29(%rbp), %rsi
callq 0x22273
movl %eax, %r15d
movq %r14, %rdi
callq 0x3100
testb %r15b, %r15b
jne 0xea58
movq %r13, %rdi
leaq 0x1523d(%rip), %rsi     # 0x23c80
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
leaq -0x1e8(%rbp), %rdi
xorl %esi, %esi
callq 0x11e17
movsd %xmm0, -0x58(%rbp)
cmpb $0x6e, -0x29(%rbp)
je 0xe9dd
movq %r13, %rdi
leaq 0x154b3(%rip), %rsi     # 0x23f32
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0x168(%rbp), %rsi
callq 0x3060
leaq -0x168(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x22556
testb %al, %al
jne 0xeace
movq %r13, %rdi
leaq 0x15490(%rip), %rsi     # 0x23f49
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xea75
movq %r13, %rdi
leaq 0x15293(%rip), %rsi     # 0x23d71
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0x188(%rbp), %rsi
callq 0x3060
leaq -0x188(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x2238b
testb %al, %al
jne 0xeb2d
movq %r13, %rdi
leaq 0x1546a(%rip), %rsi     # 0x23f82
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xead4
cmpb $0x6e, -0x2b(%rbp)
movsbl -0x2c(%rbp), %eax
movl %eax, -0x38(%rbp)
jne 0xee48
movq -0x40(%rbp), %rax
movl 0x28(%rax), %eax
movq %rax, -0x50(%rbp)
movq %r13, %rdi
leaq 0x1526e(%rip), %rsi     # 0x23dc7
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0xb8(%rbp), %rsi
callq 0x3060
leaq -0xb8(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x22480
testb %al, %al
jne 0xeba8
movq %r13, %rdi
leaq 0x1524c(%rip), %rsi     # 0x23ddf
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xeb4f
movq %r13, %rdi
leaq 0x1524c(%rip), %rsi     # 0x23e04
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0xd8(%rbp), %rsi
callq 0x3060
leaq -0xd8(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x2238b
testb %al, %al
jne 0xec07
movq %r13, %rdi
leaq 0x1519f(%rip), %rsi     # 0x23d91
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xebae
movl -0x30(%rbp), %r14d
leaq -0x4a8(%rbp), %rdi
leaq -0x228(%rbp), %rsi
callq 0x3290
leaq -0x488(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x3290
leaq -0x468(%rbp), %rdi
leaq -0x1c8(%rbp), %rsi
callq 0x3290
leaq -0x448(%rbp), %rdi
leaq -0x1a8(%rbp), %rsi
callq 0x3290
leaq -0x428(%rbp), %rdi
leaq -0x148(%rbp), %rsi
callq 0x3290
leaq -0x408(%rbp), %rdi
leaq -0x128(%rbp), %rsi
callq 0x3290
leaq -0x3e8(%rbp), %rdi
leaq -0xf8(%rbp), %rsi
callq 0x3290
leaq -0x3c8(%rbp), %rdi
leaq -0x168(%rbp), %rsi
callq 0x3290
leaq -0x3a8(%rbp), %rdi
leaq -0x188(%rbp), %rsi
callq 0x3290
leaq -0x388(%rbp), %rdi
leaq -0xb8(%rbp), %rsi
callq 0x3290
movl %r14d, -0x34(%rbp)
leaq -0x4e8(%rbp), %r14
movq %r14, %rdi
leaq -0xd8(%rbp), %rsi
callq 0x3290
leaq -0x880(%rbp), %r15
movq %r15, %rdi
movl -0x34(%rbp), %esi
leaq -0x4a8(%rbp), %rdx
leaq -0x488(%rbp), %rcx
leaq -0x468(%rbp), %r8
movl -0x38(%rbp), %r9d
movsd -0x58(%rbp), %xmm0
pushq %r14
leaq -0x388(%rbp), %rax
pushq %rax
leaq -0x3a8(%rbp), %rax
pushq %rax
leaq -0x3c8(%rbp), %rax
pushq %rax
leaq -0x3e8(%rbp), %rax
pushq %rax
leaq -0x408(%rbp), %rax
pushq %rax
leaq -0x428(%rbp), %rax
pushq %rax
leaq -0x448(%rbp), %rax
pushq %rax
callq 0x5a46
addq $0x40, %rsp
movl -0x30(%rbp), %eax
movl %eax, -0x6f8(%rbp)
leaq -0x6f0(%rbp), %rdi
movq %r15, %rsi
callq 0x123e4
movq -0x40(%rbp), %r14
movq %r14, %rdi
leaq -0x6f8(%rbp), %rsi
callq 0x12d0e
leaq -0x6f0(%rbp), %rdi
callq 0x5d30
leaq -0x880(%rbp), %rdi
callq 0x5d30
leaq -0x4e8(%rbp), %rdi
callq 0x3100
leaq -0x388(%rbp), %rdi
callq 0x3100
leaq -0x3a8(%rbp), %rdi
callq 0x3100
leaq -0x3c8(%rbp), %rdi
callq 0x3100
leaq -0x3e8(%rbp), %rdi
callq 0x3100
leaq -0x408(%rbp), %rdi
callq 0x3100
leaq -0x428(%rbp), %rdi
callq 0x3100
leaq -0x448(%rbp), %rdi
callq 0x3100
leaq -0x468(%rbp), %rdi
callq 0x3100
leaq -0x488(%rbp), %rdi
callq 0x3100
leaq -0x4a8(%rbp), %rdi
callq 0x3100
movq -0x50(%rbp), %rax
cmpq %rax, 0x28(%r14)
jne 0xf148
movq %r13, %rdi
leaq 0x14fef(%rip), %rsi     # 0x23e25
callq 0x31f0
movq %rax, %rdi
callq 0x3110
jmp 0xe4e4
movq -0x48(%rbp), %rax
movl 0x28(%rax), %eax
movq %rax, -0x50(%rbp)
movq %r13, %rdi
leaq 0x14ff6(%rip), %rsi     # 0x23e53
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0xb8(%rbp), %rsi
callq 0x3060
leaq -0xb8(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x22480
testb %al, %al
jne 0xeeac
movq %r13, %rdi
leaq 0x14f48(%rip), %rsi     # 0x23ddf
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xee53
movq %r13, %rdi
leaq 0x14f48(%rip), %rsi     # 0x23e04
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0xd8(%rbp), %rsi
callq 0x3060
leaq -0xd8(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x2238b
testb %al, %al
jne 0xef0b
movq %r13, %rdi
leaq 0x14e9b(%rip), %rsi     # 0x23d91
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xeeb2
movl -0x30(%rbp), %r14d
leaq -0x368(%rbp), %rdi
leaq -0x228(%rbp), %rsi
callq 0x3290
leaq -0x348(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x3290
leaq -0x328(%rbp), %rdi
leaq -0x1c8(%rbp), %rsi
callq 0x3290
leaq -0x308(%rbp), %rdi
leaq -0x1a8(%rbp), %rsi
callq 0x3290
leaq -0x2e8(%rbp), %rdi
leaq -0x148(%rbp), %rsi
callq 0x3290
leaq -0x2c8(%rbp), %rdi
leaq -0x128(%rbp), %rsi
callq 0x3290
leaq -0x2a8(%rbp), %rdi
leaq -0xf8(%rbp), %rsi
callq 0x3290
leaq -0x288(%rbp), %rdi
leaq -0x168(%rbp), %rsi
callq 0x3290
leaq -0x268(%rbp), %rdi
leaq -0x188(%rbp), %rsi
callq 0x3290
leaq -0x248(%rbp), %rdi
leaq -0xb8(%rbp), %rsi
callq 0x3290
movl %r14d, -0x34(%rbp)
leaq -0x4c8(%rbp), %r15
movq %r15, %rdi
leaq -0xd8(%rbp), %rsi
callq 0x3290
leaq -0x880(%rbp), %r14
movq %r14, %rdi
movl -0x34(%rbp), %esi
leaq -0x368(%rbp), %rdx
leaq -0x348(%rbp), %rcx
leaq -0x328(%rbp), %r8
movl -0x38(%rbp), %r9d
movsd -0x58(%rbp), %xmm0
pushq %r15
leaq -0x248(%rbp), %rax
pushq %rax
leaq -0x268(%rbp), %rax
pushq %rax
leaq -0x288(%rbp), %rax
pushq %rax
leaq -0x2a8(%rbp), %rax
pushq %rax
leaq -0x2c8(%rbp), %rax
pushq %rax
leaq -0x2e8(%rbp), %rax
pushq %rax
leaq -0x308(%rbp), %rax
pushq %rax
callq 0x5d68
addq $0x40, %rsp
movl -0x30(%rbp), %eax
movl %eax, -0x6f8(%rbp)
leaq -0x6f0(%rbp), %rdi
movq %r14, %rsi
callq 0x1243c
movq -0x48(%rbp), %r14
movq %r14, %rdi
leaq -0x6f8(%rbp), %rsi
callq 0x12f34
leaq -0x6f0(%rbp), %rdi
callq 0x601a
leaq -0x880(%rbp), %rdi
callq 0x601a
leaq -0x4c8(%rbp), %rdi
callq 0x3100
leaq -0x248(%rbp), %rdi
callq 0x3100
leaq -0x268(%rbp), %rdi
callq 0x3100
leaq -0x288(%rbp), %rdi
callq 0x3100
leaq -0x2a8(%rbp), %rdi
callq 0x3100
leaq -0x2c8(%rbp), %rdi
callq 0x3100
leaq -0x2e8(%rbp), %rdi
callq 0x3100
leaq -0x308(%rbp), %rdi
callq 0x3100
leaq -0x328(%rbp), %rdi
callq 0x3100
leaq -0x348(%rbp), %rdi
callq 0x3100
leaq -0x368(%rbp), %rdi
callq 0x3100
movq -0x50(%rbp), %rax
cmpq %rax, 0x28(%r14)
jne 0xf148
movq %r13, %rdi
leaq 0x14cef(%rip), %rsi     # 0x23e25
callq 0x31f0
movq %rax, %rdi
callq 0x3110
jmp 0xe4e4
movq %r13, %rdi
leaq 0x14d1c(%rip), %rsi     # 0x23e6e
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
movq %r13, %rdi
leaq 0x14d1d(%rip), %rsi     # 0x23e8e
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rbx, %rdi
leaq -0x2a(%rbp), %rsi
callq 0x3280
cmpb $0x73, -0x2a(%rbp)
je 0xe49c
movq -0x40(%rbp), %r12
cmpq $0x0, 0x28(%r12)
movq -0x48(%rbp), %r15
je 0xf1f4
leaq 0x14e0e(%rip), %rsi     # 0x23fb9
leaq -0xc80(%rbp), %rdi
pushq $0x10
popq %rdx
callq 0x3040
movq 0x18(%r12), %r14
addq $0x8, %r12
leaq -0xc80(%rbp), %rbx
cmpq %r12, %r14
je 0xf1e8
leaq 0x28(%r14), %rsi
movq %rbx, %rdi
callq 0x82d3
movq %r14, %rdi
callq 0x3160
movq %rax, %r14
jmp 0xf1ca
leaq -0xc80(%rbp), %rdi
callq 0x32a0
cmpq $0x0, 0x28(%r15)
je 0xf24a
leaq 0x14dc9(%rip), %rsi     # 0x23fcb
leaq -0xa80(%rbp), %rdi
pushq $0x10
popq %rdx
callq 0x3040
movq 0x18(%r15), %r14
addq $0x8, %r15
leaq -0xa80(%rbp), %rbx
cmpq %r15, %r14
je 0xf23e
leaq 0x28(%r14), %rsi
movq %rbx, %rdi
callq 0x86cd
movq %r14, %rdi
callq 0x3160
movq %rax, %r14
jmp 0xf220
leaq -0xa80(%rbp), %rdi
callq 0x32a0
leaq -0xa80(%rbp), %rdi
callq 0x32e0
leaq -0xc80(%rbp), %rdi
callq 0x32e0
leaq -0x1e8(%rbp), %rdi
callq 0x3100
leaq -0x78(%rbp), %rdi
callq 0x3100
leaq -0x208(%rbp), %rdi
callq 0x3100
leaq -0x98(%rbp), %rdi
callq 0x3100
leaq -0x168(%rbp), %rdi
callq 0x3100
leaq -0xb8(%rbp), %rdi
callq 0x3100
leaq -0x188(%rbp), %rdi
callq 0x3100
leaq -0xd8(%rbp), %rdi
callq 0x3100
leaq -0xf8(%rbp), %rdi
callq 0x3100
leaq -0x128(%rbp), %rdi
callq 0x3100
leaq -0x148(%rbp), %rdi
callq 0x3100
leaq -0x1a8(%rbp), %rdi
callq 0x3100
leaq -0x1c8(%rbp), %rdi
callq 0x3100
leaq -0x228(%rbp), %rdi
callq 0x3100
addq $0xc58, %rsp            # imm = 0xC58
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
jmp 0xf587
movq %rax, %rbx
jmp 0xf593
jmp 0xf578
jmp 0xf578
jmp 0xf578
jmp 0xf578
movq %rax, %rbx
jmp 0xf507
movq %rax, %rbx
jmp 0xf428
jmp 0xf578
movq %rax, %rbx
jmp 0xf404
movq %rax, %rbx
jmp 0xf410
movq %rax, %rbx
jmp 0xf41c
movq %rax, %rbx
jmp 0xf3d4
movq %rax, %rbx
jmp 0xf3e0
movq %rax, %rbx
jmp 0xf3ec
movq %rax, %rbx
jmp 0xf3f8
movq %rax, %rbx
jmp 0xf4fb
movq %rax, %rbx
leaq -0x6f0(%rbp), %rdi
callq 0x5d30
jmp 0xf39a
movq %rax, %rbx
leaq -0x880(%rbp), %rdi
callq 0x5d30
jmp 0xf3ab
movq %rax, %rbx
leaq -0x4e8(%rbp), %rdi
callq 0x3100
jmp 0xf3bc
movq %rax, %rbx
leaq -0x388(%rbp), %rdi
callq 0x3100
leaq -0x3a8(%rbp), %rdi
callq 0x3100
leaq -0x3c8(%rbp), %rdi
callq 0x3100
leaq -0x3e8(%rbp), %rdi
callq 0x3100
leaq -0x408(%rbp), %rdi
callq 0x3100
leaq -0x428(%rbp), %rdi
callq 0x3100
leaq -0x448(%rbp), %rdi
callq 0x3100
leaq -0x468(%rbp), %rdi
callq 0x3100
leaq -0x488(%rbp), %rdi
callq 0x3100
leaq -0x4a8(%rbp), %rdi
jmp 0xf553
movq %rax, %rbx
jmp 0xf3c8
movq %rax, %rbx
jmp 0xf4ef
movq %rax, %rbx
jmp 0xf4e3
movq %rax, %rbx
jmp 0xf4d7
movq %rax, %rbx
jmp 0xf4cb
movq %rax, %rbx
jmp 0xf4bf
movq %rax, %rbx
jmp 0xf4b3
movq %rax, %rbx
jmp 0xf4a7
movq %rax, %rbx
jmp 0xf49b
movq %rax, %rbx
jmp 0xf48f
movq %rax, %rbx
jmp 0xf483
movq %rax, %rbx
leaq -0x6f0(%rbp), %rdi
callq 0x601a
leaq -0x880(%rbp), %rdi
callq 0x601a
leaq -0x4c8(%rbp), %rdi
callq 0x3100
leaq -0x248(%rbp), %rdi
callq 0x3100
leaq -0x268(%rbp), %rdi
callq 0x3100
leaq -0x288(%rbp), %rdi
callq 0x3100
leaq -0x2a8(%rbp), %rdi
callq 0x3100
leaq -0x2c8(%rbp), %rdi
callq 0x3100
leaq -0x2e8(%rbp), %rdi
callq 0x3100
leaq -0x308(%rbp), %rdi
callq 0x3100
leaq -0x328(%rbp), %rdi
callq 0x3100
leaq -0x348(%rbp), %rdi
callq 0x3100
leaq -0x368(%rbp), %rdi
jmp 0xf553
jmp 0xf578
jmp 0xf578
movq %rax, %rbx
leaq -0x6f8(%rbp), %rdi
callq 0x3170
jmp 0xf57b
movq %rax, %rbx
leaq -0x508(%rbp), %rdi
jmp 0xf553
movq %rax, %rbx
leaq -0x568(%rbp), %rdi
jmp 0xf553
movq %rax, %rbx
leaq -0x528(%rbp), %rdi
jmp 0xf553
movq %rax, %rbx
leaq -0x548(%rbp), %rdi
callq 0x3100
jmp 0xf57b
jmp 0xf578
jmp 0xf578
jmp 0xf578
jmp 0xf578
jmp 0xf578
jmp 0xf578
jmp 0xf578
jmp 0xf578
jmp 0xf578
jmp 0xf578
jmp 0xf578
jmp 0xf578
jmp 0xf578
jmp 0xf578
jmp 0xf578
movq %rax, %rbx
leaq -0xa80(%rbp), %rdi
callq 0x32e0
leaq -0xc80(%rbp), %rdi
callq 0x32e0
leaq -0x1e8(%rbp), %rdi
callq 0x3100
leaq -0x78(%rbp), %rdi
callq 0x3100
leaq -0x208(%rbp), %rdi
callq 0x3100
leaq -0x98(%rbp), %rdi
callq 0x3100
leaq -0x168(%rbp), %rdi
callq 0x3100
leaq -0xb8(%rbp), %rdi
callq 0x3100
leaq -0x188(%rbp), %rdi
callq 0x3100
leaq -0xd8(%rbp), %rdi
callq 0x3100
leaq -0xf8(%rbp), %rdi
callq 0x3100
leaq -0x128(%rbp), %rdi
callq 0x3100
leaq -0x148(%rbp), %rdi
callq 0x3100
leaq -0x1a8(%rbp), %rdi
callq 0x3100
leaq -0x1c8(%rbp), %rdi
callq 0x3100
leaq -0x228(%rbp), %rdi
callq 0x3100
movq %rbx, %rdi
callq 0x3370