// File: CMU-SAFARI[P]ramulator/src/Cache.cpp
// Function: ramulator::Cache::Cache(int, int, int, int, ramulator::Cache::Level, std::shared_ptr<ramulator::CacheSystem>)
Cache::Cache(int size, int assoc, int block_size,
    int mshr_entry_num, Level level,
    std::shared_ptr<CacheSystem> cachesys):
    level(level), cachesys(cachesys), higher_cache(0),
    lower_cache(nullptr), size(size), assoc(assoc),
    block_size(block_size), mshr_entry_num(mshr_entry_num) {

  debug("level %d size %d assoc %d block_size %d\n",
      int(level), size, assoc, block_size);

  if (level == Level::L1) {
    level_string = "L1";
  } else if (level == Level::L2) {
    level_string = "L2";
  } else if (level == Level::L3) {
    level_string = "L3";
  }

  is_first_level = (level == cachesys->first_level);
  is_last_level = (level == cachesys->last_level);

  // Check size, block size and assoc are 2^N
  assert((size & (size - 1)) == 0);
  assert((block_size & (block_size - 1)) == 0);
  assert((assoc & (assoc - 1)) == 0);
  assert(size >= block_size);

  // Initialize cache configuration
  block_num = size / (block_size * assoc);
  index_mask = block_num - 1;
  index_offset = calc_log2(block_size);
  tag_offset = calc_log2(block_num) + index_offset;

  debug("index_offset %d", index_offset);
  debug("index_mask 0x%x", index_mask);
  debug("tag_offset %d", tag_offset);

  // regStats
  cache_read_miss.name(level_string + string("_cache_read_miss"))
                 .desc("cache read miss count")
                 .precision(0)
                 ;

  cache_write_miss.name(level_string + string("_cache_write_miss"))
                  .desc("cache write miss count")
                  .precision(0)
                  ;

  cache_total_miss.name(level_string + string("_cache_total_miss"))
                  .desc("cache total miss count")
                  .precision(0)
                  ;

  cache_eviction.name(level_string + string("_cache_eviction"))
                .desc("number of evict from this level to lower level")
                .precision(0)
                ;

  cache_read_access.name(level_string + string("_cache_read_access"))
                  .desc("cache read access count")
                  .precision(0)
                  ;

  cache_write_access.name(level_string + string("_cache_write_access"))
                    .desc("cache write access count")
                    .precision(0)
                    ;

  cache_total_access.name(level_string + string("_cache_total_access"))
                    .desc("cache total access count")
                    .precision(0)
                    ;

  cache_mshr_hit.name(level_string + string("_cache_mshr_hit"))
                .desc("cache mshr hit count")
                .precision(0)
                ;
  cache_mshr_unavailable.name(level_string + string("_cache_mshr_unavailable"))
                         .desc("cache mshr not available count")
                         .precision(0)
                         ;
  cache_set_unavailable.name(level_string + string("_cache_set_unavailable"))
                         .desc("cache set not available")
                         .precision(0)
                         ;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x720, %rsp            # imm = 0x720
movq 0x10(%rbp), %rax
movq %rax, -0x4b0(%rbp)
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movl %edx, -0x10(%rbp)
movl %ecx, -0x14(%rbp)
movl %r8d, -0x18(%rbp)
movl %r9d, -0x1c(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0x4a0(%rbp)
movq %rdi, %rax
movq %rax, -0x4a8(%rbp)
callq 0x25e50
movq -0x4a0(%rbp), %rdi
addq $0x98, %rdi
movq %rdi, -0x498(%rbp)
callq 0x25e50
jmp 0x17c001
movq -0x4a8(%rbp), %rdi
addq $0x130, %rdi            # imm = 0x130
movq %rdi, -0x4b8(%rbp)
callq 0x25e50
jmp 0x17c01d
movq -0x4a8(%rbp), %rdi
addq $0x1c8, %rdi            # imm = 0x1C8
movq %rdi, -0x4c0(%rbp)
callq 0x25e50
jmp 0x17c039
movq -0x4a8(%rbp), %rdi
addq $0x260, %rdi            # imm = 0x260
movq %rdi, -0x4c8(%rbp)
callq 0x25e50
jmp 0x17c055
movq -0x4a8(%rbp), %rdi
addq $0x2f8, %rdi            # imm = 0x2F8
movq %rdi, -0x4d0(%rbp)
callq 0x25e50
jmp 0x17c071
movq -0x4a8(%rbp), %rdi
addq $0x390, %rdi            # imm = 0x390
movq %rdi, -0x4d8(%rbp)
callq 0x25e50
jmp 0x17c08d
movq -0x4a8(%rbp), %rdi
addq $0x428, %rdi            # imm = 0x428
movq %rdi, -0x4e0(%rbp)
callq 0x25e50
jmp 0x17c0a9
movq -0x4a8(%rbp), %rdi
addq $0x4c0, %rdi            # imm = 0x4C0
movq %rdi, -0x4e8(%rbp)
callq 0x25e50
jmp 0x17c0c5
movq -0x4a8(%rbp), %rdi
addq $0x558, %rdi            # imm = 0x558
movq %rdi, -0x4f0(%rbp)
callq 0x25e50
jmp 0x17c0e1
movq -0x4a8(%rbp), %rdi
movl -0x1c(%rbp), %eax
movl %eax, 0x5f0(%rdi)
addq $0x5f8, %rdi            # imm = 0x5F8
movq %rdi, -0x510(%rbp)
callq 0xc480
movq -0x4b0(%rbp), %rsi
movq -0x4a8(%rbp), %rdi
movl $0x4, 0x618(%rdi)
movl $0x10, 0x61c(%rdi)
movl $0x2f, 0x620(%rdi)
movl $0x4, 0x624(%rdi)
movl $0xc, 0x628(%rdi)
movl $0x1f, 0x62c(%rdi)
addq $0x630, %rdi            # imm = 0x630
movq %rdi, -0x508(%rbp)
callq 0x17ff90
movq -0x4a8(%rbp), %rax
addq $0x640, %rax            # imm = 0x640
movq %rax, -0x500(%rbp)
leaq -0x2d(%rbp), %rdi
movq %rdi, -0x4f8(%rbp)
callq 0x17ffc0
movq -0x500(%rbp), %rdi
movq -0x4f8(%rbp), %rdx
xorl %eax, %eax
movl %eax, %esi
callq 0x17ffe0
jmp 0x17c19e
leaq -0x2d(%rbp), %rdi
callq 0x4bc50
movq -0x4a8(%rbp), %rdi
movq $0x0, 0x658(%rdi)
movslq -0xc(%rbp), %rax
movq %rax, 0x668(%rdi)
movl -0x10(%rbp), %eax
movl %eax, 0x670(%rdi)
movl -0x14(%rbp), %eax
movl %eax, 0x67c(%rdi)
movl -0x18(%rbp), %eax
movl %eax, 0x688(%rdi)
addq $0x690, %rdi            # imm = 0x690
movq %rdi, -0x528(%rbp)
callq 0x180050
movq -0x4a8(%rbp), %rdi
addq $0x6a8, %rdi            # imm = 0x6A8
movq %rdi, -0x520(%rbp)
callq 0x344f0
movq -0x4a8(%rbp), %rdi
addq $0x6c0, %rdi            # imm = 0x6C0
movq %rdi, -0x518(%rbp)
callq 0x180070
cmpl $0x0, -0x1c(%rbp)
jne 0x17c315
movq -0x4a8(%rbp), %rdi
addq $0x5f8, %rdi            # imm = 0x5F8
leaq 0xdeac7(%rip), %rsi     # 0x25ad0c
callq 0xc470
jmp 0x17c24c
jmp 0x17c361
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d619
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d60d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d601
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d5f5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d5e9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d5dd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d5d1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d5c5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d5b9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x2d(%rbp), %rdi
callq 0x4bc50
jmp 0x17d595
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d565
cmpl $0x1, -0x1c(%rbp)
jne 0x17c339
movq -0x4a8(%rbp), %rdi
addq $0x5f8, %rdi            # imm = 0x5F8
leaq 0xe5138(%rip), %rsi     # 0x261468
callq 0xc470
jmp 0x17c337
jmp 0x17c35f
cmpl $0x2, -0x1c(%rbp)
jne 0x17c35d
movq -0x4a8(%rbp), %rdi
addq $0x5f8, %rdi            # imm = 0x5F8
leaq 0xde9bb(%rip), %rsi     # 0x25ad0f
callq 0xc470
jmp 0x17c35b
jmp 0x17c35d
jmp 0x17c35f
jmp 0x17c361
movq -0x4b0(%rbp), %rdi
movl -0x1c(%rbp), %eax
movl %eax, -0x530(%rbp)
callq 0x180090
movl -0x530(%rbp), %ecx
movq -0x4b0(%rbp), %rdi
movq %rax, %rdx
movq -0x4a8(%rbp), %rax
cmpl 0x58(%rdx), %ecx
sete %cl
andb $0x1, %cl
movb %cl, 0x660(%rax)
movl -0x1c(%rbp), %eax
movl %eax, -0x52c(%rbp)
callq 0x180090
movl -0x52c(%rbp), %ecx
movq %rax, %rdx
movq -0x4a8(%rbp), %rax
cmpl 0x5c(%rdx), %ecx
sete %cl
andb $0x1, %cl
movb %cl, 0x661(%rax)
movl -0xc(%rbp), %eax
movl -0xc(%rbp), %ecx
subl $0x1, %ecx
andl %ecx, %eax
cmpl $0x0, %eax
jne 0x17c3db
jmp 0x17c3fa
leaq 0xde930(%rip), %rdi     # 0x25ad12
leaq 0xde942(%rip), %rsi     # 0x25ad2b
movl $0x26, %edx
leaq 0xde944(%rip), %rcx     # 0x25ad39
callq 0xc280
movl -0x14(%rbp), %eax
movl -0x14(%rbp), %ecx
subl $0x1, %ecx
andl %ecx, %eax
cmpl $0x0, %eax
jne 0x17c40c
jmp 0x17c42b
leaq 0xde977(%rip), %rdi     # 0x25ad8a
leaq 0xde911(%rip), %rsi     # 0x25ad2b
movl $0x27, %edx
leaq 0xde913(%rip), %rcx     # 0x25ad39
callq 0xc280
movl -0x10(%rbp), %eax
movl -0x10(%rbp), %ecx
subl $0x1, %ecx
andl %ecx, %eax
cmpl $0x0, %eax
jne 0x17c43d
jmp 0x17c45c
leaq 0xde96b(%rip), %rdi     # 0x25adaf
leaq 0xde8e0(%rip), %rsi     # 0x25ad2b
movl $0x28, %edx
leaq 0xde8e2(%rip), %rcx     # 0x25ad39
callq 0xc280
movl -0xc(%rbp), %eax
cmpl -0x14(%rbp), %eax
jl 0x17c466
jmp 0x17c485
leaq 0xde95d(%rip), %rdi     # 0x25adca
leaq 0xde8b7(%rip), %rsi     # 0x25ad2b
movl $0x29, %edx
leaq 0xde8b9(%rip), %rcx     # 0x25ad39
callq 0xc280
movq -0x4a8(%rbp), %rdi
movl -0xc(%rbp), %eax
movl -0x14(%rbp), %ecx
movl -0x10(%rbp), %edx
imull %edx, %ecx
cltd
idivl %ecx
movl %eax, 0x674(%rdi)
movl 0x674(%rdi), %eax
decl %eax
movl %eax, 0x678(%rdi)
movl -0x14(%rbp), %esi
callq 0x1800b0
movl %eax, -0x534(%rbp)
jmp 0x17c4bf
movq -0x4a8(%rbp), %rdi
movl -0x534(%rbp), %eax
movl %eax, 0x680(%rdi)
movl 0x674(%rdi), %esi
callq 0x1800b0
movl %eax, -0x538(%rbp)
jmp 0x17c4e5
movq -0x4a8(%rbp), %rax
movl -0x538(%rbp), %ecx
movl 0x680(%rax), %edx
addl %edx, %ecx
movl %ecx, 0x684(%rax)
movq %rax, %rcx
movq %rcx, -0x550(%rbp)
addq $0x5f8, %rax            # imm = 0x5F8
movq %rax, -0x548(%rbp)
leaq -0x71(%rbp), %rdi
movq %rdi, -0x540(%rbp)
callq 0xc5e0
movq -0x540(%rbp), %rdx
leaq 0xde8a8(%rip), %rsi     # 0x25addd
leaq -0x70(%rbp), %rdi
callq 0x17a40
jmp 0x17c540
movq -0x548(%rbp), %rsi
leaq -0x50(%rbp), %rdi
leaq -0x70(%rbp), %rdx
callq 0x17de0
jmp 0x17c556
movq -0x550(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x2c990
movq %rax, -0x558(%rbp)
jmp 0x17c56f
leaq -0x99(%rbp), %rdi
movq %rdi, -0x560(%rbp)
callq 0xc5e0
movq -0x560(%rbp), %rdx
leaq 0xde85e(%rip), %rsi     # 0x25adee
leaq -0x98(%rbp), %rdi
callq 0x17a40
jmp 0x17c59e
movq -0x558(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x2cd70
movq %rax, -0x568(%rbp)
jmp 0x17c5ba
movq -0x568(%rbp), %rdi
xorl %esi, %esi
callq 0x2cda0
jmp 0x17c5ca
leaq -0x98(%rbp), %rdi
callq 0xc6b8
leaq -0x99(%rbp), %rdi
callq 0xc3c0
leaq -0x50(%rbp), %rdi
callq 0xc6b8
leaq -0x70(%rbp), %rdi
callq 0xc6b8
leaq -0x71(%rbp), %rdi
callq 0xc3c0
movq -0x4a8(%rbp), %rax
movq %rax, %rcx
addq $0x98, %rcx
movq %rcx, -0x580(%rbp)
addq $0x5f8, %rax            # imm = 0x5F8
movq %rax, -0x578(%rbp)
leaq -0xe1(%rbp), %rdi
movq %rdi, -0x570(%rbp)
callq 0xc5e0
movq -0x570(%rbp), %rdx
leaq 0xde7c1(%rip), %rsi     # 0x25ae04
leaq -0xe0(%rbp), %rdi
callq 0x17a40
jmp 0x17c651
movq -0x578(%rbp), %rsi
leaq -0xc0(%rbp), %rdi
leaq -0xe0(%rbp), %rdx
callq 0x17de0
jmp 0x17c66d
movq -0x580(%rbp), %rdi
leaq -0xc0(%rbp), %rsi
callq 0x2c990
movq %rax, -0x588(%rbp)
jmp 0x17c689
leaq -0x109(%rbp), %rdi
movq %rdi, -0x590(%rbp)
callq 0xc5e0
movq -0x590(%rbp), %rdx
leaq 0xde76c(%rip), %rsi     # 0x25ae16
leaq -0x108(%rbp), %rdi
callq 0x17a40
jmp 0x17c6b8
movq -0x588(%rbp), %rdi
leaq -0x108(%rbp), %rsi
callq 0x2cd70
movq %rax, -0x598(%rbp)
jmp 0x17c6d4
movq -0x598(%rbp), %rdi
xorl %esi, %esi
callq 0x2cda0
jmp 0x17c6e4
leaq -0x108(%rbp), %rdi
callq 0xc6b8
leaq -0x109(%rbp), %rdi
callq 0xc3c0
leaq -0xc0(%rbp), %rdi
callq 0xc6b8
leaq -0xe0(%rbp), %rdi
callq 0xc6b8
leaq -0xe1(%rbp), %rdi
callq 0xc3c0
movq -0x4a8(%rbp), %rax
movq %rax, %rcx
addq $0x130, %rcx            # imm = 0x130
movq %rcx, -0x5b0(%rbp)
addq $0x5f8, %rax            # imm = 0x5F8
movq %rax, -0x5a8(%rbp)
leaq -0x151(%rbp), %rdi
movq %rdi, -0x5a0(%rbp)
callq 0xc5e0
movq -0x5a0(%rbp), %rdx
leaq 0xde6c7(%rip), %rsi     # 0x25ae2d
leaq -0x150(%rbp), %rdi
callq 0x17a40
jmp 0x17c774
movq -0x5a8(%rbp), %rsi
leaq -0x130(%rbp), %rdi
leaq -0x150(%rbp), %rdx
callq 0x17de0
jmp 0x17c790
movq -0x5b0(%rbp), %rdi
leaq -0x130(%rbp), %rsi
callq 0x2c990
movq %rax, -0x5b8(%rbp)
jmp 0x17c7ac
leaq -0x179(%rbp), %rdi
movq %rdi, -0x5c0(%rbp)
callq 0xc5e0
movq -0x5c0(%rbp), %rdx
leaq 0xde672(%rip), %rsi     # 0x25ae3f
leaq -0x178(%rbp), %rdi
callq 0x17a40
jmp 0x17c7db
movq -0x5b8(%rbp), %rdi
leaq -0x178(%rbp), %rsi
callq 0x2cd70
movq %rax, -0x5c8(%rbp)
jmp 0x17c7f7
movq -0x5c8(%rbp), %rdi
xorl %esi, %esi
callq 0x2cda0
jmp 0x17c807
leaq -0x178(%rbp), %rdi
callq 0xc6b8
leaq -0x179(%rbp), %rdi
callq 0xc3c0
leaq -0x130(%rbp), %rdi
callq 0xc6b8
leaq -0x150(%rbp), %rdi
callq 0xc6b8
leaq -0x151(%rbp), %rdi
callq 0xc3c0
movq -0x4a8(%rbp), %rax
movq %rax, %rcx
addq $0x1c8, %rcx            # imm = 0x1C8
movq %rcx, -0x5e0(%rbp)
addq $0x5f8, %rax            # imm = 0x5F8
movq %rax, -0x5d8(%rbp)
leaq -0x1c1(%rbp), %rdi
movq %rdi, -0x5d0(%rbp)
callq 0xc5e0
movq -0x5d0(%rbp), %rdx
leaq 0xde5cd(%rip), %rsi     # 0x25ae56
leaq -0x1c0(%rbp), %rdi
callq 0x17a40
jmp 0x17c897
movq -0x5d8(%rbp), %rsi
leaq -0x1a0(%rbp), %rdi
leaq -0x1c0(%rbp), %rdx
callq 0x17de0
jmp 0x17c8b3
movq -0x5e0(%rbp), %rdi
leaq -0x1a0(%rbp), %rsi
callq 0x2c990
movq %rax, -0x5e8(%rbp)
jmp 0x17c8cf
leaq -0x1e9(%rbp), %rdi
movq %rdi, -0x5f0(%rbp)
callq 0xc5e0
movq -0x5f0(%rbp), %rdx
leaq 0xde576(%rip), %rsi     # 0x25ae66
leaq -0x1e8(%rbp), %rdi
callq 0x17a40
jmp 0x17c8fe
movq -0x5e8(%rbp), %rdi
leaq -0x1e8(%rbp), %rsi
callq 0x2cd70
movq %rax, -0x5f8(%rbp)
jmp 0x17c91a
movq -0x5f8(%rbp), %rdi
xorl %esi, %esi
callq 0x2cda0
jmp 0x17c92a
leaq -0x1e8(%rbp), %rdi
callq 0xc6b8
leaq -0x1e9(%rbp), %rdi
callq 0xc3c0
leaq -0x1a0(%rbp), %rdi
callq 0xc6b8
leaq -0x1c0(%rbp), %rdi
callq 0xc6b8
leaq -0x1c1(%rbp), %rdi
callq 0xc3c0
movq -0x4a8(%rbp), %rax
movq %rax, %rcx
addq $0x260, %rcx            # imm = 0x260
movq %rcx, -0x610(%rbp)
addq $0x5f8, %rax            # imm = 0x5F8
movq %rax, -0x608(%rbp)
leaq -0x231(%rbp), %rdi
movq %rdi, -0x600(%rbp)
callq 0xc5e0
movq -0x600(%rbp), %rdx
leaq 0xde4e9(%rip), %rsi     # 0x25ae95
leaq -0x230(%rbp), %rdi
callq 0x17a40
jmp 0x17c9ba
movq -0x608(%rbp), %rsi
leaq -0x210(%rbp), %rdi
leaq -0x230(%rbp), %rdx
callq 0x17de0
jmp 0x17c9d6
movq -0x610(%rbp), %rdi
leaq -0x210(%rbp), %rsi
callq 0x2c990
movq %rax, -0x618(%rbp)
jmp 0x17c9f2
leaq -0x259(%rbp), %rdi
movq %rdi, -0x620(%rbp)
callq 0xc5e0
movq -0x620(%rbp), %rdx
leaq 0xde495(%rip), %rsi     # 0x25aea8
leaq -0x258(%rbp), %rdi
callq 0x17a40
jmp 0x17ca21
movq -0x618(%rbp), %rdi
leaq -0x258(%rbp), %rsi
callq 0x2cd70
movq %rax, -0x628(%rbp)
jmp 0x17ca3d
movq -0x628(%rbp), %rdi
xorl %esi, %esi
callq 0x2cda0
jmp 0x17ca4d
leaq -0x258(%rbp), %rdi
callq 0xc6b8
leaq -0x259(%rbp), %rdi
callq 0xc3c0
leaq -0x210(%rbp), %rdi
callq 0xc6b8
leaq -0x230(%rbp), %rdi
callq 0xc6b8
leaq -0x231(%rbp), %rdi
callq 0xc3c0
movq -0x4a8(%rbp), %rax
movq %rax, %rcx
addq $0x2f8, %rcx            # imm = 0x2F8
movq %rcx, -0x640(%rbp)
addq $0x5f8, %rax            # imm = 0x5F8
movq %rax, -0x638(%rbp)
leaq -0x2a1(%rbp), %rdi
movq %rdi, -0x630(%rbp)
callq 0xc5e0
movq -0x630(%rbp), %rdx
leaq 0xde3f1(%rip), %rsi     # 0x25aec0
leaq -0x2a0(%rbp), %rdi
callq 0x17a40
jmp 0x17cadd
movq -0x638(%rbp), %rsi
leaq -0x280(%rbp), %rdi
leaq -0x2a0(%rbp), %rdx
callq 0x17de0
jmp 0x17caf9
movq -0x640(%rbp), %rdi
leaq -0x280(%rbp), %rsi
callq 0x2c990
movq %rax, -0x648(%rbp)
jmp 0x17cb15
leaq -0x2c9(%rbp), %rdi
movq %rdi, -0x650(%rbp)
callq 0xc5e0
movq -0x650(%rbp), %rdx
leaq 0xde39e(%rip), %rsi     # 0x25aed4
leaq -0x2c8(%rbp), %rdi
callq 0x17a40
jmp 0x17cb44
movq -0x648(%rbp), %rdi
leaq -0x2c8(%rbp), %rsi
callq 0x2cd70
movq %rax, -0x658(%rbp)
jmp 0x17cb60
movq -0x658(%rbp), %rdi
xorl %esi, %esi
callq 0x2cda0
jmp 0x17cb70
leaq -0x2c8(%rbp), %rdi
callq 0xc6b8
leaq -0x2c9(%rbp), %rdi
callq 0xc3c0
leaq -0x280(%rbp), %rdi
callq 0xc6b8
leaq -0x2a0(%rbp), %rdi
callq 0xc6b8
leaq -0x2a1(%rbp), %rdi
callq 0xc3c0
movq -0x4a8(%rbp), %rax
movq %rax, %rcx
addq $0x390, %rcx            # imm = 0x390
movq %rcx, -0x670(%rbp)
addq $0x5f8, %rax            # imm = 0x5F8
movq %rax, -0x668(%rbp)
leaq -0x311(%rbp), %rdi
movq %rdi, -0x660(%rbp)
callq 0xc5e0
movq -0x660(%rbp), %rdx
leaq 0xde2fb(%rip), %rsi     # 0x25aeed
leaq -0x310(%rbp), %rdi
callq 0x17a40
jmp 0x17cc00
movq -0x668(%rbp), %rsi
leaq -0x2f0(%rbp), %rdi
leaq -0x310(%rbp), %rdx
callq 0x17de0
jmp 0x17cc1c
movq -0x670(%rbp), %rdi
leaq -0x2f0(%rbp), %rsi
callq 0x2c990
movq %rax, -0x678(%rbp)
jmp 0x17cc38
leaq -0x339(%rbp), %rdi
movq %rdi, -0x680(%rbp)
callq 0xc5e0
movq -0x680(%rbp), %rdx
leaq 0xde2a8(%rip), %rsi     # 0x25af01
leaq -0x338(%rbp), %rdi
callq 0x17a40
jmp 0x17cc67
movq -0x678(%rbp), %rdi
leaq -0x338(%rbp), %rsi
callq 0x2cd70
movq %rax, -0x688(%rbp)
jmp 0x17cc83
movq -0x688(%rbp), %rdi
xorl %esi, %esi
callq 0x2cda0
jmp 0x17cc93
leaq -0x338(%rbp), %rdi
callq 0xc6b8
leaq -0x339(%rbp), %rdi
callq 0xc3c0
leaq -0x2f0(%rbp), %rdi
callq 0xc6b8
leaq -0x310(%rbp), %rdi
callq 0xc6b8
leaq -0x311(%rbp), %rdi
callq 0xc3c0
movq -0x4a8(%rbp), %rax
movq %rax, %rcx
addq $0x428, %rcx            # imm = 0x428
movq %rcx, -0x6a0(%rbp)
addq $0x5f8, %rax            # imm = 0x5F8
movq %rax, -0x698(%rbp)
leaq -0x381(%rbp), %rdi
movq %rdi, -0x690(%rbp)
callq 0xc5e0
movq -0x690(%rbp), %rdx
leaq 0xde205(%rip), %rsi     # 0x25af1a
leaq -0x380(%rbp), %rdi
callq 0x17a40
jmp 0x17cd23
movq -0x698(%rbp), %rsi
leaq -0x360(%rbp), %rdi
leaq -0x380(%rbp), %rdx
callq 0x17de0
jmp 0x17cd3f
movq -0x6a0(%rbp), %rdi
leaq -0x360(%rbp), %rsi
callq 0x2c990
movq %rax, -0x6a8(%rbp)
jmp 0x17cd5b
leaq -0x3a9(%rbp), %rdi
movq %rdi, -0x6b0(%rbp)
callq 0xc5e0
movq -0x6b0(%rbp), %rdx
leaq 0xde1ae(%rip), %rsi     # 0x25af2a
leaq -0x3a8(%rbp), %rdi
callq 0x17a40
jmp 0x17cd8a
movq -0x6a8(%rbp), %rdi
leaq -0x3a8(%rbp), %rsi
callq 0x2cd70
movq %rax, -0x6b8(%rbp)
jmp 0x17cda6
movq -0x6b8(%rbp), %rdi
xorl %esi, %esi
callq 0x2cda0
jmp 0x17cdb6
leaq -0x3a8(%rbp), %rdi
callq 0xc6b8
leaq -0x3a9(%rbp), %rdi
callq 0xc3c0
leaq -0x360(%rbp), %rdi
callq 0xc6b8
leaq -0x380(%rbp), %rdi
callq 0xc6b8
leaq -0x381(%rbp), %rdi
callq 0xc3c0
movq -0x4a8(%rbp), %rax
movq %rax, %rcx
addq $0x4c0, %rcx            # imm = 0x4C0
movq %rcx, -0x6d0(%rbp)
addq $0x5f8, %rax            # imm = 0x5F8
movq %rax, -0x6c8(%rbp)
leaq -0x3f1(%rbp), %rdi
movq %rdi, -0x6c0(%rbp)
callq 0xc5e0
movq -0x6c0(%rbp), %rdx
leaq 0xde107(%rip), %rsi     # 0x25af3f
leaq -0x3f0(%rbp), %rdi
callq 0x17a40
jmp 0x17ce46
movq -0x6c8(%rbp), %rsi
leaq -0x3d0(%rbp), %rdi
leaq -0x3f0(%rbp), %rdx
callq 0x17de0
jmp 0x17ce62
movq -0x6d0(%rbp), %rdi
leaq -0x3d0(%rbp), %rsi
callq 0x2c990
movq %rax, -0x6d8(%rbp)
jmp 0x17ce7e
leaq -0x419(%rbp), %rdi
movq %rdi, -0x6e0(%rbp)
callq 0xc5e0
movq -0x6e0(%rbp), %rdx
leaq 0xde0b8(%rip), %rsi     # 0x25af57
leaq -0x418(%rbp), %rdi
callq 0x17a40
jmp 0x17cead
movq -0x6d8(%rbp), %rdi
leaq -0x418(%rbp), %rsi
callq 0x2cd70
movq %rax, -0x6e8(%rbp)
jmp 0x17cec9
movq -0x6e8(%rbp), %rdi
xorl %esi, %esi
callq 0x2cda0
jmp 0x17ced9
leaq -0x418(%rbp), %rdi
callq 0xc6b8
leaq -0x419(%rbp), %rdi
callq 0xc3c0
leaq -0x3d0(%rbp), %rdi
callq 0xc6b8
leaq -0x3f0(%rbp), %rdi
callq 0xc6b8
leaq -0x3f1(%rbp), %rdi
callq 0xc3c0
movq -0x4a8(%rbp), %rax
movq %rax, %rcx
addq $0x558, %rcx            # imm = 0x558
movq %rcx, -0x700(%rbp)
addq $0x5f8, %rax            # imm = 0x5F8
movq %rax, -0x6f8(%rbp)
leaq -0x461(%rbp), %rdi
movq %rdi, -0x6f0(%rbp)
callq 0xc5e0
movq -0x6f0(%rbp), %rdx
leaq 0xde01b(%rip), %rsi     # 0x25af76
leaq -0x460(%rbp), %rdi
callq 0x17a40
jmp 0x17cf69
movq -0x6f8(%rbp), %rsi
leaq -0x440(%rbp), %rdi
leaq -0x460(%rbp), %rdx
callq 0x17de0
jmp 0x17cf85
movq -0x700(%rbp), %rdi
leaq -0x440(%rbp), %rsi
callq 0x2c990
movq %rax, -0x708(%rbp)
jmp 0x17cfa1
leaq -0x489(%rbp), %rdi
movq %rdi, -0x710(%rbp)
callq 0xc5e0
movq -0x710(%rbp), %rdx
leaq 0xddfcb(%rip), %rsi     # 0x25af8d
leaq -0x488(%rbp), %rdi
callq 0x17a40
jmp 0x17cfd0
movq -0x708(%rbp), %rdi
leaq -0x488(%rbp), %rsi
callq 0x2cd70
movq %rax, -0x718(%rbp)
jmp 0x17cfec
movq -0x718(%rbp), %rdi
xorl %esi, %esi
callq 0x2cda0
jmp 0x17cffc
leaq -0x488(%rbp), %rdi
callq 0xc6b8
leaq -0x489(%rbp), %rdi
callq 0xc3c0
leaq -0x440(%rbp), %rdi
callq 0xc6b8
leaq -0x460(%rbp), %rdi
callq 0xc6b8
leaq -0x461(%rbp), %rdi
callq 0xc3c0
addq $0x720, %rsp            # imm = 0x720
popq %rbp
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d0af
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d0a6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d09d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d091
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x98(%rbp), %rdi
callq 0xc6b8
leaq -0x99(%rbp), %rdi
callq 0xc3c0
leaq -0x50(%rbp), %rdi
callq 0xc6b8
leaq -0x70(%rbp), %rdi
callq 0xc6b8
leaq -0x71(%rbp), %rdi
callq 0xc3c0
jmp 0x17d565
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d131
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d125
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d119
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d10d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x108(%rbp), %rdi
callq 0xc6b8
leaq -0x109(%rbp), %rdi
callq 0xc3c0
leaq -0xc0(%rbp), %rdi
callq 0xc6b8
leaq -0xe0(%rbp), %rdi
callq 0xc6b8
leaq -0xe1(%rbp), %rdi
callq 0xc3c0
jmp 0x17d565
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d1b6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d1aa
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d19e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d192
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x178(%rbp), %rdi
callq 0xc6b8
leaq -0x179(%rbp), %rdi
callq 0xc3c0
leaq -0x130(%rbp), %rdi
callq 0xc6b8
leaq -0x150(%rbp), %rdi
callq 0xc6b8
leaq -0x151(%rbp), %rdi
callq 0xc3c0
jmp 0x17d565
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d23b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d22f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d223
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d217
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x1e8(%rbp), %rdi
callq 0xc6b8
leaq -0x1e9(%rbp), %rdi
callq 0xc3c0
leaq -0x1a0(%rbp), %rdi
callq 0xc6b8
leaq -0x1c0(%rbp), %rdi
callq 0xc6b8
leaq -0x1c1(%rbp), %rdi
callq 0xc3c0
jmp 0x17d565
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d2c0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d2b4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d2a8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d29c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x258(%rbp), %rdi
callq 0xc6b8
leaq -0x259(%rbp), %rdi
callq 0xc3c0
leaq -0x210(%rbp), %rdi
callq 0xc6b8
leaq -0x230(%rbp), %rdi
callq 0xc6b8
leaq -0x231(%rbp), %rdi
callq 0xc3c0
jmp 0x17d565
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d345
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d339
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d32d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d321
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x2c8(%rbp), %rdi
callq 0xc6b8
leaq -0x2c9(%rbp), %rdi
callq 0xc3c0
leaq -0x280(%rbp), %rdi
callq 0xc6b8
leaq -0x2a0(%rbp), %rdi
callq 0xc6b8
leaq -0x2a1(%rbp), %rdi
callq 0xc3c0
jmp 0x17d565
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d3ca
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d3be
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d3b2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d3a6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x338(%rbp), %rdi
callq 0xc6b8
leaq -0x339(%rbp), %rdi
callq 0xc3c0
leaq -0x2f0(%rbp), %rdi
callq 0xc6b8
leaq -0x310(%rbp), %rdi
callq 0xc6b8
leaq -0x311(%rbp), %rdi
callq 0xc3c0
jmp 0x17d565
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d44f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d443
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d437
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d42b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x3a8(%rbp), %rdi
callq 0xc6b8
leaq -0x3a9(%rbp), %rdi
callq 0xc3c0
leaq -0x360(%rbp), %rdi
callq 0xc6b8
leaq -0x380(%rbp), %rdi
callq 0xc6b8
leaq -0x381(%rbp), %rdi
callq 0xc3c0
jmp 0x17d565
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d4d4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d4c8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d4bc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d4b0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x418(%rbp), %rdi
callq 0xc6b8
leaq -0x419(%rbp), %rdi
callq 0xc3c0
leaq -0x3d0(%rbp), %rdi
callq 0xc6b8
leaq -0x3f0(%rbp), %rdi
callq 0xc6b8
leaq -0x3f1(%rbp), %rdi
callq 0xc3c0
jmp 0x17d565
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d559
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d54d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d541
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x17d535
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x488(%rbp), %rdi
callq 0xc6b8
leaq -0x489(%rbp), %rdi
callq 0xc3c0
leaq -0x440(%rbp), %rdi
callq 0xc6b8
leaq -0x460(%rbp), %rdi
callq 0xc6b8
leaq -0x461(%rbp), %rdi
callq 0xc3c0
movq -0x518(%rbp), %rdi
callq 0x4b260
movq -0x520(%rbp), %rdi
callq 0x36810
movq -0x528(%rbp), %rdi
callq 0x4b280
movq -0x500(%rbp), %rdi
callq 0x4b2e0
movq -0x508(%rbp), %rdi
callq 0x4b1e0
movq -0x510(%rbp), %rdi
callq 0xc6b8
movq -0x4f0(%rbp), %rdi
callq 0x262b0
movq -0x4e8(%rbp), %rdi
callq 0x262b0
movq -0x4e0(%rbp), %rdi
callq 0x262b0
movq -0x4d8(%rbp), %rdi
callq 0x262b0
movq -0x4d0(%rbp), %rdi
callq 0x262b0
movq -0x4c8(%rbp), %rdi
callq 0x262b0
movq -0x4c0(%rbp), %rdi
callq 0x262b0
movq -0x4b8(%rbp), %rdi
callq 0x262b0
movq -0x498(%rbp), %rdi
callq 0x262b0
movq -0x4a0(%rbp), %rdi
callq 0x262b0
movq -0x28(%rbp), %rdi
callq 0xc5d0
nop