// File: /workspace/github_cpp_makefile_star2_O1/atfrank[P]PCASA/lib/Select.cpp
// Function: Select::recursiveDescentParser(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::vector<Atom*, std::allocator<Atom*>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)
std::vector<Atom *> Select::recursiveDescentParser (const std::string &str, const std::vector<Atom *> &ref, const std::string &group){
  std::vector<Atom *> cmpCurr, cmpNext;
  std::vector<Atom *> out;
  std::vector<Atom *>::iterator it;
  std::vector<Atom *>::const_iterator iter;
  std::string curr, next, start, end;
  size_t pos;
  double angstrom;

  //For memory efficiency, always parse "next" first!
  if (str.length() == 0){
    return ref;
  }
  else if ((pos=str.find("&")) != std::string::npos){
    //Logical AND between expressions: A:1-10.CA&A:5-15.CA = A:5-10.CA
    out.clear();
    next=str.substr(pos+1, std::string::npos);
    cmpNext=Select::recursiveDescentParser(next, ref, group);
    if (cmpNext.size() == 0){
//      std::cerr << std::endl << "Warning: Selection \"";
//      std::cerr << next << "\" did not match any atoms";
//      std::cerr << std::endl << std::endl;
      return out;
    }
    std::sort(cmpNext.begin(), cmpNext.end());    

    curr=str.substr(0, pos);
    cmpCurr=Select::recursiveDescentParser(curr, ref, group);
    if (cmpCurr.size() == 0){
      return out;
    }
    std::sort(cmpCurr.begin(), cmpCurr.end());

    std::set_intersection(cmpCurr.begin(), cmpCurr.end(), cmpNext.begin(), cmpNext.end(), back_inserter(out));
  }
  else if ((pos=str.find("_")) != std::string::npos){
    //Logical OR between expressions: A:1-5.CA_B:10-15.CA
    next=str.substr(pos+1, std::string::npos);
    cmpNext=Select::recursiveDescentParser(next, ref, group);
    if (cmpNext.size() == 0){
//      std::cerr << std::endl << "Warning: Selection \"";
//      std::cerr << next << "\" did not match any atoms";
//      std::cerr << std::endl << std::endl;
    }
    std::sort(cmpNext.begin(), cmpNext.end());

    curr=str.substr(0, pos);
    cmpCurr=Select::recursiveDescentParser(curr, ref, group);
    std::sort(cmpCurr.begin(), cmpCurr.end());

    out.resize(cmpCurr.size()+cmpNext.size());
    it=std::set_union(cmpCurr.begin(), cmpCurr.end(), cmpNext.begin(), cmpNext.end(), out.begin());
    out.resize(it-out.begin());

    it=std::unique(out.begin(), out.end());
    out.resize(std::distance(out.begin(),it));
  }
  else if ((pos=str.find("!")) == 0){
    //Expression negation: !A:1-5.CA
    curr=str.substr(pos+1, std::string::npos);
    cmpCurr=Select::recursiveDescentParser(curr, ref, group);
    std::sort(cmpCurr.begin(), cmpCurr.end());

    out.clear();
    std::set_difference(ref.begin(), ref.end(), cmpCurr.begin(), cmpCurr.end(), back_inserter(out));
  }
  else if ((pos=str.find_last_of("~#$")) != std::string::npos){
    //Around (~), Expand (#), By Residue ($)

    //N Angstroms around selection X. The final selection does NOT include X
    //A:10+20.CA~1.5

    //Expand selection X by N Angstroms. The final selection includes X
    //A:10+20.CA#2

    //By residue
    //A:10+20.CA$

    //Around, Expand, and By Residue can be chained together
    //A:10+20.CA~1.5#2$

    out.clear();

    next=str.substr(pos+1, std::string::npos);
    std::stringstream(next) >> angstrom;

    if (pos > 0){
      curr=str.substr(0, pos);
      cmpCurr=Select::recursiveDescentParser(curr, ref, group);
      if (cmpCurr.size() == 0){
        return out;
      }
      else if (angstrom <= 0.0){
        return out;
      }
      else{
        //Compute pairwise distances
        if (str.substr(pos, 1).compare("~") == 0){
          for (it=cmpCurr.begin(); it != cmpCurr.end(); ++it){
            for (iter=ref.begin(); iter != ref.end(); ++iter){
              //Distance calculation
              if ((*it) != (*iter) && Analyze::distance((*it)->getCoor() , (*iter)->getCoor()) <= angstrom){
                //out.push_back((*iter));
                cmpNext.push_back((*iter));
              } 
            }
          }
          //Sort, remove duplicates, and find difference
          std::sort(cmpNext.begin(), cmpNext.end());
          cmpNext.erase(unique(cmpNext.begin(), cmpNext.end()), cmpNext.end());
          std::set_difference(cmpNext.begin(), cmpNext.end(), cmpCurr.begin(), cmpCurr.end(), back_inserter(out));
        }
        else if (str.substr(pos, 1).compare("#") == 0){
          for (it=cmpCurr.begin(); it != cmpCurr.end(); ++it){
            for (iter=ref.begin(); iter != ref.end(); ++iter){
              //Distance calculation
              if (Analyze::distance((*it)->getCoor() , (*iter)->getCoor()) <= angstrom){
                out.push_back((*iter));
              }
            }
          }
          //Sort and remove duplicates
          std::sort(out.begin(), out.end());
          out.erase(unique(out.begin(), out.end()), out.end());
        }
        else if (str.substr(pos, 1).compare("$") == 0){
          for (it=cmpCurr.begin(); it != cmpCurr.end(); ++it){
            out.insert(out.end(), (*it)->getResidue()->getAtmVec().begin(), (*it)->getResidue()->getAtmVec().end());
          }
          //Sort and remove duplicates
          std::sort(out.begin(), out.end());
          out.erase(unique(out.begin(), out.end()), out.end());
        }
        else{
          //Do Nothing
        }
        std::sort(out.begin(), out.end());
        return out;
      }
    }
    else{
      return out;
    }
  }
  else if ((pos=str.find(":")) != std::string::npos){
    //Logical AND between Chains and Residues: A:GLY.
    next=str.substr(pos+1, std::string::npos);
    cmpNext=Select::recursiveDescentParser(next, ref, group);
    std::sort(cmpNext.begin(), cmpNext.end());

    if (pos > 0){
      curr=str.substr(0, pos);
      cmpCurr=Select::recursiveDescentParser(curr, ref, "chain");
    }
    else{
      cmpCurr=ref;
    }
    std::sort(cmpCurr.begin(), cmpCurr.end());

    out.clear();
    std::set_intersection(cmpCurr.begin(), cmpCurr.end(), cmpNext.begin(), cmpNext.end(), back_inserter(out));
  }
  else if ((pos=str.find(".")) != std::string::npos && group.compare("atom") != 0){
    //Logical AND between Residues and Atoms: :GLY.CA
    out.clear();
    next=str.substr(pos+1, std::string::npos);
    cmpNext=Select::recursiveDescentParser(next, ref, "atom");
    if (cmpNext.size() == 0){
      return out;
    }
    std::sort(cmpNext.begin(), cmpNext.end());

    if (pos > 0){
      curr=str.substr(0, pos);
      cmpCurr=Select::recursiveDescentParser(curr, ref, "residue");
      if (cmpCurr.size() == 0){
        return out;
      }
    }
    else{
      cmpCurr=ref;
    }
    std::sort(cmpCurr.begin(), cmpCurr.end());

    std::set_intersection(cmpCurr.begin(), cmpCurr.end(), cmpNext.begin(), cmpNext.end(), back_inserter(out));
  }
  else if ((pos=str.find("+")) != std::string::npos){
    //Logical OR between Chains, or between Residues, or between Atoms: 
    //A+B:., :GLY+ALA., :1+2+3., :.CA+CB+C+N
    next=str.substr(pos+1, std::string::npos);
    cmpNext=Select::recursiveDescentParser(next, ref, group);
    std::sort(cmpNext.begin(), cmpNext.end());

    curr=str.substr(0, pos);
    cmpCurr=Select::recursiveDescentParser(curr, ref, group);
    std::sort(cmpCurr.begin(), cmpCurr.end());

    out.resize(cmpCurr.size()+cmpNext.size());
    it=std::set_union(cmpCurr.begin(), cmpCurr.end(), cmpNext.begin(), cmpNext.end(), out.begin());
    out.resize(it-out.begin());

    it=std::unique(out.begin(), out.end());
    out.resize(std::distance(out.begin(),it));
  }
  else if ((pos=str.find("/")) != std::string::npos){
    //Logical AND between Chains, or between Residues, or between Atoms:
    //A/B:., :GLY/ALA., :1/2/3., :.CA/CB/C/N
    out.clear();
    next=str.substr(pos+1, std::string::npos);
    cmpNext=Select::recursiveDescentParser(next, ref, group);
    if (cmpNext.size() == 0){
      return out;
    }
    std::sort(cmpNext.begin(), cmpNext.end());

    curr=str.substr(0, pos);
    cmpCurr=Select::recursiveDescentParser(curr, ref, group);
    if (cmpCurr.size() == 0){
      return out;
    }
    std::sort(cmpCurr.begin(), cmpCurr.end());

    std::set_intersection(cmpCurr.begin(), cmpCurr.end(), cmpNext.begin(), cmpNext.end(), back_inserter(out));
  }
  else if ((pos=str.find("-")) != std::string::npos){
    //Residue identifier range: :1-10.
    start=str.substr(0, pos);
    end=str.substr(pos+1, std::string::npos);
    if (Misc::isdigit(start) && Misc::isdigit(end)){
      out=Select::recursiveDescentParser(Misc::processRange(start, end), ref, group);
    }
    else{
      return ref;
    }
  }
  else if ((pos=str.find("^")) == 0){
    //Chain, Residue, or Atom negation: ^A:., :^GLY., :^2., :.^CA
    curr=str.substr(pos+1, std::string::npos);
    cmpCurr=Select::recursiveDescentParser(curr, ref, group);
    std::sort(cmpCurr.begin(), cmpCurr.end());

    out.clear();
    std::set_difference(ref.begin(), ref.end(), cmpCurr.begin(), cmpCurr.end(), back_inserter(out));
  }
  else if (selKeysRes.find(str) != selKeysRes.end() && group.compare("residue") == 0){
    out.clear();
    if (selKeysRes[str].length() > 0){
      out=Select::recursiveDescentParser(selKeysRes[str], ref, group);
    }
  }
  else if (selKeysAtm.find(str) != selKeysAtm.end() && group.compare("atom") == 0){
    out.clear();
    if (selKeysAtm[str].length() > 0){
      out=Select::recursiveDescentParser(selKeysAtm[str], ref, group);
    }
  }
  else{
    out.clear();
    if (group.compare("chain") == 0){
      for (iter=ref.begin(); iter != ref.end(); ++iter){
        if (str.compare((*iter)->getChainId()) == 0){
          out.push_back(*iter);
        }
        else if (str.compare((*iter)->getSegId()) == 0){
          out.push_back(*iter);
        }
        else{
          continue;
        }
      }
    }
    else if (group.compare("residue") == 0){
      int resnum;
      std::stringstream(str) >> resnum;
      bool digitFlag=Misc::isdigit(str);
      for (iter=ref.begin(); iter != ref.end(); ++iter){
        if (digitFlag){
          if (resnum == (*iter)->getResId()){
            out.push_back(*iter);
          }
          else{
            continue;
          }
        }
        else{
          if (str.compare((*iter)->getResName()) == 0){
            out.push_back(*iter);
          }
          else if (str.compare(Misc::trim((*iter)->getRecName())) == 0){
            out.push_back(*iter);
          }
          else{
            continue;
          }
        }
      }
    }
    else if (group.compare("atom") == 0){
      for (iter=ref.begin(); iter != ref.end(); ++iter){
        if (str.compare(Misc::trim((*iter)->getAtmName())) == 0){
          out.push_back(*iter);
        }
        else if (Misc::toupper(str).compare(Misc::trim(Misc::toupper((*iter)->getAtmType()))) == 0){
          out.push_back(*iter);
        }
        else{
          continue;
        }
      }
    }
    else{
      //Do Nothing
    }
  }

  return out;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x328, %rsp            # imm = 0x328
movq %r8, 0x60(%rsp)
movq %rcx, %r14
movq %rsi, 0x38(%rsp)
xorl %eax, %eax
movq %rax, 0x30(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0x20(%rsp)
movq %rax, 0x50(%rsp)
movapd %xmm0, 0x40(%rsp)
movq %rax, 0x10(%rsp)
movapd %xmm0, (%rsp)
leaq 0xa0(%rsp), %rcx
movq %rcx, -0x10(%rcx)
movq %rax, -0x8(%rcx)
movb %al, (%rcx)
leaq 0xc0(%rsp), %rcx
movq %rcx, -0x10(%rcx)
movq %rax, -0x8(%rcx)
movb %al, (%rcx)
leaq 0x298(%rsp), %rcx
movq %rcx, -0x10(%rcx)
movq %rax, -0x8(%rcx)
movb %al, (%rcx)
leaq 0x278(%rsp), %rcx
movq %rcx, -0x10(%rcx)
movq %rax, -0x8(%rcx)
movb %al, (%rcx)
cmpq %rax, 0x8(%rdx)
movq %rdi, 0x68(%rsp)
je 0x35a65
movq %rdx, %r15
leaq 0x9594(%rip), %rsi      # 0x3d907
movl $0x1, %ecx
movq %rdx, %rdi
xorl %edx, %edx
callq 0x4520
cmpq $-0x1, %rax
je 0x345e8
movq %rax, %rbp
movq (%rsp), %rax
cmpq %rax, 0x8(%rsp)
je 0x3439f
movq %rax, 0x8(%rsp)
leaq 0x1(%rbp), %rdx
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
movq $-0x1, %rcx
callq 0x4300
leaq 0xb0(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
leaq 0xe0(%rsp), %r13
cmpq %r13, %rdi
je 0x343f2
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
leaq 0xb0(%rsp), %rdx
movq 0x38(%rsp), %rsi
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq 0x40(%rsp), %rdi
movq 0x50(%rsp), %rsi
movapd 0xd0(%rsp), %xmm0
movapd %xmm0, 0x40(%rsp)
movq 0xe0(%rsp), %rax
movq %rax, 0x50(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0xd0(%rsp)
movq $0x0, 0xe0(%rsp)
testq %rdi, %rdi
je 0x34460
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x3447d
movq 0xe0(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x40(%rsp), %r12
movq 0x48(%rsp), %rbx
movq %rbx, %rax
subq %r12, %rax
je 0x348a7
sarq $0x3, %rax
bsrq %rax, %rdx
xorl $0x3f, %edx
addl %edx, %edx
xorq $0x7e, %rdx
movq %r12, %rdi
movq %rbx, %rsi
callq 0x36836
movq %r12, %rdi
movq %rbx, %rsi
callq 0x3691f
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4300
leaq 0x90(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
cmpq %r13, %rdi
je 0x344ff
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
leaq 0x90(%rsp), %rdx
movq 0x38(%rsp), %rsi
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq 0x20(%rsp), %rdi
movq 0x30(%rsp), %rsi
movapd 0xd0(%rsp), %xmm0
movapd %xmm0, 0x20(%rsp)
movq 0xe0(%rsp), %rax
movq %rax, 0x30(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0xd0(%rsp)
movq $0x0, 0xe0(%rsp)
testq %rdi, %rdi
je 0x3456d
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x3458a
movq 0xe0(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x20(%rsp), %r14
movq 0x28(%rsp), %rbx
movq %rbx, %rax
subq %r14, %rax
je 0x348a7
sarq $0x3, %rax
bsrq %rax, %rdx
xorl $0x3f, %edx
addl %edx, %edx
xorq $0x7e, %rdx
movq %r14, %rdi
movq %rbx, %rsi
callq 0x36836
movq %r14, %rdi
movq %rbx, %rsi
callq 0x3691f
movq 0x28(%rsp), %rsi
movq 0x20(%rsp), %rdi
movq 0x40(%rsp), %rdx
movq 0x48(%rsp), %rcx
movq %rsp, %r8
callq 0x36bb4
jmp 0x348a7
leaq 0x8d41(%rip), %rsi      # 0x3d330
movl $0x1, %ecx
movq %r15, %rdi
xorl %edx, %edx
callq 0x4520
cmpq $-0x1, %rax
je 0x348dc
movq %rax, %rbp
leaq 0x1(%rax), %rdx
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
movq $-0x1, %rcx
callq 0x4300
leaq 0xb0(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
leaq 0xe0(%rsp), %r13
cmpq %r13, %rdi
je 0x3465e
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
leaq 0xb0(%rsp), %rdx
movq 0x38(%rsp), %rsi
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq 0x40(%rsp), %rdi
movq 0x50(%rsp), %rsi
movapd 0xd0(%rsp), %xmm0
movapd %xmm0, 0x40(%rsp)
movq 0xe0(%rsp), %rax
movq %rax, 0x50(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0xd0(%rsp)
movq $0x0, 0xe0(%rsp)
testq %rdi, %rdi
je 0x346cc
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x346e9
movq 0xe0(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x40(%rsp), %r12
movq 0x48(%rsp), %rbx
cmpq %rbx, %r12
je 0x34725
movq %rbx, %rax
subq %r12, %rax
sarq $0x3, %rax
bsrq %rax, %rdx
xorl $0x3f, %edx
addl %edx, %edx
xorq $0x7e, %rdx
movq %r12, %rdi
movq %rbx, %rsi
callq 0x36836
movq %r12, %rdi
movq %rbx, %rsi
callq 0x3691f
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4300
leaq 0x90(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
cmpq %r13, %rdi
je 0x3476a
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
leaq 0x90(%rsp), %rdx
movq 0x38(%rsp), %rsi
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq 0x20(%rsp), %rdi
movq 0x30(%rsp), %rsi
movapd 0xd0(%rsp), %xmm0
movapd %xmm0, 0x20(%rsp)
movq 0xe0(%rsp), %rax
movq %rax, 0x30(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0xd0(%rsp)
movq $0x0, 0xe0(%rsp)
testq %rdi, %rdi
je 0x347d8
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x347f5
movq 0xe0(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x20(%rsp), %rbx
movq 0x28(%rsp), %r14
cmpq %r14, %rbx
je 0x34831
movq %r14, %rax
subq %rbx, %rax
sarq $0x3, %rax
bsrq %rax, %rdx
xorl $0x3f, %edx
addl %edx, %edx
xorq $0x7e, %rdx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x36836
movq %rbx, %rdi
movq %r14, %rsi
callq 0x3691f
movq 0x28(%rsp), %rax
subq 0x20(%rsp), %rax
sarq $0x3, %rax
movq 0x48(%rsp), %rsi
subq 0x40(%rsp), %rsi
sarq $0x3, %rsi
addq %rax, %rsi
movq %rsp, %rdi
callq 0x366ee
movq 0x20(%rsp), %rdi
movq 0x28(%rsp), %rsi
movq 0x40(%rsp), %rdx
movq 0x48(%rsp), %rcx
movq (%rsp), %r8
callq 0x36d3a
movq %rsp, %rdi
subq (%rdi), %rax
sarq $0x3, %rax
movq %rax, %rsi
callq 0x366ee
movq (%rsp), %rdi
movq 0x8(%rsp), %rsi
callq 0x36dd0
movq %rsp, %rdi
subq (%rdi), %rax
sarq $0x3, %rax
movq %rax, %rsi
callq 0x366ee
movq (%rsp), %rax
movq 0x68(%rsp), %rcx
movq %rax, (%rcx)
movq 0x8(%rsp), %rax
movq %rax, 0x8(%rcx)
movq 0x10(%rsp), %rax
movq %rax, 0x10(%rcx)
xorpd %xmm0, %xmm0
movapd %xmm0, (%rsp)
movq $0x0, 0x10(%rsp)
jmp 0x35a6d
leaq 0x8ea2(%rip), %rsi      # 0x3d785
movl $0x1, %ecx
movq %r15, %rdi
xorl %edx, %edx
callq 0x4520
testq %rax, %rax
je 0x34c3e
leaq 0x9007(%rip), %rsi      # 0x3d909
movl $0x3, %ecx
movq %r15, %rdi
movq $-0x1, %rdx
callq 0x45c0
cmpq $-0x1, %rax
je 0x34d87
movq %rax, %rbp
movq (%rsp), %rax
cmpq %rax, 0x8(%rsp)
je 0x34933
movq %rax, 0x8(%rsp)
leaq 0x1(%rbp), %rdx
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
movq $-0x1, %rcx
callq 0x4300
leaq 0xb0(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
leaq 0xe0(%rsp), %r13
cmpq %r13, %rdi
je 0x34986
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
leaq 0xb0(%rsp), %rsi
movl $0x18, %edx
callq 0x4490
leaq 0xd0(%rsp), %rdi
leaq 0x260(%rsp), %rsi
callq 0x41d0
movq 0x3bc5ec(%rip), %rsi    # 0x3f0fa8
leaq 0xd0(%rsp), %rdi
callq 0x4240
leaq 0x150(%rsp), %rdi
callq 0x4110
testq %rbp, %rbp
je 0x348a7
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4300
leaq 0x90(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
cmpq %r13, %rdi
je 0x34a24
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
leaq 0x90(%rsp), %rdx
movq 0x38(%rsp), %rsi
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq 0x20(%rsp), %rdi
movq 0x30(%rsp), %rsi
movapd 0xd0(%rsp), %xmm0
movapd %xmm0, 0x20(%rsp)
movq 0xe0(%rsp), %rax
movq %rax, 0x30(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0xd0(%rsp)
movq $0x0, 0xe0(%rsp)
testq %rdi, %rdi
je 0x34a92
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x34aaf
movq 0xe0(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x28(%rsp), %rax
cmpq 0x20(%rsp), %rax
je 0x348a7
xorpd %xmm0, %xmm0
ucomisd 0x260(%rsp), %xmm0
jae 0x348a7
leaq 0xd0(%rsp), %rdi
movl $0x1, %ecx
movq %r15, %rsi
movq %rbp, %rdx
callq 0x4300
leaq 0x8e1c(%rip), %rsi      # 0x3d90d
leaq 0xd0(%rsp), %r12
movq %r12, %rdi
callq 0x40e0
movl %eax, %ebx
movq (%r12), %rdi
cmpq %r13, %rdi
je 0x34b1c
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
testl %ebx, %ebx
je 0x354cc
leaq 0xd0(%rsp), %rdi
movl $0x1, %ecx
movq %r15, %rsi
movq %rbp, %rdx
callq 0x4300
leaq 0x8dcc(%rip), %rsi      # 0x3d90f
leaq 0xd0(%rsp), %r12
movq %r12, %rdi
callq 0x40e0
movl %eax, %ebx
movq (%r12), %rdi
cmpq %r13, %rdi
je 0x34b6e
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
testl %ebx, %ebx
je 0x357c9
leaq 0xd0(%rsp), %rdi
movl $0x1, %ecx
movq %r15, %rsi
movq %rbp, %rdx
callq 0x4300
leaq 0x8d76(%rip), %rsi      # 0x3d90b
leaq 0xd0(%rsp), %r14
movq %r14, %rdi
callq 0x40e0
movl %eax, %ebx
movq (%r14), %rdi
cmpq %r13, %rdi
je 0x34bbf
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
testl %ebx, %ebx
jne 0x35885
movq 0x20(%rsp), %r12
cmpq 0x28(%rsp), %r12
je 0x34c1d
movq %rsp, %r14
movq 0x8(%rsp), %r15
movq (%r12), %rdi
callq 0x14a86
movq %rax, %rdi
callq 0x2f880
movq (%rax), %rbx
movq (%r12), %rdi
callq 0x14a86
movq %rax, %rdi
callq 0x2f880
movq 0x8(%rax), %rcx
movq %r14, %rdi
movq %r15, %rsi
movq %rbx, %rdx
callq 0x36fe2
addq $0x8, %r12
cmpq 0x28(%rsp), %r12
jne 0x34bd6
movq (%rsp), %rdi
movq 0x8(%rsp), %rsi
callq 0x366b0
movq (%rsp), %rdi
movq 0x8(%rsp), %rsi
callq 0x36dd0
jmp 0x35863
leaq 0xd0(%rsp), %rdi
movl $0x1, %edx
movq %r15, %rsi
movq $-0x1, %rcx
callq 0x4300
leaq 0x90(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x34c92
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
leaq 0x90(%rsp), %rdx
movq 0x38(%rsp), %rsi
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq 0x20(%rsp), %rdi
movq 0x30(%rsp), %rsi
movapd 0xd0(%rsp), %xmm0
movapd %xmm0, 0x20(%rsp)
movq 0xe0(%rsp), %rax
movq %rax, 0x30(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0xd0(%rsp)
movq $0x0, 0xe0(%rsp)
testq %rdi, %rdi
je 0x34d00
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x34d1d
movq 0xe0(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x20(%rsp), %rbx
movq 0x28(%rsp), %r15
cmpq %r15, %rbx
je 0x34d59
movq %r15, %rax
subq %rbx, %rax
sarq $0x3, %rax
bsrq %rax, %rdx
xorl $0x3f, %edx
addl %edx, %edx
xorq $0x7e, %rdx
movq %rbx, %rdi
movq %r15, %rsi
callq 0x36836
movq %rbx, %rdi
movq %r15, %rsi
callq 0x3691f
movq (%rsp), %rax
cmpq %rax, 0x8(%rsp)
je 0x34d69
movq %rax, 0x8(%rsp)
movq (%r14), %rdi
movq 0x8(%r14), %rsi
movq 0x20(%rsp), %rdx
movq 0x28(%rsp), %rcx
movq %rsp, %r8
callq 0x36e29
jmp 0x348a7
leaq 0x74a5(%rip), %rsi      # 0x3c233
movl $0x1, %ecx
movq %r15, %rdi
xorl %edx, %edx
callq 0x4520
cmpq $-0x1, %rax
je 0x34fab
movq %rax, %rbp
leaq 0x1(%rax), %rdx
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
movq $-0x1, %rcx
callq 0x4300
leaq 0xb0(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
leaq 0xe0(%rsp), %r12
cmpq %r12, %rdi
je 0x34dfd
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
leaq 0xb0(%rsp), %rdx
movq 0x38(%rsp), %rsi
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq 0x40(%rsp), %rdi
movq 0x50(%rsp), %rsi
movapd 0xd0(%rsp), %xmm0
movapd %xmm0, 0x40(%rsp)
movq 0xe0(%rsp), %rax
movq %rax, 0x50(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0xd0(%rsp)
movq $0x0, 0xe0(%rsp)
testq %rdi, %rdi
je 0x34e6b
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x34e88
movq 0xe0(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x40(%rsp), %rdi
movq 0x48(%rsp), %rsi
callq 0x366b0
testq %rbp, %rbp
je 0x3523f
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4300
leaq 0x90(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
cmpq %r12, %rdi
je 0x34ee5
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
movq %r12, (%rdi)
leaq 0x8a1a(%rip), %rsi      # 0x3d911
leaq 0x8a18(%rip), %rdx      # 0x3d916
callq 0x6516
leaq 0x70(%rsp), %rdi
leaq 0x90(%rsp), %rdx
leaq 0xd0(%rsp), %r8
movq 0x38(%rsp), %rsi
movq %r14, %rcx
callq 0x342ce
movq 0x20(%rsp), %rdi
movq 0x30(%rsp), %rsi
movapd 0x70(%rsp), %xmm0
movapd %xmm0, 0x20(%rsp)
movq 0x80(%rsp), %rax
movq %rax, 0x30(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0x70(%rsp)
movq $0x0, 0x80(%rsp)
testq %rdi, %rdi
je 0x34f6b
subq %rdi, %rsi
callq 0x42e0
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x34f85
movq 0x80(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
cmpq %r12, %rdi
je 0x3524c
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
jmp 0x3524c
leaq 0x88ac(%rip), %rsi      # 0x3d85e
movl $0x1, %ecx
movq %r15, %rdi
xorl %edx, %edx
callq 0x4520
cmpq $-0x1, %rax
je 0x35274
movq %rax, %rbp
leaq 0x8942(%rip), %rsi      # 0x3d917
movq 0x60(%rsp), %rdi
callq 0x40e0
testl %eax, %eax
je 0x35274
movq (%rsp), %rax
cmpq %rax, 0x8(%rsp)
je 0x34ff7
movq %rax, 0x8(%rsp)
leaq 0x1(%rbp), %rdx
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
movq $-0x1, %rcx
callq 0x4300
leaq 0xb0(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
leaq 0xe0(%rsp), %r12
cmpq %r12, %rdi
je 0x3504a
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
movq %r12, (%rdi)
leaq 0x88bb(%rip), %rsi      # 0x3d917
leaq 0x88b8(%rip), %rdx      # 0x3d91b
callq 0x6516
leaq 0x70(%rsp), %rdi
leaq 0xb0(%rsp), %rdx
leaq 0xd0(%rsp), %r8
movq 0x38(%rsp), %rsi
movq %r14, %rcx
callq 0x342ce
movq 0x40(%rsp), %rdi
movq 0x50(%rsp), %rsi
movapd 0x70(%rsp), %xmm0
movapd %xmm0, 0x40(%rsp)
movq 0x80(%rsp), %rax
movq %rax, 0x50(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0x70(%rsp)
movq $0x0, 0x80(%rsp)
testq %rdi, %rdi
je 0x350d0
subq %rdi, %rsi
callq 0x42e0
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x350ea
movq 0x80(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
cmpq %r12, %rdi
je 0x35107
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0x40(%rsp), %rdi
movq 0x48(%rsp), %rsi
cmpq %rdi, %rsi
je 0x348a7
callq 0x366b0
testq %rbp, %rbp
je 0x35898
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4300
leaq 0x90(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
cmpq %r12, %rdi
je 0x3516d
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
movq %r12, (%rdi)
leaq 0x879d(%rip), %rsi      # 0x3d91c
leaq 0x879d(%rip), %rdx      # 0x3d923
callq 0x6516
leaq 0x70(%rsp), %rdi
leaq 0x90(%rsp), %rdx
leaq 0xd0(%rsp), %r8
movq 0x38(%rsp), %rsi
movq %r14, %rcx
callq 0x342ce
movq 0x20(%rsp), %rdi
movq 0x30(%rsp), %rsi
movapd 0x70(%rsp), %xmm0
movapd %xmm0, 0x20(%rsp)
movq 0x80(%rsp), %rax
movq %rax, 0x30(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0x70(%rsp)
movq $0x0, 0x80(%rsp)
testq %rdi, %rdi
je 0x351f3
subq %rdi, %rsi
callq 0x42e0
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x3520d
movq 0x80(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
cmpq %r12, %rdi
je 0x3522a
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0x28(%rsp), %rax
cmpq 0x20(%rsp), %rax
jne 0x358a5
jmp 0x348a7
leaq 0x20(%rsp), %rdi
movq %r14, %rsi
callq 0x15190
movq 0x20(%rsp), %rdi
movq 0x28(%rsp), %rsi
callq 0x366b0
movq (%rsp), %rax
cmpq %rax, 0x8(%rsp)
je 0x345c7
movq %rax, 0x8(%rsp)
jmp 0x345c7
leaq 0x73de(%rip), %rsi      # 0x3c659
movl $0x1, %ecx
movq %r15, %rdi
xorl %edx, %edx
callq 0x4520
cmpq $-0x1, %rax
je 0x355b3
movq %rax, %rbp
leaq 0x1(%rax), %rdx
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
movq $-0x1, %rcx
callq 0x4300
leaq 0xb0(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
leaq 0xe0(%rsp), %r12
cmpq %r12, %rdi
je 0x352ea
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
leaq 0xb0(%rsp), %rdx
movq 0x38(%rsp), %rsi
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq 0x40(%rsp), %rdi
movq 0x50(%rsp), %rsi
movapd 0xd0(%rsp), %xmm0
movapd %xmm0, 0x40(%rsp)
movq 0xe0(%rsp), %rax
movq %rax, 0x50(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0xd0(%rsp)
movq $0x0, 0xe0(%rsp)
testq %rdi, %rdi
je 0x35358
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x35375
movq 0xe0(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x40(%rsp), %rdi
movq 0x48(%rsp), %rsi
callq 0x366b0
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4300
leaq 0x90(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
cmpq %r12, %rdi
je 0x353c9
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
leaq 0x90(%rsp), %rdx
movq 0x38(%rsp), %rsi
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq 0x20(%rsp), %rdi
movq 0x30(%rsp), %rsi
movapd 0xd0(%rsp), %xmm0
movapd %xmm0, 0x20(%rsp)
movq 0xe0(%rsp), %rax
movq %rax, 0x30(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0xd0(%rsp)
movq $0x0, 0xe0(%rsp)
testq %rdi, %rdi
je 0x35437
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x35454
movq 0xe0(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x20(%rsp), %rdi
movq 0x28(%rsp), %rsi
callq 0x366b0
movq 0x28(%rsp), %rax
subq 0x20(%rsp), %rax
sarq $0x3, %rax
movq 0x48(%rsp), %rsi
subq 0x40(%rsp), %rsi
sarq $0x3, %rsi
addq %rax, %rsi
movq %rsp, %rdi
callq 0x366ee
movq 0x20(%rsp), %rdi
movq 0x28(%rsp), %rsi
movq 0x40(%rsp), %rdx
movq 0x48(%rsp), %rcx
movq (%rsp), %r8
callq 0x36d3a
movq %rsp, %rdi
subq (%rdi), %rax
sarq $0x3, %rax
movq %rax, %rsi
callq 0x366ee
movq (%rsp), %rdi
movq 0x8(%rsp), %rsi
callq 0x36dd0
jmp 0x34895
movq 0x20(%rsp), %r13
cmpq 0x28(%rsp), %r13
je 0x35552
leaq 0x40(%rsp), %r15
movq (%r14), %r12
cmpq 0x8(%r14), %r12
je 0x35547
movq (%r13), %rdi
cmpq (%r12), %rdi
je 0x35541
callq 0x14abe
movq %rax, %rbx
movq (%r12), %rdi
callq 0x14abe
movq %rbx, %rdi
movq %rax, %rsi
callq 0xdb04
movsd 0x260(%rsp), %xmm1
ucomisd %xmm0, %xmm1
jb 0x35541
movq 0x48(%rsp), %rsi
cmpq 0x50(%rsp), %rsi
je 0x35536
movq (%r12), %rax
movq %rax, (%rsi)
addq $0x8, 0x48(%rsp)
jmp 0x35541
movq %r15, %rdi
movq %r12, %rdx
callq 0x15282
addq $0x8, %r12
jmp 0x354e0
addq $0x8, %r13
cmpq 0x28(%rsp), %r13
jne 0x354dd
movq 0x40(%rsp), %rdi
movq 0x48(%rsp), %rsi
callq 0x366b0
movq 0x40(%rsp), %rdi
movq 0x48(%rsp), %rsi
callq 0x36dd0
movq 0x48(%rsp), %rcx
cmpq %rcx, %rax
je 0x35592
movq 0x48(%rsp), %rdx
movq %rdx, %rsi
subq %rcx, %rsi
addq %rsi, %rax
cmpq %rax, %rdx
je 0x35592
movq %rax, 0x48(%rsp)
movq 0x40(%rsp), %rdi
movq 0x48(%rsp), %rsi
movq 0x20(%rsp), %rdx
movq 0x28(%rsp), %rcx
movq %rsp, %r8
callq 0x36f05
jmp 0x35885
leaq 0x836a(%rip), %rsi      # 0x3d924
movl $0x1, %ecx
movq %r15, %rdi
xorl %edx, %edx
callq 0x4520
cmpq $-0x1, %rax
je 0x358b9
movq %rax, %rbp
movq (%rsp), %rax
cmpq %rax, 0x8(%rsp)
je 0x355e6
movq %rax, 0x8(%rsp)
leaq 0x1(%rbp), %rdx
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
movq $-0x1, %rcx
callq 0x4300
leaq 0xb0(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
leaq 0xe0(%rsp), %r12
cmpq %r12, %rdi
je 0x35639
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
leaq 0xb0(%rsp), %rdx
movq 0x38(%rsp), %rsi
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq 0x40(%rsp), %rdi
movq 0x50(%rsp), %rsi
movapd 0xd0(%rsp), %xmm0
movapd %xmm0, 0x40(%rsp)
movq 0xe0(%rsp), %rax
movq %rax, 0x50(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0xd0(%rsp)
movq $0x0, 0xe0(%rsp)
testq %rdi, %rdi
je 0x356a7
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x356c4
movq 0xe0(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x40(%rsp), %rdi
movq 0x48(%rsp), %rsi
cmpq %rdi, %rsi
je 0x348a7
callq 0x366b0
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4300
leaq 0x90(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
cmpq %r12, %rdi
je 0x35721
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
leaq 0x90(%rsp), %rdx
movq 0x38(%rsp), %rsi
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq 0x20(%rsp), %rdi
movq 0x30(%rsp), %rsi
movapd 0xd0(%rsp), %xmm0
movapd %xmm0, 0x20(%rsp)
movq 0xe0(%rsp), %rax
movq %rax, 0x30(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0xd0(%rsp)
movq $0x0, 0xe0(%rsp)
testq %rdi, %rdi
je 0x3578f
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x357ac
movq 0xe0(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x20(%rsp), %rdi
movq 0x28(%rsp), %rsi
cmpq %rdi, %rsi
je 0x348a7
callq 0x366b0
jmp 0x345c7
movq 0x20(%rsp), %r13
cmpq 0x28(%rsp), %r13
je 0x35847
movq %rsp, %r15
movq (%r14), %r12
cmpq 0x8(%r14), %r12
je 0x3583c
movq (%r13), %rdi
callq 0x14abe
movq %rax, %rbx
movq (%r12), %rdi
callq 0x14abe
movq %rbx, %rdi
movq %rax, %rsi
callq 0xdb04
movsd 0x260(%rsp), %xmm1
ucomisd %xmm0, %xmm1
jb 0x35836
movq 0x8(%rsp), %rsi
cmpq 0x10(%rsp), %rsi
je 0x3582b
movq (%r12), %rax
movq %rax, (%rsi)
addq $0x8, 0x8(%rsp)
jmp 0x35836
movq %r15, %rdi
movq %r12, %rdx
callq 0x15282
addq $0x8, %r12
jmp 0x357db
addq $0x8, %r13
cmpq 0x28(%rsp), %r13
jne 0x357d8
movq (%rsp), %rdi
movq 0x8(%rsp), %rsi
callq 0x366b0
movq (%rsp), %rdi
movq 0x8(%rsp), %rsi
callq 0x36dd0
movq 0x8(%rsp), %rcx
cmpq %rcx, %rax
je 0x35885
movq 0x8(%rsp), %rdx
movq %rdx, %rsi
subq %rcx, %rsi
addq %rsi, %rax
cmpq %rax, %rdx
je 0x35885
movq %rax, 0x8(%rsp)
movq (%rsp), %rdi
movq 0x8(%rsp), %rsi
callq 0x366b0
jmp 0x348a7
leaq 0x20(%rsp), %rdi
movq %r14, %rsi
callq 0x15190
movq 0x20(%rsp), %rdi
movq 0x28(%rsp), %rsi
callq 0x366b0
jmp 0x345c7
leaq 0x7b7a(%rip), %rsi      # 0x3d43a
movl $0x1, %ecx
movq %r15, %rdi
xorl %edx, %edx
callq 0x4520
cmpq $-0x1, %rax
je 0x35b5c
movq %rax, %rbp
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rax, %rcx
callq 0x4300
leaq 0x288(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
leaq 0xe0(%rsp), %r12
cmpq %r12, %rdi
je 0x35929
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
incq %rbp
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
movq %rbp, %rdx
movq $-0x1, %rcx
callq 0x4300
leaq 0x268(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
cmpq %r12, %rdi
je 0x35976
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0x288(%rsp), %rdi
callq 0x21d8e
testb %al, %al
movq 0x68(%rsp), %rdi
je 0x35a65
leaq 0x268(%rsp), %rdi
callq 0x21d8e
testb %al, %al
movq 0x68(%rsp), %rdi
je 0x35a65
leaq 0xd0(%rsp), %rdi
leaq 0x288(%rsp), %rsi
leaq 0x268(%rsp), %rdx
callq 0x21ffa
leaq 0x70(%rsp), %rdi
leaq 0xd0(%rsp), %rdx
movq 0x38(%rsp), %rsi
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq (%rsp), %rdi
movq 0x10(%rsp), %rsi
movapd 0x70(%rsp), %xmm0
movapd %xmm0, (%rsp)
movq 0x80(%rsp), %rax
movq %rax, 0x10(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0x70(%rsp)
movq $0x0, 0x80(%rsp)
testq %rdi, %rdi
je 0x35a2a
subq %rdi, %rsi
callq 0x42e0
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x35a44
movq 0x80(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
cmpq %r12, %rdi
je 0x348a7
movq 0xe0(%rsp), %rsi
incq %rsi
jmp 0x36081
movq %r14, %rsi
callq 0x27204
movq 0x268(%rsp), %rdi
leaq 0x278(%rsp), %rax
cmpq %rax, %rdi
je 0x35a92
movq 0x278(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0x288(%rsp), %rdi
leaq 0x298(%rsp), %rax
cmpq %rax, %rdi
je 0x35ab7
movq 0x298(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0xb0(%rsp), %rdi
leaq 0xc0(%rsp), %rax
cmpq %rax, %rdi
je 0x35adc
movq 0xc0(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0x90(%rsp), %rdi
leaq 0xa0(%rsp), %rax
cmpq %rax, %rdi
je 0x35b01
movq 0xa0(%rsp), %rsi
incq %rsi
callq 0x42e0
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x35b17
movq 0x10(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x40(%rsp), %rdi
testq %rdi, %rdi
je 0x35b2e
movq 0x50(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x20(%rsp), %rdi
testq %rdi, %rdi
je 0x35b45
movq 0x30(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x68(%rsp), %rax
addq $0x328, %rsp            # imm = 0x328
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0x7dc3(%rip), %rsi      # 0x3d926
movl $0x1, %ecx
movq %r15, %rdi
xorl %edx, %edx
callq 0x4520
testq %rax, %rax
je 0x35e29
movq 0x38(%rsp), %rbx
leaq 0x30(%rbx), %rbp
movq %rbp, %rdi
movq %r15, %rsi
callq 0x21aaa
leaq 0x38(%rbx), %rcx
cmpq %rcx, %rax
je 0x35bb1
leaq 0x7d7d(%rip), %rsi      # 0x3d91c
movq 0x60(%rsp), %rdi
callq 0x40e0
testl %eax, %eax
je 0x35f1c
movq 0x38(%rsp), %rbx
movq %rbx, %rdi
movq %r15, %rsi
callq 0x21aaa
leaq 0x8(%rbx), %rcx
cmpq %rcx, %rax
je 0x35be3
leaq 0x7d46(%rip), %rsi      # 0x3d917
movq 0x60(%rsp), %rdi
callq 0x40e0
testl %eax, %eax
je 0x35fc9
movq (%rsp), %rax
cmpq %rax, 0x8(%rsp)
je 0x35bf3
movq %rax, 0x8(%rsp)
leaq 0x7d17(%rip), %rsi      # 0x3d911
movq 0x60(%rsp), %rbx
movq %rbx, %rdi
callq 0x40e0
testl %eax, %eax
je 0x35f6f
leaq 0x7d06(%rip), %rsi      # 0x3d91c
movq %rbx, %rdi
callq 0x40e0
testl %eax, %eax
je 0x3608b
leaq 0x7cea(%rip), %rsi      # 0x3d917
movq 0x60(%rsp), %rdi
callq 0x40e0
testl %eax, %eax
jne 0x348a7
movq (%r14), %r12
cmpq 0x8(%r14), %r12
je 0x348a7
leaq 0xd0(%rsp), %rbp
movq (%r12), %rdi
callq 0x14a72
movq %rax, %rbx
leaq 0x2d8(%rsp), %rax
movq %rax, 0x2c8(%rsp)
leaq 0x2c8(%rsp), %r13
movq %r13, %rdi
leaq 0x7a1e(%rip), %rsi      # 0x3d6a0
leaq 0x7a18(%rip), %rdx      # 0x3d6a1
callq 0x6516
movq %rbp, %rdi
movq %rbx, %rsi
movq %r13, %rdx
callq 0x21f22
movq %r15, %rdi
movq %rbp, %rsi
callq 0x4050
movl %eax, %r13d
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x35ccf
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0x2c8(%rsp), %rdi
leaq 0x2d8(%rsp), %rax
cmpq %rax, %rdi
je 0x35cf4
movq 0x2d8(%rsp), %rsi
incq %rsi
callq 0x42e0
testl %r13d, %r13d
je 0x35e0b
movq %rbp, %rdi
movq %r15, %rsi
callq 0x22186
leaq 0x70(%rsp), %r13
movq (%r12), %rdi
callq 0x14a78
leaq 0x308(%rsp), %rdi
movq %rax, %rsi
callq 0x22186
leaq 0x2b8(%rsp), %rax
movq %rax, 0x2a8(%rsp)
leaq 0x2a8(%rsp), %rbx
movq %rbx, %rdi
leaq 0x7958(%rip), %rsi      # 0x3d6a0
leaq 0x7952(%rip), %rdx      # 0x3d6a1
callq 0x6516
movq %r13, %rdi
leaq 0x308(%rsp), %rsi
movq %rbx, %rdx
callq 0x21f22
movq %rbp, %rdi
movq %r13, %rsi
callq 0x4050
movl %eax, %r13d
movq 0x70(%rsp), %rdi
leaq 0x80(%rsp), %rax
cmpq %rax, %rdi
je 0x35d97
movq 0x80(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0x2a8(%rsp), %rdi
leaq 0x2b8(%rsp), %rax
cmpq %rax, %rdi
je 0x35dbc
movq 0x2b8(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0x308(%rsp), %rdi
leaq 0x318(%rsp), %rax
cmpq %rax, %rdi
je 0x35de1
movq 0x318(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x35e06
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
testl %r13d, %r13d
jne 0x35e16
movq %rsp, %rdi
movq %r12, %rsi
callq 0x36720
addq $0x8, %r12
cmpq 0x8(%r14), %r12
jne 0x35c54
jmp 0x348a7
leaq 0xd0(%rsp), %rdi
movl $0x1, %edx
movq %r15, %rsi
movq $-0x1, %rcx
callq 0x4300
leaq 0x90(%rsp), %rdi
leaq 0xd0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4370
movq (%rbx), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x35e7d
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
leaq 0xd0(%rsp), %rdi
leaq 0x90(%rsp), %rdx
movq 0x38(%rsp), %rsi
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq 0x20(%rsp), %rdi
movq 0x30(%rsp), %rsi
movapd 0xd0(%rsp), %xmm0
movapd %xmm0, 0x20(%rsp)
movq 0xe0(%rsp), %rax
movq %rax, 0x30(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0xd0(%rsp)
movq $0x0, 0xe0(%rsp)
testq %rdi, %rdi
je 0x35eeb
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x35f08
movq 0xe0(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x20(%rsp), %rdi
movq 0x28(%rsp), %rsi
callq 0x366b0
jmp 0x34d59
movq (%rsp), %rax
cmpq %rax, 0x8(%rsp)
je 0x35f2c
movq %rax, 0x8(%rsp)
movq %rbp, %rdi
movq %r15, %rsi
callq 0x3673e
cmpq $0x0, 0x8(%rax)
je 0x348a7
movq %rbp, %rdi
movq %r15, %rsi
callq 0x3673e
leaq 0xd0(%rsp), %rdi
movq 0x38(%rsp), %rsi
movq %rax, %rdx
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
jmp 0x3601b
movq (%r14), %r12
cmpq 0x8(%r14), %r12
je 0x348a7
movq %rsp, %r13
movq (%r12), %rdi
callq 0x14a9e
movq %r15, %rdi
movq %rax, %rsi
callq 0x4050
testl %eax, %eax
je 0x35faf
movq (%r12), %rdi
callq 0x14ade
movq %r15, %rdi
movq %rax, %rsi
callq 0x4050
testl %eax, %eax
jne 0x35fba
movq %r13, %rdi
movq %r12, %rsi
callq 0x36720
addq $0x8, %r12
cmpq 0x8(%r14), %r12
jne 0x35f7f
jmp 0x348a7
movq (%rsp), %rax
cmpq %rax, 0x8(%rsp)
je 0x35fd9
movq %rax, 0x8(%rsp)
movq 0x38(%rsp), %rdi
movq %r15, %rsi
callq 0x3673e
cmpq $0x0, 0x8(%rax)
je 0x348a7
movq 0x38(%rsp), %rdi
movq %r15, %rsi
callq 0x3673e
leaq 0xd0(%rsp), %rdi
movq 0x38(%rsp), %rsi
movq %rax, %rdx
movq %r14, %rcx
movq 0x60(%rsp), %r8
callq 0x342ce
movq (%rsp), %rdi
movq 0x10(%rsp), %rsi
movapd 0xd0(%rsp), %xmm0
movapd %xmm0, (%rsp)
movq 0xe0(%rsp), %rax
movq %rax, 0x10(%rsp)
xorpd %xmm0, %xmm0
movapd %xmm0, 0xd0(%rsp)
movq $0x0, 0xe0(%rsp)
testq %rdi, %rdi
je 0x36065
subq %rdi, %rsi
callq 0x42e0
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x348a7
movq 0xe0(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
jmp 0x348a7
leaq 0xd0(%rsp), %rdi
movq %r15, %rsi
movl $0x18, %edx
callq 0x4490
leaq 0xd0(%rsp), %rdi
leaq 0x70(%rsp), %rsi
callq 0x41b0
movq 0x3baeef(%rip), %rsi    # 0x3f0fa8
leaq 0xd0(%rsp), %rdi
callq 0x4240
leaq 0x150(%rsp), %rdi
callq 0x4110
movq %r15, %rdi
callq 0x21d8e
movb %al, 0x38(%rsp)
movq (%r14), %r12
cmpq 0x8(%r14), %r12
movb 0x38(%rsp), %bpl
je 0x348a7
testb %bpl, %bpl
je 0x36110
movl 0x70(%rsp), %ebx
movq (%r12), %rdi
callq 0x14aae
cmpl (%rax), %ebx
je 0x361de
jmp 0x361e9
movq (%r12), %rdi
callq 0x14a8e
movq %r15, %rdi
movq %rax, %rsi
callq 0x4050
testl %eax, %eax
je 0x361de
movq (%r12), %rdi
callq 0x14a66
movq %rax, %rbx
leaq 0x2f8(%rsp), %rax
movq %rax, 0x2e8(%rsp)
leaq 0x2e8(%rsp), %r13
movq %r13, %rdi
leaq 0x7546(%rip), %rsi      # 0x3d6a0
leaq 0x7540(%rip), %rdx      # 0x3d6a1
callq 0x6516
leaq 0xd0(%rsp), %rbp
movq %rbp, %rdi
movq %rbx, %rsi
movq %r13, %rdx
callq 0x21f22
movq %r15, %rdi
movq %rbp, %rsi
callq 0x4050
movl %eax, %r13d
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x361af
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0x2e8(%rsp), %rdi
leaq 0x2f8(%rsp), %rax
cmpq %rax, %rdi
je 0x361d4
movq 0x2f8(%rsp), %rsi
incq %rsi
callq 0x42e0
testl %r13d, %r13d
movb 0x38(%rsp), %bpl
jne 0x361e9
movq %rsp, %rdi
movq %r12, %rsi
callq 0x36720
addq $0x8, %r12
cmpq 0x8(%r14), %r12
jne 0x360f1
jmp 0x348a7
jmp 0x36480
jmp 0x3643a
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36408
jmp 0x36480
jmp 0x36480
movq %rax, %rbx
jmp 0x36265
jmp 0x36480
jmp 0x36480
movq %rax, %rbx
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x36265
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0x2e8(%rsp), %rdi
leaq 0x2f8(%rsp), %rax
cmpq %rax, %rdi
je 0x36483
movq 0x2f8(%rsp), %rsi
jmp 0x36420
jmp 0x36480
jmp 0x36480
movq %rax, %rbx
jmp 0x362ee
movq %rax, %rbx
jmp 0x362c9
jmp 0x36480
movq %rax, %rbx
movq 0x70(%rsp), %rdi
leaq 0x80(%rsp), %rax
cmpq %rax, %rdi
je 0x362c9
movq 0x80(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0x2a8(%rsp), %rdi
leaq 0x2b8(%rsp), %rax
cmpq %rax, %rdi
je 0x362ee
movq 0x2b8(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0x308(%rsp), %rdi
leaq 0x318(%rsp), %rax
cmpq %rax, %rdi
je 0x36375
movq 0x318(%rsp), %rsi
incq %rsi
callq 0x42e0
jmp 0x36375
movq %rax, %rbx
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
je 0x36342
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
jmp 0x36342
movq %rax, %rbx
movq 0x2c8(%rsp), %rdi
leaq 0x2d8(%rsp), %rax
cmpq %rax, %rdi
je 0x36483
movq 0x2d8(%rsp), %rsi
jmp 0x36420
jmp 0x36480
jmp 0x36480
movq %rax, %rbx
movq 0xd0(%rsp), %rdi
leaq 0xe0(%rsp), %rax
cmpq %rax, %rdi
jne 0x36418
jmp 0x36483
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36408
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36408
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
movq %rax, %rbx
movq 0xd0(%rsp), %rdi
cmpq %r12, %rdi
je 0x36483
movq 0xe0(%rsp), %rsi
incq %rsi
callq 0x42e0
jmp 0x36483
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
movq %rax, %rbx
movq 0x3bab64(%rip), %rsi    # 0x3f0fa8
leaq 0xd0(%rsp), %rdi
callq 0x4240
leaq 0x150(%rsp), %rdi
callq 0x4110
jmp 0x36483
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
jmp 0x36480
movq %rax, %rbx
movq 0x268(%rsp), %rdi
leaq 0x278(%rsp), %rax
cmpq %rax, %rdi
je 0x364a8
movq 0x278(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0x288(%rsp), %rdi
leaq 0x298(%rsp), %rax
cmpq %rax, %rdi
je 0x364cd
movq 0x298(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0xb0(%rsp), %rdi
leaq 0xc0(%rsp), %rax
cmpq %rax, %rdi
je 0x364f2
movq 0xc0(%rsp), %rsi
incq %rsi
callq 0x42e0
movq 0x90(%rsp), %rdi
leaq 0xa0(%rsp), %rax
cmpq %rax, %rdi
je 0x36517
movq 0xa0(%rsp), %rsi
incq %rsi
callq 0x42e0
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x3652d
movq 0x10(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x40(%rsp), %rdi
testq %rdi, %rdi
je 0x36544
movq 0x50(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq 0x20(%rsp), %rdi
testq %rdi, %rdi
je 0x3655b
movq 0x30(%rsp), %rsi
subq %rdi, %rsi
callq 0x42e0
movq %rbx, %rdi
callq 0x4550
nop