// File: Kei18[P]pibt/./src/solver/whca.cpp
// Function: WHCA::getPath(Agent*, int, std::vector<std::vector<Node*, std::allocator<Node*>>, std::allocator<std::vector<Node*, std::allocator<Node*>>>>&)
Nodes WHCA::getPath(Agent* a, int startTime, Paths& paths) {

  Node* _s = a->getNode();
  Node* _g = a->getGoal();

  Nodes path, tmpPath, C;

  int f, g;
  std::string key;
  bool prohibited = false;
  int maxLength = getMaxLengthPaths(paths);

  // ==== fast implementation ====
  tmpPath = G->getPath(_s, _g);
  if (hasWindow) {
    while (tmpPath.size() <= window + 1) tmpPath.push_back(_g);
    while (tmpPath.size() != window + 1) tmpPath.pop_back();
  } else {
    while (tmpPath.size() <= maxLength) tmpPath.push_back(_g);
  }
  // check result of fast implementation
  // first, check goals
  if (!hasWindow) {
    for (auto cg : CGOAL) {
      if (cg->a == a) continue;
      for (auto v : tmpPath) {
        if (cg->v == v) {
          prohibited = true;
          break;
        }
      }
      if (prohibited) break;
    }
  }
  // second, check collision and intersection
  if (!prohibited) {
    int limit;
    for (auto p : paths) {
      limit = p.size();
      if (hasWindow) limit = startTime + window + 1;
      for (int t = startTime + 1; t < limit; ++t) {
        if (t >= p.size()) break;
        if (p[t] == tmpPath[t-startTime]) { // collision
          prohibited = true;
          break;
        }
        if (t > startTime) {  // intersection
          if (p[t] == tmpPath[t-startTime-1] && p[t-1] == tmpPath[t-startTime]) {
            prohibited = true;
            break;
          }
        }
      }
      if (prohibited) break;
    }
  }
  // success of fast implementation
  if (!prohibited) return tmpPath;
  tmpPath.clear();
  // =============================

  // normal path finding
  bool invalid = true;

  boost::heap::fibonacci_heap<Fib_AN> OPEN;
  std::unordered_map<std::string, boost::heap::fibonacci_heap<Fib_AN>::handle_type> SEARCHED;
  std::unordered_set<std::string> CLOSE;  // key
  AN* n = new AN { _s, startTime, pathDist(_s, _g), nullptr };
  auto handle = OPEN.push(Fib_AN(n));
  key = getKey(n);
  SEARCHED.emplace(key, handle);

  while (!OPEN.empty()) {
    // argmin
    n = OPEN.top().node;

    // check termination condition
    if (!hasWindow) {  // non-window
      if (n->v == _g && n->g >= maxLength - 1) {
        invalid = false;
        break;
      }
    } else {  // windowed
      if (n->g >= startTime + window) {
        invalid = false;
        break;
      }
    }

    // update list
    OPEN.pop();
    CLOSE.emplace(getKey(n));

    // search neighbor
    C = G->neighbor(n->v);
    C.push_back(n->v);

    for (auto m : C) {
      // check other paths
      g = n->g + 1;
      key = getKey(g, m);
      if (CLOSE.find(key) != CLOSE.end()) continue;

      // check collision
      prohibited = false;
      for (auto p : paths) {
        if (g >= p.size()) continue;
        if (p[g] == m) {  // vertex collision
          prohibited = true;
          break;
        }
        if (p[g] == n->v && p[g-1] == m) {  // swap collision
          prohibited = true;
          break;
        }
      }
      if (prohibited) continue;

      // collsiion at goal
      if (!hasWindow) {
        for (auto cg : CGOAL) {  // collection of goals
          if (a != cg->a && g >= cg->t && m == cg->v) {
            prohibited = true;
            break;
          }
        }
        if (prohibited) continue;
      }

      f = g + pathDist(m, _g);

      auto itrS = SEARCHED.find(key);
      if (itrS == SEARCHED.end()) {  // new node
        AN* l = new AN { m, g, f, n };
        auto handle = OPEN.push(Fib_AN(l));
        SEARCHED.emplace(key, handle);
      } else {
        auto handle = itrS->second;
        AN* l = (*handle).node;
        if (l->f > f) {
          l->g = g;
          l->f = f;
          l->p = n;
        }
        OPEN.increase(handle);
      }
    }
  }

  // back tracking
  if (!invalid) {  // check failed or not
    while (n != nullptr) {
      path.push_back(n->v);
      n = n->p;
    }
    std::reverse(path.begin(), path.end());
  }

  return path;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x4b0, %rsp            # imm = 0x4B0
movq %rdi, -0x3b0(%rbp)
movq %rdi, %rax
movq %rax, -0x3a8(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movl %ecx, -0x1c(%rbp)
movq %r8, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x3a0(%rbp)
movq -0x18(%rbp), %rdi
callq 0x51cb0
movq %rax, -0x30(%rbp)
movq -0x18(%rbp), %rdi
callq 0x56820
movq %rax, -0x38(%rbp)
leaq -0x50(%rbp), %rdi
callq 0x3e880
leaq -0x68(%rbp), %rdi
callq 0x3e880
leaq -0x80(%rbp), %rdi
callq 0x3e880
leaq -0xa8(%rbp), %rdi
callq 0x86b0
movq -0x3a0(%rbp), %rdi
movb $0x0, -0xa9(%rbp)
movq -0x28(%rbp), %rsi
callq 0x9d280
movl %eax, -0x394(%rbp)
jmp 0xab32a
movq -0x3a0(%rbp), %rax
movl -0x394(%rbp), %ecx
movl %ecx, -0xb0(%rbp)
movq 0x38(%rax), %rsi
movq -0x30(%rbp), %rdx
movq -0x38(%rbp), %rcx
movq (%rsi), %rax
movq 0x18(%rax), %rax
leaq -0xd8(%rbp), %rdi
callq *%rax
jmp 0xab35b
leaq -0x68(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
callq 0x3f230
leaq -0xd8(%rbp), %rdi
callq 0xd7d0
movq -0x3a0(%rbp), %rax
testb $0x1, 0x68(%rax)
je 0xab3f9
jmp 0xab386
leaq -0x68(%rbp), %rdi
callq 0x3b0e0
movq -0x3a0(%rbp), %rcx
movl 0x6c(%rcx), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
cmpq %rcx, %rax
ja 0xab3cc
leaq -0x68(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x3f490
jmp 0xab3b3
jmp 0xab386
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xb8(%rbp)
movl %eax, -0xbc(%rbp)
jmp 0xac1ea
jmp 0xab3ce
leaq -0x68(%rbp), %rdi
callq 0x3b0e0
movq -0x3a0(%rbp), %rcx
movl 0x6c(%rcx), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
cmpq %rcx, %rax
je 0xab3f7
leaq -0x68(%rbp), %rdi
callq 0xac5f0
jmp 0xab3ce
jmp 0xab423
jmp 0xab3fb
leaq -0x68(%rbp), %rdi
callq 0x3b0e0
movslq -0xb0(%rbp), %rcx
cmpq %rcx, %rax
ja 0xab421
leaq -0x68(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x3f490
jmp 0xab41f
jmp 0xab3fb
jmp 0xab423
movq -0x3a0(%rbp), %rax
testb $0x1, 0x68(%rax)
jne 0xab560
movq -0x3a0(%rbp), %rax
addq $0x70, %rax
movq %rax, -0xe0(%rbp)
movq -0xe0(%rbp), %rdi
callq 0xac440
movq %rax, -0xe8(%rbp)
movq -0xe0(%rbp), %rdi
callq 0xac470
movq %rax, -0xf0(%rbp)
leaq -0xe8(%rbp), %rdi
leaq -0xf0(%rbp), %rsi
callq 0xac4a0
testb $0x1, %al
jne 0xab488
jmp 0xab55e
leaq -0xe8(%rbp), %rdi
callq 0xac4e0
movq (%rax), %rax
movq %rax, -0xf8(%rbp)
movq -0xf8(%rbp), %rax
movq (%rax), %rax
cmpq -0x18(%rbp), %rax
jne 0xab4b3
jmp 0xab54d
leaq -0x68(%rbp), %rax
movq %rax, -0x100(%rbp)
movq -0x100(%rbp), %rdi
callq 0x3b730
movq %rax, -0x108(%rbp)
movq -0x100(%rbp), %rdi
callq 0x3b760
movq %rax, -0x110(%rbp)
leaq -0x108(%rbp), %rdi
leaq -0x110(%rbp), %rsi
callq 0x3b790
testb $0x1, %al
jne 0xab4fd
jmp 0xab540
leaq -0x108(%rbp), %rdi
callq 0x3bb00
movq (%rax), %rax
movq %rax, -0x118(%rbp)
movq -0xf8(%rbp), %rax
movq 0x10(%rax), %rax
cmpq -0x118(%rbp), %rax
jne 0xab530
movb $0x1, -0xa9(%rbp)
jmp 0xab540
jmp 0xab532
leaq -0x108(%rbp), %rdi
callq 0x3bad0
jmp 0xab4e4
testb $0x1, -0xa9(%rbp)
je 0xab54b
jmp 0xab55e
jmp 0xab54d
leaq -0xe8(%rbp), %rdi
callq 0xac500
jmp 0xab46c
jmp 0xab560
testb $0x1, -0xa9(%rbp)
jne 0xab7b0
movq -0x28(%rbp), %rax
movq %rax, -0x128(%rbp)
movq -0x128(%rbp), %rdi
callq 0x377e0
movq %rax, -0x130(%rbp)
movq -0x128(%rbp), %rdi
callq 0x37500
movq %rax, -0x138(%rbp)
leaq -0x130(%rbp), %rdi
leaq -0x138(%rbp), %rsi
callq 0x4e640
testb $0x1, %al
jne 0xab5ba
jmp 0xab7ae
leaq -0x130(%rbp), %rdi
callq 0x37d00
movq %rax, %rsi
leaq -0x150(%rbp), %rdi
callq 0x3aff0
jmp 0xab5d7
leaq -0x150(%rbp), %rdi
callq 0x3b0e0
movq %rax, %rcx
movq -0x3a0(%rbp), %rax
movl %ecx, -0x11c(%rbp)
testb $0x1, 0x68(%rax)
je 0xab60f
movq -0x3a0(%rbp), %rcx
movl -0x1c(%rbp), %eax
addl 0x6c(%rcx), %eax
addl $0x1, %eax
movl %eax, -0x11c(%rbp)
movl -0x1c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x154(%rbp)
movl -0x154(%rbp), %eax
cmpl -0x11c(%rbp), %eax
jge 0xab762
movslq -0x154(%rbp), %rax
movq %rax, -0x3b8(%rbp)
leaq -0x150(%rbp), %rdi
callq 0x3b0e0
movq %rax, %rcx
movq -0x3b8(%rbp), %rax
cmpq %rcx, %rax
jb 0xab65b
jmp 0xab762
movslq -0x154(%rbp), %rsi
leaq -0x150(%rbp), %rdi
callq 0xda90
movq (%rax), %rax
movq %rax, -0x3c0(%rbp)
movl -0x154(%rbp), %eax
subl -0x1c(%rbp), %eax
movslq %eax, %rsi
leaq -0x68(%rbp), %rdi
callq 0xda90
movq %rax, %rcx
movq -0x3c0(%rbp), %rax
cmpq (%rcx), %rax
jne 0xab6a8
movb $0x1, -0xa9(%rbp)
jmp 0xab762
movl -0x154(%rbp), %eax
cmpl -0x1c(%rbp), %eax
jle 0xab74c
movslq -0x154(%rbp), %rsi
leaq -0x150(%rbp), %rdi
callq 0xda90
movq (%rax), %rax
movq %rax, -0x3c8(%rbp)
movl -0x154(%rbp), %eax
subl -0x1c(%rbp), %eax
subl $0x1, %eax
movslq %eax, %rsi
leaq -0x68(%rbp), %rdi
callq 0xda90
movq %rax, %rcx
movq -0x3c8(%rbp), %rax
cmpq (%rcx), %rax
jne 0xab74a
movl -0x154(%rbp), %eax
subl $0x1, %eax
movslq %eax, %rsi
leaq -0x150(%rbp), %rdi
callq 0xda90
movq (%rax), %rax
movq %rax, -0x3d0(%rbp)
movl -0x154(%rbp), %eax
subl -0x1c(%rbp), %eax
movslq %eax, %rsi
leaq -0x68(%rbp), %rdi
callq 0xda90
movq %rax, %rcx
movq -0x3d0(%rbp), %rax
cmpq (%rcx), %rax
jne 0xab74a
movb $0x1, -0xa9(%rbp)
jmp 0xab762
jmp 0xab74c
jmp 0xab74e
movl -0x154(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x154(%rbp)
jmp 0xab61b
testb $0x1, -0xa9(%rbp)
je 0xab777
movl $0xc, -0x158(%rbp)
jmp 0xab781
movl $0x0, -0x158(%rbp)
leaq -0x150(%rbp), %rdi
callq 0xd7d0
movl -0x158(%rbp), %eax
testl %eax, %eax
je 0xab79b
jmp 0xab799
jmp 0xab7ae
jmp 0xab79d
leaq -0x130(%rbp), %rdi
callq 0x4e750
jmp 0xab59e
jmp 0xab7b0
testb $0x1, -0xa9(%rbp)
jne 0xab7d8
movq -0x3b0(%rbp), %rdi
leaq -0x68(%rbp), %rsi
callq 0x375a0
movl $0x1, -0x158(%rbp)
jmp 0xac1b3
leaq -0x68(%rbp), %rdi
callq 0x3e9f0
movb $0x1, -0x159(%rbp)
leaq -0x188(%rbp), %rdi
leaq -0x189(%rbp), %rsi
callq 0x3eef0
jmp 0xab7fd
leaq -0x1c8(%rbp), %rdi
callq 0x636c0
leaq -0x200(%rbp), %rdi
callq 0x636e0
movl $0x18, %edi
callq 0x84e0
movq %rax, -0x3d8(%rbp)
jmp 0xab828
movq -0x3a0(%rbp), %rdi
movq -0x3d8(%rbp), %rax
movq -0x30(%rbp), %rcx
movq %rcx, (%rax)
movl -0x1c(%rbp), %ecx
movl %ecx, 0x8(%rax)
addq $0xc, %rax
movq %rax, -0x3e8(%rbp)
movq -0x30(%rbp), %rsi
movq -0x38(%rbp), %rdx
callq 0x9d410
movl %eax, -0x3dc(%rbp)
jmp 0xab863
movq -0x3d8(%rbp), %rax
movq -0x3e8(%rbp), %rcx
movl -0x3dc(%rbp), %edx
movl %edx, (%rcx)
movq $0x0, 0x10(%rax)
movq %rax, -0x208(%rbp)
movq -0x208(%rbp), %rsi
leaq -0x218(%rbp), %rdi
callq 0x3f050
jmp 0xab89d
leaq -0x188(%rbp), %rdi
leaq -0x218(%rbp), %rsi
callq 0x3ef90
movq %rax, -0x3f0(%rbp)
jmp 0xab8b9
movq -0x3f0(%rbp), %rax
movq %rax, -0x210(%rbp)
movq -0x208(%rbp), %rsi
leaq -0x238(%rbp), %rdi
callq 0x9da10
jmp 0xab8dc
leaq -0xa8(%rbp), %rdi
movq %rdi, -0x408(%rbp)
leaq -0x238(%rbp), %rsi
movq %rsi, -0x410(%rbp)
callq 0x85f0
movq -0x410(%rbp), %rdi
callq 0x8330
movq -0x408(%rbp), %rsi
leaq -0x1c8(%rbp), %rdi
leaq -0x210(%rbp), %rdx
callq 0x63700
movb %dl, -0x3f9(%rbp)
movq %rax, -0x3f8(%rbp)
jmp 0xab932
movb -0x3f9(%rbp), %al
movq -0x3f8(%rbp), %rcx
movq %rcx, -0x248(%rbp)
movb %al, -0x240(%rbp)
leaq -0x188(%rbp), %rdi
callq 0x3f0c0
movb %al, -0x411(%rbp)
jmp 0xab960
movb -0x411(%rbp), %al
xorb $-0x1, %al
testb $0x1, %al
jne 0xab971
jmp 0xac0d1
leaq -0x188(%rbp), %rdi
callq 0x3f0f0
movq %rax, -0x420(%rbp)
jmp 0xab986
movq -0x3a0(%rbp), %rax
movq -0x420(%rbp), %rcx
movq (%rcx), %rcx
movq %rcx, -0x208(%rbp)
testb $0x1, 0x68(%rax)
jne 0xaba18
movq -0x208(%rbp), %rax
movq (%rax), %rax
cmpq -0x38(%rbp), %rax
jne 0xaba16
movq -0x208(%rbp), %rax
movl 0x8(%rax), %eax
movl -0xb0(%rbp), %ecx
subl $0x1, %ecx
cmpl %ecx, %eax
jl 0xaba16
movb $0x0, -0x159(%rbp)
jmp 0xac0d1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xb8(%rbp)
movl %eax, -0xbc(%rbp)
jmp 0xac18d
movq -0x3d8(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xb8(%rbp)
movl %eax, -0xbc(%rbp)
movl $0x18, %esi
callq 0x84f0
jmp 0xac18d
jmp 0xaba41
movq -0x3a0(%rbp), %rdx
movq -0x208(%rbp), %rax
movl 0x8(%rax), %eax
movl -0x1c(%rbp), %ecx
addl 0x6c(%rdx), %ecx
cmpl %ecx, %eax
jl 0xaba3f
movb $0x0, -0x159(%rbp)
jmp 0xac0d1
jmp 0xaba41
leaq -0x188(%rbp), %rdi
callq 0x3f150
jmp 0xaba4f
movq -0x208(%rbp), %rsi
leaq -0x268(%rbp), %rdi
callq 0x9da10
jmp 0xaba64
leaq -0x200(%rbp), %rdi
leaq -0x268(%rbp), %rsi
callq 0x63750
movb %dl, -0x429(%rbp)
movq %rax, -0x428(%rbp)
jmp 0xaba86
movb -0x429(%rbp), %al
movq -0x428(%rbp), %rcx
movq %rcx, -0x278(%rbp)
movb %al, -0x270(%rbp)
leaq -0x268(%rbp), %rdi
callq 0x8330
movq -0x3a0(%rbp), %rax
movq 0x38(%rax), %rsi
movq -0x208(%rbp), %rax
movq (%rax), %rdx
leaq -0x290(%rbp), %rdi
callq 0x3c8d0
jmp 0xabacf
leaq -0x80(%rbp), %rdi
movq %rdi, -0x438(%rbp)
leaq -0x290(%rbp), %rsi
movq %rsi, -0x440(%rbp)
callq 0x3f230
movq -0x440(%rbp), %rdi
callq 0xd7d0
movq -0x438(%rbp), %rdi
movq -0x208(%rbp), %rsi
callq 0x3f490
jmp 0xabb0e
leaq -0x80(%rbp), %rax
movq %rax, -0x298(%rbp)
movq -0x298(%rbp), %rdi
callq 0x3b730
movq %rax, -0x2a0(%rbp)
movq -0x298(%rbp), %rdi
callq 0x3b760
movq %rax, -0x2a8(%rbp)
leaq -0x2a0(%rbp), %rdi
leaq -0x2a8(%rbp), %rsi
callq 0x3b790
testb $0x1, %al
jne 0xabb5b
jmp 0xac0cc
leaq -0x2a0(%rbp), %rdi
callq 0x3bb00
movq (%rax), %rax
movq %rax, -0x2b0(%rbp)
movq -0x208(%rbp), %rax
movl 0x8(%rax), %eax
incl %eax
movl %eax, -0x88(%rbp)
movl -0x88(%rbp), %esi
movq -0x2b0(%rbp), %rdx
leaq -0x2d0(%rbp), %rdi
callq 0x9d8c0
jmp 0xabb9e
leaq -0xa8(%rbp), %rdi
movq %rdi, -0x450(%rbp)
leaq -0x2d0(%rbp), %rsi
movq %rsi, -0x458(%rbp)
callq 0x85f0
movq -0x458(%rbp), %rdi
callq 0x8330
movq -0x450(%rbp), %rsi
leaq -0x200(%rbp), %rdi
callq 0x637c0
movq %rax, -0x448(%rbp)
jmp 0xabbe7
movq -0x448(%rbp), %rax
movq %rax, -0x2d8(%rbp)
leaq -0x200(%rbp), %rdi
callq 0x637f0
movq %rax, -0x2e0(%rbp)
leaq -0x2d8(%rbp), %rdi
leaq -0x2e0(%rbp), %rsi
callq 0x63790
testb $0x1, %al
jne 0xabc21
jmp 0xabc49
jmp 0xac0bb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xb8(%rbp)
movl %eax, -0xbc(%rbp)
leaq -0x268(%rbp), %rdi
callq 0x8330
jmp 0xac18d
movb $0x0, -0xa9(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x2e8(%rbp)
movq -0x2e8(%rbp), %rdi
callq 0x377e0
movq %rax, -0x2f0(%rbp)
movq -0x2e8(%rbp), %rdi
callq 0x37500
movq %rax, -0x2f8(%rbp)
leaq -0x2f0(%rbp), %rdi
leaq -0x2f8(%rbp), %rsi
callq 0x4e640
testb $0x1, %al
jne 0xabc9d
jmp 0xabdc7
leaq -0x2f0(%rbp), %rdi
callq 0x37d00
movq %rax, %rsi
leaq -0x310(%rbp), %rdi
callq 0x3aff0
jmp 0xabcba
movslq -0x88(%rbp), %rax
movq %rax, -0x460(%rbp)
leaq -0x310(%rbp), %rdi
callq 0x3b0e0
movq %rax, %rcx
movq -0x460(%rbp), %rax
cmpq %rcx, %rax
jb 0xabcf2
movl $0x16, -0x158(%rbp)
jmp 0xabd87
movslq -0x88(%rbp), %rsi
leaq -0x310(%rbp), %rdi
callq 0xda90
movq (%rax), %rax
cmpq -0x2b0(%rbp), %rax
jne 0xabd24
movb $0x1, -0xa9(%rbp)
movl $0x15, -0x158(%rbp)
jmp 0xabd87
movslq -0x88(%rbp), %rsi
leaq -0x310(%rbp), %rdi
callq 0xda90
movq (%rax), %rax
movq -0x208(%rbp), %rcx
cmpq (%rcx), %rax
jne 0xabd7d
movl -0x88(%rbp), %eax
subl $0x1, %eax
movslq %eax, %rsi
leaq -0x310(%rbp), %rdi
callq 0xda90
movq (%rax), %rax
cmpq -0x2b0(%rbp), %rax
jne 0xabd7d
movb $0x1, -0xa9(%rbp)
movl $0x15, -0x158(%rbp)
jmp 0xabd87
movl $0x0, -0x158(%rbp)
leaq -0x310(%rbp), %rdi
callq 0xd7d0
movl -0x158(%rbp), %eax
movl %eax, -0x464(%rbp)
testl %eax, %eax
je 0xabdb4
jmp 0xabda5
movl -0x464(%rbp), %eax
subl $0x15, %eax
je 0xabdc7
jmp 0xabdb2
jmp 0xabdb6
jmp 0xabdb6
leaq -0x2f0(%rbp), %rdi
callq 0x4e750
jmp 0xabc81
testb $0x1, -0xa9(%rbp)
je 0xabdd5
jmp 0xac0bb
movq -0x3a0(%rbp), %rax
testb $0x1, 0x68(%rax)
jne 0xabeac
movq -0x3a0(%rbp), %rax
addq $0x70, %rax
movq %rax, -0x318(%rbp)
movq -0x318(%rbp), %rdi
callq 0xac440
movq %rax, -0x320(%rbp)
movq -0x318(%rbp), %rdi
callq 0xac470
movq %rax, -0x328(%rbp)
leaq -0x320(%rbp), %rdi
leaq -0x328(%rbp), %rsi
callq 0xac4a0
testb $0x1, %al
jne 0xabe37
jmp 0xabe9c
leaq -0x320(%rbp), %rdi
callq 0xac4e0
movq (%rax), %rax
movq %rax, -0x330(%rbp)
movq -0x18(%rbp), %rax
movq -0x330(%rbp), %rcx
cmpq (%rcx), %rax
je 0xabe8c
movl -0x88(%rbp), %eax
movq -0x330(%rbp), %rcx
cmpl 0x8(%rcx), %eax
jl 0xabe8c
movq -0x2b0(%rbp), %rax
movq -0x330(%rbp), %rcx
cmpq 0x10(%rcx), %rax
jne 0xabe8c
movb $0x1, -0xa9(%rbp)
jmp 0xabe9c
jmp 0xabe8e
leaq -0x320(%rbp), %rdi
callq 0xac500
jmp 0xabe1e
testb $0x1, -0xa9(%rbp)
je 0xabeaa
jmp 0xac0bb
jmp 0xabeac
movq -0x3a0(%rbp), %rdi
movl -0x88(%rbp), %eax
movl %eax, -0x46c(%rbp)
movq -0x2b0(%rbp), %rsi
movq -0x38(%rbp), %rdx
callq 0x9d410
movl %eax, -0x468(%rbp)
jmp 0xabed7
movl -0x468(%rbp), %ecx
movl -0x46c(%rbp), %eax
addl %ecx, %eax
movl %eax, -0x84(%rbp)
leaq -0x1c8(%rbp), %rdi
leaq -0xa8(%rbp), %rsi
callq 0x63820
movq %rax, -0x478(%rbp)
jmp 0xabf07
movq -0x478(%rbp), %rax
movq %rax, -0x338(%rbp)
leaq -0x1c8(%rbp), %rdi
callq 0x63880
movq %rax, -0x340(%rbp)
leaq -0x338(%rbp), %rdi
leaq -0x340(%rbp), %rsi
callq 0x63850
testb $0x1, %al
jne 0xabf44
jmp 0xac013
movl $0x18, %edi
callq 0x84e0
movq %rax, -0x480(%rbp)
jmp 0xabf57
movq -0x480(%rbp), %rax
movq -0x2b0(%rbp), %rcx
movq %rcx, (%rax)
movl -0x88(%rbp), %ecx
movl %ecx, 0x8(%rax)
movl -0x84(%rbp), %ecx
movl %ecx, 0xc(%rax)
movq -0x208(%rbp), %rcx
movq %rcx, 0x10(%rax)
movq %rax, -0x348(%rbp)
movq -0x348(%rbp), %rsi
leaq -0x358(%rbp), %rdi
callq 0x3f050
jmp 0xabfa1
leaq -0x188(%rbp), %rdi
leaq -0x358(%rbp), %rsi
callq 0x3ef90
movq %rax, -0x488(%rbp)
jmp 0xabfbd
movq -0x488(%rbp), %rax
movq %rax, -0x350(%rbp)
leaq -0x1c8(%rbp), %rdi
leaq -0xa8(%rbp), %rsi
leaq -0x350(%rbp), %rdx
callq 0x63700
movb %dl, -0x491(%rbp)
movq %rax, -0x490(%rbp)
jmp 0xabff4
movb -0x491(%rbp), %al
movq -0x490(%rbp), %rcx
movq %rcx, -0x368(%rbp)
movb %al, -0x360(%rbp)
jmp 0xac0b9
leaq -0x338(%rbp), %rdi
callq 0x638b0
movq 0x20(%rax), %rax
movq %rax, -0x370(%rbp)
leaq -0x370(%rbp), %rdi
callq 0x3f3b0
movq %rax, -0x4a0(%rbp)
jmp 0xac03f
movq -0x4a0(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x378(%rbp)
movq -0x378(%rbp), %rax
movl 0xc(%rax), %eax
cmpl -0x84(%rbp), %eax
jle 0xac094
movl -0x88(%rbp), %ecx
movq -0x378(%rbp), %rax
movl %ecx, 0x8(%rax)
movl -0x84(%rbp), %ecx
movq -0x378(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0x208(%rbp), %rcx
movq -0x378(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x370(%rbp), %rax
movq %rax, -0x380(%rbp)
movq -0x380(%rbp), %rsi
leaq -0x188(%rbp), %rdi
callq 0x3f3e0
jmp 0xac0b7
jmp 0xac0b9
jmp 0xac0bb
leaq -0x2a0(%rbp), %rdi
callq 0x3bad0
jmp 0xabb3f
jmp 0xab94c
testb $0x1, -0x159(%rbp)
jne 0xac14d
jmp 0xac0dc
cmpq $0x0, -0x208(%rbp)
je 0xac10c
movq -0x208(%rbp), %rsi
leaq -0x50(%rbp), %rdi
callq 0x3f490
jmp 0xac0f8
movq -0x208(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x208(%rbp)
jmp 0xac0dc
leaq -0x50(%rbp), %rdi
movq %rdi, -0x4a8(%rbp)
callq 0x3b730
movq -0x4a8(%rbp), %rdi
movq %rax, -0x388(%rbp)
callq 0x3b760
movq %rax, -0x390(%rbp)
movq -0x388(%rbp), %rdi
movq -0x390(%rbp), %rsi
callq 0x3f500
jmp 0xac14b
jmp 0xac14d
movq -0x3b0(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x375a0
movl $0x1, -0x158(%rbp)
leaq -0x200(%rbp), %rdi
callq 0x63930
leaq -0x1c8(%rbp), %rdi
callq 0x63950
leaq -0x188(%rbp), %rdi
callq 0x3f580
jmp 0xac1b3
leaq -0x200(%rbp), %rdi
callq 0x63930
leaq -0x1c8(%rbp), %rdi
callq 0x63950
leaq -0x188(%rbp), %rdi
callq 0x3f580
jmp 0xac1ea
leaq -0xa8(%rbp), %rdi
callq 0x8330
leaq -0x80(%rbp), %rdi
callq 0xd7d0
leaq -0x68(%rbp), %rdi
callq 0xd7d0
leaq -0x50(%rbp), %rdi
callq 0xd7d0
movq -0x3a8(%rbp), %rax
addq $0x4b0, %rsp            # imm = 0x4B0
popq %rbp
retq
leaq -0xa8(%rbp), %rdi
callq 0x8330
leaq -0x80(%rbp), %rdi
callq 0xd7d0
leaq -0x68(%rbp), %rdi
callq 0xd7d0
leaq -0x50(%rbp), %rdi
callq 0xd7d0
movq -0xb8(%rbp), %rdi
callq 0x8880
nopl (%rax)