// File: millanek[P]Dsuite/./Dsuite_common.h
// Function: SetInformation::SetInformation(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, int)
SetInformation(const string& setsFileName, const int minPopulations, const int outgroupRequirement) {
        
        std::ifstream* setsFile = new std::ifstream(setsFileName.c_str());
        assertFileOpen(*setsFile, setsFileName);
        
        string line; int l = 0; bool outgroupSpecified = false;
        while (getline(*setsFile, line)) {
            line.erase(std::remove(line.begin(), line.end(), '\r'), line.end()); // Deal with any left over \r from files prepared on Windows
            
            l++; if (line == "") lineEmptyError(setsFileName,l);
            
            std::vector<string> ID_Pop = split(line, '\t');
            
            if (ID_Pop.size() != 2) wrongNumberOfColumnsError(setsFileName,l);
            if (ID_Pop[1] == "Outgroup") { outgroupSpecified = true; }
            
            popToIDsMap[ID_Pop[1]].push_back(ID_Pop[0]);
            IDsToPopMap[ID_Pop[0]] = ID_Pop[1];
        }
        
        for(std::map<string,std::vector<string>>::iterator it = popToIDsMap.begin(); it != popToIDsMap.end(); ++it) {
            if ((it->first) != "Outgroup" && it->first != "xxx") {
                populations.push_back(it->first);
            }
        } std::cout << "There are " << populations.size() << " sets (populations/species) excluding the Outgroup" << std::endl;
        
        if (populations.size() < minPopulations) notEnoughPopulationsError(minPopulations);
        
        // Provide error/warning messages depending on which analysis is run and the presence/absence of Outgroup in the SETS file
        if (outgroupRequirement == OutgroupNotRequired && outgroupSpecified) outgroupNotUsedInQuartetsWarning(setsFileName);
        if (outgroupRequirement == OutgroupRequired && !outgroupSpecified) outgroupNeededError(setsFileName);
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x180, %rsp            # imm = 0x180
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movl %ecx, -0x18(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0xd8(%rbp)
movq %rdi, %rax
movq %rax, -0xf8(%rbp)
callq 0x11d80
movq -0xd8(%rbp), %rdi
addq $0x18, %rdi
movq %rdi, -0xf0(%rbp)
callq 0x22000
movq -0xd8(%rbp), %rdi
addq $0x48, %rdi
movq %rdi, -0xe8(%rbp)
callq 0x22020
movq -0xd8(%rbp), %rdi
addq $0x78, %rdi
movq %rdi, -0xe0(%rbp)
callq 0x22040
movq -0xd8(%rbp), %rdi
addq $0xa8, %rdi
movq %rdi, -0xd0(%rbp)
callq 0x22060
movl $0x208, %edi            # imm = 0x208
callq 0x85a0
movq %rax, -0xc8(%rbp)
jmp 0x1fc95
movq -0x10(%rbp), %rdi
callq 0x8230
movq -0xc8(%rbp), %rdi
movq %rax, %rsi
movl $0x8, %edx
callq 0x8ad0
jmp 0x1fcb4
movq -0xc8(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xfd90
jmp 0x1fcce
leaq -0x50(%rbp), %rdi
callq 0x87d0
movl $0x0, -0x54(%rbp)
movb $0x0, -0x55(%rbp)
movq -0x20(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x80d0
movq %rax, -0x100(%rbp)
jmp 0x1fcf8
movq -0x100(%rbp), %rdi
movq (%rdi), %rax
movq -0x18(%rax), %rax
addq %rax, %rdi
callq 0x8710
movb %al, -0x101(%rbp)
jmp 0x1fd16
movb -0x101(%rbp), %al
testb $0x1, %al
jne 0x1fd25
jmp 0x1ffc3
leaq -0x50(%rbp), %rdi
movq %rdi, -0x118(%rbp)
callq 0x84f0
movq -0x118(%rbp), %rdi
movq %rax, -0x70(%rbp)
callq 0x8330
movq %rax, -0x78(%rbp)
movb $0xd, -0x79(%rbp)
movq -0x70(%rbp), %rdi
movq -0x78(%rbp), %rsi
leaq -0x79(%rbp), %rdx
callq 0x20210
movq %rax, -0x110(%rbp)
jmp 0x1fd67
movq -0x110(%rbp), %rax
movq %rax, -0x68(%rbp)
leaq -0x60(%rbp), %rdi
leaq -0x68(%rbp), %rsi
callq 0x20260
leaq -0x50(%rbp), %rdi
movq %rdi, -0x128(%rbp)
callq 0x8330
movq %rax, -0x90(%rbp)
leaq -0x88(%rbp), %rdi
leaq -0x90(%rbp), %rsi
callq 0x20260
movq -0x128(%rbp), %rdi
movq -0x60(%rbp), %rsi
movq -0x88(%rbp), %rdx
callq 0x80f0
movq %rax, -0x120(%rbp)
jmp 0x1fdc9
movq -0x120(%rbp), %rax
movq %rax, -0x98(%rbp)
movl -0x54(%rbp), %eax
incl %eax
movl %eax, -0x54(%rbp)
leaq 0x6b583(%rip), %rsi     # 0x8b369
leaq -0x50(%rbp), %rdi
callq 0x9ab0
movb %al, -0x129(%rbp)
jmp 0x1fdf7
movb -0x129(%rbp), %al
testb $0x1, %al
jne 0x1fe03
jmp 0x1fe57
movq -0x10(%rbp), %rdi
movl -0x54(%rbp), %esi
callq 0x22080
jmp 0x1fe11
jmp 0x1fe57
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x2017c
movq -0xc8(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
movl $0x208, %esi            # imm = 0x208
callq 0x85b0
jmp 0x2017c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x20173
leaq -0xb0(%rbp), %rdi
leaq -0x50(%rbp), %rsi
movl $0x9, %edx
callq 0xaef0
jmp 0x1fe6e
leaq -0xb0(%rbp), %rdi
callq 0x10740
cmpq $0x2, %rax
je 0x1fead
movq -0x10(%rbp), %rdi
movl -0x54(%rbp), %esi
callq 0x22120
jmp 0x1fe8e
jmp 0x1fead
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0xb0(%rbp), %rdi
callq 0x10760
jmp 0x20173
leaq -0xb0(%rbp), %rdi
movl $0x1, %esi
callq 0x10b10
movq %rax, %rdi
leaq 0x68bda(%rip), %rsi     # 0x88aa2
callq 0x9ab0
movb %al, -0x12a(%rbp)
jmp 0x1fed5
movb -0x12a(%rbp), %al
testb $0x1, %al
jne 0x1fee1
jmp 0x1fee5
movb $0x1, -0x55(%rbp)
movq -0xf8(%rbp), %rax
addq $0x48, %rax
movq %rax, -0x140(%rbp)
leaq -0xb0(%rbp), %rdi
movl $0x1, %esi
callq 0x10b10
movq -0x140(%rbp), %rdi
movq %rax, %rsi
callq 0x221c0
movq %rax, -0x138(%rbp)
jmp 0x1ff20
xorl %eax, %eax
movl %eax, %esi
leaq -0xb0(%rbp), %rdi
callq 0x10b10
movq -0x138(%rbp), %rdi
movq %rax, %rsi
callq 0x11d10
jmp 0x1ff41
leaq -0xb0(%rbp), %rdi
movq %rdi, -0x160(%rbp)
movl $0x1, %esi
callq 0x10b10
movq -0x160(%rbp), %rdi
movq %rax, %rcx
movq -0xf8(%rbp), %rax
movq %rcx, -0x158(%rbp)
addq $0x18, %rax
movq %rax, -0x150(%rbp)
xorl %eax, %eax
movl %eax, %esi
callq 0x10b10
movq -0x150(%rbp), %rdi
movq %rax, %rsi
callq 0x222a0
movq %rax, -0x148(%rbp)
jmp 0x1ff9d
movq -0x158(%rbp), %rsi
movq -0x148(%rbp), %rdi
callq 0x8070
jmp 0x1ffb2
leaq -0xb0(%rbp), %rdi
callq 0x10760
jmp 0x1fce2
movq -0xf8(%rbp), %rdi
addq $0x48, %rdi
callq 0x22380
movq %rax, -0xb8(%rbp)
movq -0xf8(%rbp), %rdi
addq $0x48, %rdi
callq 0x223e0
movq %rax, -0xc0(%rbp)
leaq -0xb8(%rbp), %rdi
leaq -0xc0(%rbp), %rsi
callq 0x223b0
testb $0x1, %al
jne 0x2000d
jmp 0x2009d
leaq -0xb8(%rbp), %rdi
callq 0x22440
movq %rax, %rdi
leaq 0x68a7f(%rip), %rsi     # 0x88aa2
callq 0x22410
movb %al, -0x161(%rbp)
jmp 0x20030
movb -0x161(%rbp), %al
testb $0x1, %al
jne 0x2003c
jmp 0x2008a
leaq -0xb8(%rbp), %rdi
callq 0x22440
movq %rax, %rdi
leaq 0x68a17(%rip), %rsi     # 0x88a69
callq 0x22410
movb %al, -0x162(%rbp)
jmp 0x2005f
movb -0x162(%rbp), %al
testb $0x1, %al
jne 0x2006b
jmp 0x2008a
leaq -0xb8(%rbp), %rdi
callq 0x22440
movq -0xf8(%rbp), %rdi
movq %rax, %rsi
callq 0x11d10
jmp 0x20088
jmp 0x2008a
jmp 0x2008c
leaq -0xb8(%rbp), %rdi
callq 0x22460
jmp 0x1ffda
movq 0x9ef04(%rip), %rdi     # 0xbefa8
leaq 0x689c2(%rip), %rsi     # 0x88a6d
callq 0x8590
movq %rax, -0x170(%rbp)
jmp 0x200b9
movq -0xf8(%rbp), %rdi
callq 0x10740
movq -0x170(%rbp), %rdi
movq %rax, %rsi
callq 0x8110
movq %rax, -0x178(%rbp)
jmp 0x200dd
movq -0x178(%rbp), %rdi
leaq 0x6898d(%rip), %rsi     # 0x88a78
callq 0x8590
movq %rax, -0x180(%rbp)
jmp 0x200f9
movq -0x180(%rbp), %rdi
movq 0x9ee59(%rip), %rsi     # 0xbef60
callq 0x85f0
jmp 0x2010e
movq -0xf8(%rbp), %rdi
callq 0x10740
movslq -0x14(%rbp), %rcx
cmpq %rcx, %rax
jae 0x2012f
movl -0x14(%rbp), %edi
callq 0x22490
jmp 0x2012d
jmp 0x2012f
cmpl $0x0, -0x18(%rbp)
jne 0x20148
testb $0x1, -0x55(%rbp)
je 0x20148
movq -0x10(%rbp), %rdi
callq 0x224f0
jmp 0x20146
jmp 0x20148
cmpl $0x1, -0x18(%rbp)
jne 0x20161
testb $0x1, -0x55(%rbp)
jne 0x20161
movq -0x10(%rbp), %rdi
callq 0x22540
jmp 0x2015f
jmp 0x20161
leaq -0x50(%rbp), %rdi
callq 0x8c08
addq $0x180, %rsp            # imm = 0x180
popq %rbp
retq
leaq -0x50(%rbp), %rdi
callq 0x8c08
movq -0xd0(%rbp), %rdi
callq 0x225a0
movq -0xe0(%rbp), %rdi
callq 0x225c0
movq -0xe8(%rbp), %rdi
callq 0x225e0
movq -0xf0(%rbp), %rdi
callq 0x22600
movq -0xd8(%rbp), %rdi
callq 0x10760
movq -0x28(%rbp), %rdi
callq 0x8a50
nopw %cs:(%rax,%rax)
nopl (%rax,%rax)