// File: /workspace/github_cpp_makefile_star2_O2/lvandeve[P]lodepng/pngdetail.cpp
// Function: printICCDetails(unsigned char const*, unsigned long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)
void printICCDetails(const unsigned char* icc, size_t size, const std::string& indent) {
  // 128 for header, 4 for num tags
  if(size < 132) {
    std::cout << indent << "Invalid ICC: too small to contain header" << std::endl;
    return;
  }
  if(printableICCWord(icc, size, 36) != "acsp") {
    std::cout << indent << "Invalid ICC: does not contain signature \"acsp\"" << std::endl;
    return;
  }

  std::cout << indent << "profile size: " << getICCUint32(icc, size, 0) << std::endl;
  std::cout << indent << "CMM type: " << printableICCWord(icc, size, 4) << std::endl;

  uint32_t version = getICCUint32(icc, size, 8);
  uint16_t version_major = (version >> 24) & 255;
  uint16_t version_minor = (version >> 20) & 15;
  uint16_t version_bugfix = (version >> 16) & 15;
  std::cout << indent << "version: " << version_major << "." << version_minor
            << "." << version_bugfix << std::endl;

  std::cout << indent << "device class: " << printableICCWord(icc, size, 12) << std::endl;
  std::cout << indent << "input space: \"" << printableICCWord(icc, size, 16) << "\", ";
  std::cout << "output space: \"" << printableICCWord(icc, size, 20) << "\"" << std::endl;
  std::cout << indent;
  printf("date: %02d-%02d-%02dT%02d:%02d:%02d\n",
         getICCUint16(icc, size, 24), getICCUint16(icc, size, 26), getICCUint16(icc, size, 28),
         getICCUint16(icc, size, 30), getICCUint16(icc, size, 32), getICCUint16(icc, size, 34));
  std::cout << indent << "signature: " << printableICCWord(icc, size, 36) << std::endl;
  std::cout << indent << "platform: " << printableICCWord(icc, size, 40) << std::endl;
  std::cout << indent << "flags: " << getICCUint32(icc, size, 44) << std::endl;
  std::cout << indent << "device manufacturer: " << printableICCWord(icc, size, 48) << ", ";
  std::cout << "device model: " << printableICCWord(icc, size, 52) << ", ";
  std::cout << "device attributes: " << getICCUint32(icc, size, 56) << " "
            << getICCUint32(icc, size, 60) << std::endl;
  std::cout << indent << "rendering intent: " << getICCUint32(icc, size, 64) << std::endl;

  float pcsx = getICC15Fixed16(icc, size, 68);
  float pcsy = getICC15Fixed16(icc, size, 72);
  float pcsz = getICC15Fixed16(icc, size, 76);
  float pcsxyz = pcsx + pcsy + pcsz;
  std::cout << indent << "xyz illuminant: X:" << pcsx << ", Y:" << pcsy << ", Z:" << pcsz
            << ", xy:" << (pcsx / pcsxyz) << "," << (pcsy / pcsxyz) << std::endl;

  std::cout << indent << "creator: " << printableICCWord(icc, size, 80) << std::endl;

  // The md5 is present in v2.4 and above profiles, but it's always shown anyway. Those
  // bytes are normally all zero for older versions.
  std::cout << indent;
  printf("md5: %08x%08x%08x%08x\n", getICCUint32(icc, size, 84), getICCUint32(icc, size, 88),
                                    getICCUint32(icc, size, 92), getICCUint32(icc, size, 96));

  size_t numtags = getICCUint32(icc, size, 128);
  std::cout << indent << "num icc tags: " << numtags << std::endl;
  if(size < 128 + 4 + numtags * 12) {
    std::cout << indent << "Invalid ICC: too small to contain tag descriptions" << std::endl;
    return;
  }
  for(size_t i = 0; i < numtags; i++) {
    size_t pos = 132 + i * 12;
    std::cout << indent << "icc tag: \"" << printableICCWord(icc, size, pos) << "\"";
    size_t offset = getICCUint32(icc, size, pos + 4);
    size_t tagsize = getICCUint32(icc, size, pos + 8);
    std::cout << ", offset: " << offset << ", size: " << tagsize;
    if(offset + tagsize > size || tagsize < 4) {
      std::cout << std::endl << indent << "Invalid ICC: tag out of range" << std::endl;
      return;
    }
    std::string datatype = printableICCWord(icc, size, offset);
    std::cout << ", datatype: \"" << datatype << "\"";
    if(datatype == "XYZ ") {
      float x = getICC15Fixed16(icc, size, offset + 8);
      float y = getICC15Fixed16(icc, size, offset + 12);
      float z = getICC15Fixed16(icc, size, offset + 16);
      float xyz = x + y + z;
      std::cout << ", X:" << x << ", Y:" << y << ", Z:" << z;
      if(xyz) std::cout << ", xy:" << (x / xyz) << "," << (y / xyz);
    }
    if(datatype == "curv") {
      size_t lutsize = getICCUint32(icc, size, offset + 8);
      std::cout << ", lookup table size: " << lutsize;
      if(lutsize == 1 && offset + 14 <= size) {
        std::cout << " (gamma: " << (getICCUint16(icc, size, offset + 12) / 256.0) << ")";
      }
      if(lutsize == 0) std::cout << " (linear)";
    }
    if(datatype == "para") {
      unsigned type = getICCUint16(icc, size, offset + 8);
      float gamma = getICC15Fixed16(icc, size, offset + 12);
      int numparams = (type == 4) ? 7 : ((type >= 1 && type <= 3) ? (type + 1) : 0);
      std::cout << " type: " << type << ", gamma: " <<  gamma;
      if(numparams > 0) {
        std::cout << ", params: ";
        for(int j = 0; j < numparams; j++) {
          if(j > 0) std::cout << ", ";
          std::cout << getICC15Fixed16(icc, size, offset + 16 + j * 4);
        }
      }
    }
    if(datatype == "sf32") {
      std::cout << ":";
      for(size_t j = 8; j < tagsize; j += 4) {
        float v = getICC15Fixed16(icc, size, offset + j);
        std::cout << " " << v;
      }
    }
    if(datatype == "chrm") {
      size_t numchannels = getICCUint16(icc, size, offset + 8);
      std::cout << ": n:" << numchannels
                << " phosphor:" << getICCUint16(icc, size, offset + 10);
      for(size_t j = 0; j < numchannels; j++) {
        std::cout << " xy:" << getICC16Fixed16(icc, size, offset + 12 + j * 8)
                  << "," << getICC16Fixed16(icc, size, offset + 12 + j * 8 + 4);
      }
    }
    if(datatype == "text" || datatype == "mluc" || datatype == "desc") {
      // TODO: this is a bit of a simplification of the parse for now, e.g.
      // ignoring UTF-16, instead implicitely skipping non-ASCII bytes, and
      // potentially printing things multiple times in a row if multiple
      // variants are in desc or mluc.
      std::cout << ": ";
      for(size_t j = (datatype == "mluc" ? 28 : 8); j < tagsize; j++) {
        char c = icc[offset + j];
        if(c >= 32 && c < 127) std::cout << c;
      }
    }
    std::cout << std::endl;
  }
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x58, %rsp
movq %rdx, %r15
cmpq $0x83, %rsi
ja 0x1569e
movq 0x1195f(%rip), %rdi     # 0x26fd0
movq %r15, %rsi
callq 0x21e0
leaq 0x95ce(%rip), %rsi      # 0x1ec4e
movq %rax, %rdi
callq 0x2210
movq %rax, %rdi
addq $0x58, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x2100
movq %rsi, %r14
movq %rdi, %r12
leaq 0x20(%rsp), %rbx
pushq $0x24
popq %rcx
movq %rbx, %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x1655e
leaq 0x95b6(%rip), %rsi      # 0x1ec77
movq %rbx, %rdi
callq 0x1938b
movl %eax, %ebx
leaq 0x20(%rsp), %rdi
callq 0x22a0
movq 0x118f4(%rip), %rdi     # 0x26fd0
movq %r15, %rsi
callq 0x21e0
testb %bl, %bl
je 0x156f4
leaq 0x958d(%rip), %rsi      # 0x1ec7c
jmp 0x1645f
leaq 0x95b0(%rip), %rsi      # 0x1ecab
movq %rax, %rdi
callq 0x2210
movq %rax, %rbx
movq %r12, %rdi
movq %r14, %rsi
xorl %edx, %edx
callq 0x165ef
movl %eax, %esi
movq %rbx, %rdi
callq 0x2150
movq %rax, %rdi
callq 0x2100
movq 0x118a4(%rip), %rdi     # 0x26fd0
movq %r15, 0x48(%rsp)
movq %r15, %rsi
callq 0x21e0
leaq 0x957a(%rip), %rsi      # 0x1ecba
movq %rax, %rdi
callq 0x2210
movq %rax, %rbx
leaq 0x20(%rsp), %r15
pushq $0x4
popq %rcx
movq %r15, %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x1655e
movq %rbx, %rdi
movq %r15, %rsi
callq 0x21e0
movq %rax, %rdi
callq 0x2100
leaq 0x20(%rsp), %rdi
callq 0x22a0
pushq $0x8
popq %rdx
movq %r12, %rdi
movq %r14, %rsi
callq 0x165ef
movq %r12, 0x10(%rsp)
movl %eax, %ebp
movl %eax, %r15d
shrl $0x18, %r15d
movl %eax, %r12d
shrl $0x14, %r12d
shrl $0x10, %ebp
movq 0x11825(%rip), %rbx     # 0x26fd0
movq %rbx, %rdi
movq 0x48(%rsp), %r13
movq %r13, %rsi
callq 0x21e0
leaq 0x89d7(%rip), %rsi      # 0x1e199
movq %rax, %rdi
callq 0x2210
movq %rax, %rdi
movl %r15d, %esi
callq 0x2370
leaq 0x9463(%rip), %r15      # 0x1ec3f
movq %rax, %rdi
movq %r15, %rsi
callq 0x2210
andl $0xf, %r12d
movq %rax, %rdi
movl %r12d, %esi
callq 0x2370
movq %rax, %rdi
movq %r15, %rsi
callq 0x2210
andl $0xf, %ebp
movq %rax, %rdi
movl %ebp, %esi
movq 0x10(%rsp), %rbp
callq 0x2370
movq %rax, %rdi
callq 0x2100
movq %rbx, %rdi
movq %r13, %rsi
callq 0x21e0
leaq 0x9498(%rip), %rsi      # 0x1ecc5
movq %rax, %rdi
callq 0x2210
movq %rax, %rbx
leaq 0x20(%rsp), %r15
pushq $0xc
popq %rcx
movq %r15, %rdi
movq %rbp, %rsi
movq %r14, %rdx
callq 0x1655e
movq %rbx, %rdi
movq %r15, %rsi
callq 0x21e0
movq %rax, %rdi
callq 0x2100
leaq 0x20(%rsp), %rdi
callq 0x22a0
movq 0x1175e(%rip), %rdi     # 0x26fd0
movq %r13, %rsi
callq 0x21e0
leaq 0x9453(%rip), %rsi      # 0x1ecd4
movq %rax, %rdi
callq 0x2210
movq %rax, %rbx
leaq 0x20(%rsp), %r15
pushq $0x10
popq %rcx
movq %r15, %rdi
movq %rbp, %rsi
movq %r14, %rdx
callq 0x1655e
movq %rbx, %rdi
movq %r15, %rsi
callq 0x21e0
leaq 0x942f(%rip), %rsi      # 0x1ece3
movq %rax, %rdi
callq 0x2210
leaq 0x20(%rsp), %rdi
callq 0x22a0
movq 0x11703(%rip), %rdi     # 0x26fd0
leaq 0x9413(%rip), %rsi      # 0x1ece7
callq 0x2210
movq %rax, %rbx
leaq 0x20(%rsp), %r15
pushq $0x14
popq %rcx
movq %r15, %rdi
movq %rbp, %rsi
movq %r14, %rdx
callq 0x1655e
movq %rbx, %rdi
movq %r15, %rsi
callq 0x21e0
leaq 0x93dd(%rip), %rsi      # 0x1ece1
movq %rax, %rdi
callq 0x2210
movq %rax, %rdi
callq 0x2100
leaq 0x20(%rsp), %rdi
callq 0x22a0
movq 0x116ab(%rip), %rbx     # 0x26fd0
movq %rbx, %rdi
movq %r13, %rsi
callq 0x21e0
movzwl 0x18(%rbp), %eax
movzwl 0x1a(%rbp), %ecx
rolw $0x8, %ax
movzwl %ax, %esi
rolw $0x8, %cx
movzwl %cx, %edx
movzwl 0x1c(%rbp), %eax
rolw $0x8, %ax
movzwl %ax, %ecx
movzwl 0x1e(%rbp), %eax
rolw $0x8, %ax
movzwl %ax, %r8d
movzwl 0x20(%rbp), %eax
rolw $0x8, %ax
movzwl %ax, %r9d
movzwl 0x22(%rbp), %eax
rolw $0x8, %ax
movzwl %ax, %eax
movl %eax, (%rsp)
leaq 0x9379(%rip), %rdi      # 0x1ecf7
xorl %eax, %eax
callq 0x2050
movq %rbx, %rdi
movq %r13, %rsi
callq 0x21e0
leaq 0x9385(%rip), %rsi      # 0x1ed1c
movq %rax, %rdi
callq 0x2210
movq %rax, %rbx
leaq 0x20(%rsp), %r15
pushq $0x24
popq %rcx
movq %r15, %rdi
movq %rbp, %rsi
movq %r14, %rdx
callq 0x1655e
movq %rbx, %rdi
movq %r15, %rsi
callq 0x21e0
movq %rax, %rdi
callq 0x2100
leaq 0x20(%rsp), %rdi
callq 0x22a0
movq 0x115f4(%rip), %rdi     # 0x26fd0
movq %r13, %rsi
callq 0x21e0
leaq 0x933d(%rip), %rsi      # 0x1ed28
movq %rax, %rdi
callq 0x2210
movq %rax, %rbx
leaq 0x20(%rsp), %r15
pushq $0x28
popq %rcx
movq %r15, %rdi
movq %rbp, %rsi
movq %r14, %rdx
callq 0x1655e
movq %rbx, %rdi
movq %r15, %rsi
callq 0x21e0
movq %rax, %rdi
callq 0x2100
leaq 0x20(%rsp), %rdi
callq 0x22a0
movq 0x115a0(%rip), %rbx     # 0x26fd0
movq %rbx, %rdi
movq %r13, %rsi
callq 0x21e0
leaq 0x92f1(%rip), %rsi      # 0x1ed33
movq %rax, %rdi
callq 0x2210
movq %rax, %r15
pushq $0x2c
popq %rdx
movq %rbp, %rdi
movq %r14, %rsi
callq 0x165ef
movl %eax, %esi
movq %r15, %rdi
callq 0x2150
movq %rax, %rdi
callq 0x2100
movq %rbx, %rdi
movq %r13, %rsi
callq 0x21e0
leaq 0x92bc(%rip), %rsi      # 0x1ed3b
movq %rax, %rdi
callq 0x2210
movq %rax, %rbx
leaq 0x20(%rsp), %r15
pushq $0x30
popq %rcx
movq %r15, %rdi
movq %rbp, %rsi
movq %r14, %rdx
callq 0x1655e
movq %rbx, %rdi
movq %r15, %rsi
callq 0x21e0
leaq 0x9232(%rip), %rsi      # 0x1ece4
movq %rax, %rdi
callq 0x2210
leaq 0x20(%rsp), %rdi
callq 0x22a0
movq 0x11505(%rip), %rdi     # 0x26fd0
leaq 0x927f(%rip), %rsi      # 0x1ed51
callq 0x2210
movq %rax, %rbx
leaq 0x20(%rsp), %r15
pushq $0x34
popq %rcx
movq %r15, %rdi
movq %rbp, %rsi
movq %r14, %rdx
callq 0x1655e
movq %rbx, %rdi
movq %r15, %rsi
callq 0x21e0
leaq 0x91e2(%rip), %rsi      # 0x1ece4
movq %rax, %rdi
callq 0x2210
leaq 0x20(%rsp), %rdi
callq 0x22a0
movq 0x114b5(%rip), %rbx     # 0x26fd0
leaq 0x923e(%rip), %rsi      # 0x1ed60
movq %rbx, %rdi
callq 0x2210
movq %rax, %r15
pushq $0x38
popq %rdx
movq %rbp, %rdi
movq %r14, %rsi
callq 0x165ef
movl %eax, %esi
movq %r15, %rdi
callq 0x2150
leaq 0x9604(%rip), %rsi      # 0x1f150
movq %rax, %rdi
callq 0x2210
movq %rax, %r15
pushq $0x3c
popq %rdx
movq %rbp, %rdi
movq %r14, %rsi
callq 0x165ef
movl %eax, %esi
movq %r15, %rdi
callq 0x2150
movq %rax, %rdi
callq 0x2100
movq %rbx, %rdi
movq %r13, %rsi
callq 0x21e0
leaq 0x94ea(%rip), %rsi      # 0x1f073
movq %rax, %rdi
callq 0x2210
movq %rax, %r15
pushq $0x40
popq %rdx
movq %rbp, %rdi
movq %r14, %rsi
callq 0x165ef
movl %eax, %esi
movq %r15, %rdi
callq 0x2150
movq %rax, %rdi
callq 0x2100
pushq $0x44
popq %rdx
movq %rbp, %rdi
movq %r14, %rsi
callq 0x16600
movss %xmm0, 0x40(%rsp)
pushq $0x48
popq %rdx
movq %rbp, %rdi
movq %r14, %rsi
callq 0x16600
movss %xmm0, 0xc(%rsp)
pushq $0x4c
popq %rdx
movq %rbp, %rdi
movq %r14, %rsi
callq 0x16600
movss %xmm0, 0x18(%rsp)
movss 0x40(%rsp), %xmm1
addss 0xc(%rsp), %xmm1
addss %xmm0, %xmm1
movss %xmm1, 0x1c(%rsp)
movq %rbx, %rdi
movq %r13, %rsi
callq 0x21e0
leaq 0x915c(%rip), %rsi      # 0x1ed74
movq %rax, %rdi
callq 0x2210
movq %rax, %rdi
movss 0x40(%rsp), %xmm0
callq 0x2180
leaq 0x9152(%rip), %rsi      # 0x1ed87
movq %rax, %rdi
callq 0x2210
movq %rax, %rdi
movss 0xc(%rsp), %xmm0
callq 0x2180
leaq 0x913a(%rip), %rsi      # 0x1ed8c
movq %rax, %rdi
callq 0x2210
movq %rax, %rdi
movss 0x18(%rsp), %xmm0
callq 0x2180
leaq 0x9122(%rip), %rsi      # 0x1ed91
movq %rax, %rdi
callq 0x2210
movss 0x40(%rsp), %xmm0
divss 0x1c(%rsp), %xmm0
movq %rax, %rdi
callq 0x2180
leaq 0x9105(%rip), %rsi      # 0x1ed97
movq %rax, %rdi
callq 0x2210
movss 0xc(%rsp), %xmm0
divss 0x1c(%rsp), %xmm0
movq %rax, %rdi
callq 0x2180
movq %rax, %rdi
callq 0x2100
movq %rbx, %rdi
movq %r13, %rsi
callq 0x21e0
leaq 0x90d1(%rip), %rsi      # 0x1ed99
movq %rax, %rdi
callq 0x2210
movq %rax, %rbx
leaq 0x20(%rsp), %r15
pushq $0x50
popq %rcx
movq %r15, %rdi
movq %rbp, %rsi
movq %r14, %rdx
callq 0x1655e
movq %rbx, %rdi
movq %r15, %rsi
callq 0x21e0
movq %rax, %rdi
callq 0x2100
leaq 0x20(%rsp), %rdi
callq 0x22a0
movq 0x112c3(%rip), %r12     # 0x26fd0
movq %r12, %rdi
movq %r13, %rsi
callq 0x21e0
pushq $0x54
popq %rdx
movq %rbp, %rdi
movq %r14, %rsi
callq 0x165ef
movl %eax, %ebx
pushq $0x58
popq %rdx
movq %rbp, %rdi
movq %r14, %rsi
callq 0x165ef
movl %eax, %ebp
pushq $0x5c
popq %rdx
movq 0x10(%rsp), %rdi
movq %r14, %rsi
callq 0x165ef
movl %eax, %r15d
pushq $0x60
popq %rdx
movq 0x10(%rsp), %rdi
movq %r14, %rsi
callq 0x165ef
leaq 0x9041(%rip), %rdi      # 0x1eda3
movl %ebx, %esi
movl %ebp, %edx
movq 0x10(%rsp), %rbp
movq 0x48(%rsp), %r13
movl %r15d, %ecx
movl %eax, %r8d
xorl %eax, %eax
callq 0x2050
movl $0x80, %edx
movq %rbp, %rdi
movq %r14, %rsi
callq 0x165ef
movl %eax, %ebx
movq %r12, %rdi
movq %r13, %rsi
callq 0x21e0
leaq 0x9019(%rip), %rsi      # 0x1edba
movq %rax, %rdi
callq 0x2210
movq %rax, %rdi
movq %rbx, %rsi
callq 0x2150
movq %rax, %rdi
callq 0x2100
movq %rbx, 0x50(%rsp)
imulq $0xc, %rbx, %rax
addq $0x84, %rax
cmpq %r14, %rax
jbe 0x15deb
movq 0x111f9(%rip), %rdi     # 0x26fd0
movq %r13, %rsi
callq 0x21e0
leaq 0x8fe3(%rip), %rsi      # 0x1edc9
jmp 0x1645f
xorl %eax, %eax
cmpq 0x50(%rsp), %rax
je 0x1646f
movq %rax, 0x40(%rsp)
imulq $0xc, %rax, %r12
leaq 0x84(%r12), %rbx
movq 0x111c0(%rip), %rdi     # 0x26fd0
movq %r13, %rsi
callq 0x21e0
movq %rax, %rdi
leaq 0x8fda(%rip), %rsi      # 0x1edfc
callq 0x2210
movq %rax, %r15
leaq 0x20(%rsp), %r13
movq %r13, %rdi
movq %rbp, %rsi
movq %r14, %rdx
movq %rbx, %rcx
callq 0x1655e
movq %r15, %rdi
movq %r13, %rsi
callq 0x21e0
movq %rax, %rdi
leaq 0x8e8c(%rip), %rsi      # 0x1ece1
callq 0x2210
leaq 0x20(%rsp), %rdi
callq 0x22a0
leaq 0x88(%r12), %rdx
movq %rbp, %rdi
movq %r14, %rsi
callq 0x165ef
movl %eax, %ebx
addq $0x8c, %r12
movq %rbp, %rdi
movq %r14, %rsi
movq %r12, %rdx
callq 0x165ef
movl %eax, %r15d
movl %eax, %ebp
movq 0x11136(%rip), %rdi     # 0x26fd0
leaq 0x8f66(%rip), %rsi      # 0x1ee07
callq 0x2210
movq %rax, %rdi
movq %rbx, %rsi
callq 0x2150
movq %rax, %rdi
leaq 0x8f57(%rip), %rsi      # 0x1ee12
callq 0x2210
movq %rax, %rdi
movq %rbp, %rsi
callq 0x2150
cmpl $0x4, %r15d
jb 0x1643f
leaq (%rbx,%rbp), %rax
cmpq %r14, %rax
ja 0x1643f
leaq 0x20(%rsp), %rdi
movq 0x10(%rsp), %rsi
movq %r14, %rdx
movq %rbx, %rcx
callq 0x1655e
movq 0x110d2(%rip), %rdi     # 0x26fd0
leaq 0x8f34(%rip), %rsi      # 0x1ee39
callq 0x2210
movq %rax, %rdi
leaq 0x20(%rsp), %rsi
callq 0x21e0
movq %rax, %rdi
leaq 0x8dc0(%rip), %rsi      # 0x1ece1
callq 0x2210
leaq 0x20(%rsp), %rdi
leaq 0x8f15(%rip), %rsi      # 0x1ee47
callq 0x12180
testb %al, %al
je 0x1604b
leaq 0x8(%rbx), %rdx
movq 0x10(%rsp), %r15
movq %r15, %rdi
movq %r14, %rsi
callq 0x16600
movss %xmm0, 0xc(%rsp)
leaq 0xc(%rbx), %rdx
movq %r15, %rdi
movq %r14, %rsi
callq 0x16600
movss %xmm0, 0x1c(%rsp)
leaq 0x10(%rbx), %rdx
movq %r15, %rdi
movq %r14, %rsi
callq 0x16600
movss %xmm0, 0x18(%rsp)
movq 0x11046(%rip), %rdi     # 0x26fd0
leaq 0x8ebb(%rip), %rsi      # 0x1ee4c
callq 0x2210
movq %rax, %rdi
movss 0xc(%rsp), %xmm0
callq 0x2180
movq %rax, %rdi
leaq 0x8dd9(%rip), %rsi      # 0x1ed87
callq 0x2210
movq %rax, %rdi
movss 0x1c(%rsp), %xmm0
callq 0x2180
movq %rax, %rdi
leaq 0x8dc1(%rip), %rsi      # 0x1ed8c
callq 0x2210
movq %rax, %rdi
movss 0x18(%rsp), %xmm0
callq 0x2180
movss 0xc(%rsp), %xmm0
addss 0x1c(%rsp), %xmm0
addss 0x18(%rsp), %xmm0
movss %xmm0, 0x18(%rsp)
ucomiss 0x8043(%rip), %xmm0     # 0x1e040
jne 0x16001
jnp 0x1604b
movq 0x10fc8(%rip), %rdi     # 0x26fd0
leaq 0x8d82(%rip), %rsi      # 0x1ed91
callq 0x2210
movss 0xc(%rsp), %xmm0
divss 0x18(%rsp), %xmm0
movq %rax, %rdi
callq 0x2180
movq %rax, %rdi
leaq 0x8d65(%rip), %rsi      # 0x1ed97
callq 0x2210
movss 0x1c(%rsp), %xmm0
divss 0x18(%rsp), %xmm0
movq %rax, %rdi
callq 0x2180
leaq 0x20(%rsp), %rdi
leaq 0x7ede(%rip), %rsi      # 0x1df35
callq 0x12180
testb %al, %al
je 0x16107
leaq 0x8(%rbx), %rdx
movq 0x10(%rsp), %rdi
movq %r14, %rsi
callq 0x165ef
movl %eax, %r12d
movq 0x10f51(%rip), %rdi     # 0x26fd0
leaq 0x8dcb(%rip), %rsi      # 0x1ee51
callq 0x2210
movl %r12d, %esi
movq %rax, %rdi
callq 0x2150
cmpl $0x1, %r12d
setne %al
leaq 0xe(%rbx), %rcx
cmpq %r14, %rcx
seta %cl
orb %al, %cl
je 0x160c0
movq 0x10f1e(%rip), %rax     # 0x26fd0
leaq 0x8db8(%rip), %rsi      # 0x1ee71
testl %r12d, %r12d
jne 0x16107
jmp 0x160ff
movq 0x10f09(%rip), %rdi     # 0x26fd0
leaq 0x8d99(%rip), %rsi      # 0x1ee67
callq 0x2210
movq 0x10(%rsp), %rcx
movzwl 0xc(%rcx,%rbx), %ecx
rolw $0x8, %cx
movzwl %cx, %ecx
cvtsi2sd %ecx, %xmm0
mulsd 0x7f30(%rip), %xmm0     # 0x1e020
movq %rax, %rdi
callq 0x2330
leaq 0x7e89(%rip), %rsi      # 0x1df88
movq %rax, %rdi
callq 0x2210
leaq 0x20(%rsp), %rdi
leaq 0x7e27(%rip), %rsi      # 0x1df3a
callq 0x12180
testb %al, %al
je 0x16214
leaq 0xa(%rbx), %rax
xorl %r12d, %r12d
cmpq %r14, %rax
ja 0x1613e
movq 0x10(%rsp), %rax
movzwl 0x8(%rax,%rbx), %eax
rolw $0x8, %ax
movzwl %ax, %r12d
leaq 0xc(%rbx), %rdx
movq 0x10(%rsp), %rdi
movq %r14, %rsi
callq 0x16600
leal -0x1(%r12), %eax
leal 0x1(%r12), %r15d
cmpl $0x3, %eax
movl $0x0, %eax
cmovael %eax, %r15d
movss %xmm0, 0xc(%rsp)
cmpl $0x4, %r12d
pushq $0x7
popq %rax
cmovel %eax, %r15d
movq 0x10e53(%rip), %rdi     # 0x26fd0
leaq 0x8b39(%rip), %rsi      # 0x1ecbd
callq 0x2210
movl %r12d, %esi
movq %rax, %rdi
callq 0x2150
movq %rax, %rdi
leaq 0x8cdd(%rip), %rsi      # 0x1ee7b
callq 0x2210
movq %rax, %rdi
movss 0xc(%rsp), %xmm0
callq 0x2180
testl %r15d, %r15d
je 0x16214
movq 0x10e13(%rip), %rdi     # 0x26fd0
leaq 0x8cc1(%rip), %rsi      # 0x1ee85
callq 0x2210
leaq 0x10(%rbx), %r12
shll $0x2, %r15d
xorl %r13d, %r13d
cmpq %r13, %r15
je 0x16214
testq %r13, %r13
je 0x161f1
movq 0x10deb(%rip), %rdi     # 0x26fd0
leaq 0x8af8(%rip), %rsi      # 0x1ece4
callq 0x2210
leaq (%r12,%r13), %rdx
movq 0x10(%rsp), %rdi
movq %r14, %rsi
callq 0x16600
movq 0x10dc7(%rip), %rdi     # 0x26fd0
callq 0x2180
addq $0x4, %r13
jmp 0x161d4
leaq 0x20(%rsp), %rdi
leaq 0x8c70(%rip), %rsi      # 0x1ee90
callq 0x12180
testb %al, %al
je 0x16283
movq 0x10da0(%rip), %rdi     # 0x26fd0
leaq 0x86dc(%rip), %rsi      # 0x1e913
callq 0x2210
pushq $0x8
popq %r15
cmpq %rbp, %r15
jae 0x16283
leaq (%rbx,%r15), %rdx
movq 0x10(%rsp), %rdi
movq %r14, %rsi
callq 0x16600
movss %xmm0, 0xc(%rsp)
movq 0x10d6d(%rip), %rdi     # 0x26fd0
leaq 0x8ee6(%rip), %rsi      # 0x1f150
callq 0x2210
movq %rax, %rdi
movss 0xc(%rsp), %xmm0
callq 0x2180
addq $0x4, %r15
jmp 0x16240
leaq 0x20(%rsp), %rdi
leaq 0x8c06(%rip), %rsi      # 0x1ee95
callq 0x12180
testb %al, %al
je 0x16378
leaq 0xa(%rbx), %rax
cmpq %r14, %rax
jbe 0x162aa
xorl %r12d, %r12d
jmp 0x162bc
movq 0x10(%rsp), %rax
movzwl 0x8(%rax,%rbx), %eax
rolw $0x8, %ax
movzwl %ax, %r12d
movq 0x10d0d(%rip), %rdi     # 0x26fd0
leaq 0x8bd0(%rip), %rsi      # 0x1ee9a
callq 0x2210
movq %rax, %rdi
movq %r12, %rsi
callq 0x2150
movq %rax, %rdi
leaq 0x8bbb(%rip), %rsi      # 0x1ee9f
callq 0x2210
leaq 0xc(%rbx), %rcx
cmpq %r14, %rcx
jbe 0x162f6
xorl %esi, %esi
jmp 0x16307
movq 0x10(%rsp), %rcx
movzwl 0xa(%rcx,%rbx), %ecx
rolw $0x8, %cx
movzwl %cx, %esi
movq %rax, %rdi
callq 0x2150
leaq 0x10(%rbx), %r13
subq $0x1, %r12
jb 0x16378
movq 0x10cb0(%rip), %rdi     # 0x26fd0
leaq 0x8a6b(%rip), %rsi      # 0x1ed92
callq 0x2210
movq %rax, %r15
leaq -0x4(%r13), %rdx
movq 0x10(%rsp), %rdi
movq %r14, %rsi
callq 0x16622
movq %r15, %rdi
callq 0x2180
movq %rax, %rdi
leaq 0x8a45(%rip), %rsi      # 0x1ed97
callq 0x2210
movq %rax, %r15
movq 0x10(%rsp), %rdi
movq %r14, %rsi
movq %r13, %rdx
callq 0x16622
movq %r15, %rdi
callq 0x2180
addq $0x8, %r13
jmp 0x16313
leaq 0x20(%rsp), %rdi
leaq 0x8b26(%rip), %rsi      # 0x1eeaa
callq 0x12180
testb %al, %al
jne 0x163b7
leaq 0x20(%rsp), %rdi
leaq 0x8b16(%rip), %rsi      # 0x1eeaf
callq 0x12180
testb %al, %al
jne 0x163b7
leaq 0x20(%rsp), %rdi
leaq 0x8b06(%rip), %rsi      # 0x1eeb4
callq 0x12180
testb %al, %al
je 0x16412
movq 0x10c12(%rip), %rdi     # 0x26fd0
leaq 0x8f97(%rip), %rsi      # 0x1f35c
callq 0x2210
leaq 0x20(%rsp), %rdi
leaq 0x8ad9(%rip), %rsi      # 0x1eeaf
callq 0x12180
testb %al, %al
pushq $0x8
popq %r15
pushq $0x1c
popq %rax
cmovneq %rax, %r15
addq 0x10(%rsp), %rbx
cmpq %rbp, %r15
jae 0x16412
movb (%rbx,%r15), %al
leal -0x20(%rax), %ecx
cmpb $0x5e, %cl
ja 0x1640d
movsbl %al, %esi
movq 0x10bc8(%rip), %rdi     # 0x26fd0
callq 0x2270
incq %r15
jmp 0x163ed
movq 0x10bb7(%rip), %rdi     # 0x26fd0
callq 0x2100
leaq 0x20(%rsp), %rdi
callq 0x22a0
movq 0x40(%rsp), %rax
incq %rax
movq 0x48(%rsp), %r13
movq 0x10(%rsp), %rbp
jmp 0x15ded
movq 0x10b8a(%rip), %rdi     # 0x26fd0
callq 0x2100
movq %rax, %rdi
movq 0x48(%rsp), %rsi
callq 0x21e0
leaq 0x89bc(%rip), %rsi      # 0x1ee1b
movq %rax, %rdi
callq 0x2210
movq %rax, %rdi
callq 0x2100
addq $0x58, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x22a0
jmp 0x1654e
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x22a0
jmp 0x1654e
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x22a0
jmp 0x1654e
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x22a0
jmp 0x1654e
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x22a0
jmp 0x1654e
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x22a0
jmp 0x1654e
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x22a0
jmp 0x1654e
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x22a0
jmp 0x1654e
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x22a0
jmp 0x1654e
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x22a0
jmp 0x1654e
jmp 0x16541
jmp 0x16541
jmp 0x16541
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x22a0
jmp 0x1654e
jmp 0x16541
jmp 0x16541
jmp 0x16541
jmp 0x16541
jmp 0x16541
jmp 0x16541
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x22a0
movq %rbx, %rdi
callq 0x23a0
movq %rax, %rdi
callq 0xe69c