user: What is the c source code of the assembly code below?

```asm
<BLZ_Code>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %esi,-0x7c(%rbp)
  mov    %rdx,-0x88(%rbp)
  mov    %ecx,-0x80(%rbp)
  movl   $0x0,-0x50(%rbp)
  mov    -0x7c(%rbp),%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0x7c(%rbp),%eax
  add    $0x7,%eax
  lea    0x7(%rax),%edx
  test   %eax,%eax
  cmovs  %edx,%eax
  sar    $0x3,%eax
  mov    %eax,%edx
  mov    -0x7c(%rbp),%eax
  add    %edx,%eax
  add    $0xb,%eax
  mov    %eax,-0x48(%rbp)
  mov    -0x48(%rbp),%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <Memory@plt>
  mov    %rax,-0x30(%rbp)
  mov    -0x7c(%rbp),%edx
  mov    -0x78(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <BLZ_Invert@plt>
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x78(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x7c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  movb   $0x0,-0x6d(%rbp)
  jmp    L477
L558:
  shrb   -0x6d(%rbp)
  cmpb   $0x0,-0x6d(%rbp)
  jne    L138
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x28(%rbp)
  movb   $0x80,-0x6d(%rbp)
L138:
  movl   $0x2,-0x60(%rbp)
  mov    -0x20(%rbp),%rax
  sub    -0x78(%rbp),%rax
  mov    $0x1002,%edx
  cmp    %rdx,%rax
  cmovg  %rdx,%rax
  mov    %eax,-0x3c(%rbp)
  movl   $0x3,-0x64(%rbp)
  jmp    L522
L579:
  movl   $0x0,-0x68(%rbp)
  jmp    L594
L248:
  mov    -0x68(%rbp),%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  cmp    %rax,-0x10(%rbp)
  je     L384
  mov    -0x68(%rbp),%eax
  cmp    -0x64(%rbp),%eax
  jae    L639
  mov    -0x68(%rbp),%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x68(%rbp),%eax
  mov    -0x64(%rbp),%ecx
  sub    %rcx,%rax
  mov    %rax,%rsi
  mov    -0x20(%rbp),%rax
  add    %rsi,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L634
  addl   $0x1,-0x68(%rbp)
L594:
  cmpl   $0x11,-0x68(%rbp)
  jbe    L248
  jmp    L451
L384:
  nop
  jmp    L451
L639:
  nop
  jmp    L451
L634:
  nop
L451:
  mov    -0x68(%rbp),%eax
  cmp    -0x60(%rbp),%eax
  jbe    L247
  mov    -0x64(%rbp),%eax
  mov    %eax,-0x5c(%rbp)
  mov    -0x68(%rbp),%eax
  mov    %eax,-0x60(%rbp)
  cmpl   $0x12,-0x60(%rbp)
  je     L192
L247:
  addl   $0x1,-0x64(%rbp)
L522:
  mov    -0x64(%rbp),%eax
  cmp    -0x3c(%rbp),%eax
  jbe    L579
  jmp    L128
L192:
  nop
L128:
  cmpl   $0x0,-0x80(%rbp)
  je     L641
  cmpl   $0x2,-0x60(%rbp)
  jbe    L641
  mov    -0x60(%rbp),%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  cmp    %rax,-0x10(%rbp)
  jbe    L641
  mov    -0x60(%rbp),%eax
  add    %rax,-0x20(%rbp)
  movl   $0x2,-0x58(%rbp)
  mov    -0x20(%rbp),%rax
  sub    -0x78(%rbp),%rax
  mov    $0x1002,%edx
  cmp    %rdx,%rax
  cmovg  %rdx,%rax
  mov    %eax,-0x3c(%rbp)
  movl   $0x3,-0x64(%rbp)
  jmp    L587
L77:
  movl   $0x0,-0x68(%rbp)
  jmp    L516
L270:
  mov    -0x68(%rbp),%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  cmp    %rax,-0x10(%rbp)
  je     L345
  mov    -0x68(%rbp),%eax
  cmp    -0x64(%rbp),%eax
  jae    L602
  mov    -0x68(%rbp),%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x68(%rbp),%eax
  mov    -0x64(%rbp),%ecx
  sub    %rcx,%rax
  mov    %rax,%rsi
  mov    -0x20(%rbp),%rax
  add    %rsi,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L545
  addl   $0x1,-0x68(%rbp)
L516:
  cmpl   $0x11,-0x68(%rbp)
  jbe    L270
  jmp    L403
L345:
  nop
  jmp    L403
L602:
  nop
  jmp    L403
L545:
  nop
L403:
  mov    -0x68(%rbp),%eax
  cmp    -0x58(%rbp),%eax
  jbe    L182
  mov    -0x64(%rbp),%eax
  mov    %eax,-0x38(%rbp)
  mov    -0x68(%rbp),%eax
  mov    %eax,-0x58(%rbp)
  cmpl   $0x12,-0x58(%rbp)
  je     L55
L182:
  addl   $0x1,-0x64(%rbp)
L587:
  mov    -0x64(%rbp),%eax
  cmp    -0x3c(%rbp),%eax
  jbe    L77
  jmp    L59
L55:
  nop
L59:
  mov    -0x60(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,%eax
  neg    %rax
  add    %rax,-0x20(%rbp)
  movl   $0x2,-0x54(%rbp)
  mov    -0x20(%rbp),%rax
  sub    -0x78(%rbp),%rax
  mov    $0x1002,%edx
  cmp    %rdx,%rax
  cmovg  %rdx,%rax
  mov    %eax,-0x3c(%rbp)
  movl   $0x3,-0x64(%rbp)
  jmp    L351
L117:
  movl   $0x0,-0x68(%rbp)
  jmp    L189
L266:
  mov    -0x68(%rbp),%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  cmp    %rax,-0x10(%rbp)
  je     L335
  mov    -0x68(%rbp),%eax
  cmp    -0x64(%rbp),%eax
  jae    L657
  mov    -0x68(%rbp),%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x68(%rbp),%eax
  mov    -0x64(%rbp),%ecx
  sub    %rcx,%rax
  mov    %rax,%rsi
  mov    -0x20(%rbp),%rax
  add    %rsi,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L444
  addl   $0x1,-0x68(%rbp)
L189:
  cmpl   $0x11,-0x68(%rbp)
  jbe    L266
  jmp    L431
L335:
  nop
  jmp    L431
L657:
  nop
  jmp    L431
L444:
  nop
L431:
  mov    -0x68(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jbe    L464
  mov    -0x64(%rbp),%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x68(%rbp),%eax
  mov    %eax,-0x54(%rbp)
  cmpl   $0x12,-0x54(%rbp)
  je     L149
L464:
  addl   $0x1,-0x64(%rbp)
L351:
  mov    -0x64(%rbp),%eax
  cmp    -0x3c(%rbp),%eax
  jbe    L117
  jmp    L592
L149:
  nop
L592:
  subq   $0x1,-0x20(%rbp)
  cmpl   $0x2,-0x58(%rbp)
  ja     L212
  movl   $0x1,-0x58(%rbp)
L212:
  cmpl   $0x2,-0x54(%rbp)
  ja     L363
  movl   $0x1,-0x54(%rbp)
L363:
  mov    -0x60(%rbp),%edx
  mov    -0x58(%rbp),%eax
  add    %eax,%edx
  mov    -0x54(%rbp),%eax
  add    $0x1,%eax
  cmp    %eax,%edx
  ja     L641
  movl   $0x1,-0x60(%rbp)
L641:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x18(%rbp),%rax
  mov    %dl,(%rax)
  cmpl   $0x2,-0x60(%rbp)
  jbe    L326
  mov    -0x60(%rbp),%eax
  add    %rax,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  or     $0x1,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x60(%rbp),%eax
  sub    $0x3,%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    -0x5c(%rbp),%eax
  sub    $0x3,%eax
  shr    $0x8,%eax
  or     %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x28(%rbp)
  mov    -0x5c(%rbp),%eax
  lea    -0x3(%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x28(%rbp)
  jmp    L369
L326:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x28(%rbp)
  addq   $0x1,-0x20(%rbp)
L369:
  mov    -0x28(%rbp),%rax
  sub    -0x30(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x7c(%rbp),%eax
  cltq
  add    %rax,%rdx
  mov    -0x20(%rbp),%rax
  sub    -0x78(%rbp),%rax
  mov    %rax,%rcx
  mov    %rdx,%rax
  sub    %rcx,%rax
  mov    -0x50(%rbp),%ecx
  mov    -0x4c(%rbp),%edx
  add    %ecx,%edx
  mov    %edx,%edx
  cmp    %rdx,%rax
  jge    L477
  mov    -0x28(%rbp),%rax
  sub    -0x30(%rbp),%rax
  mov    %eax,-0x50(%rbp)
  mov    -0x7c(%rbp),%edx
  mov    -0x20(%rbp),%rax
  sub    -0x78(%rbp),%rax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x4c(%rbp)
L477:
  mov    -0x20(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  jb     L558
  jmp    L646
L52:
  shrb   -0x6d(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x18(%rbp),%rax
  mov    %dl,(%rax)
L646:
  cmpb   $0x0,-0x6d(%rbp)
  je     L553
  cmpb   $0x1,-0x6d(%rbp)
  jne    L52
L553:
  mov    -0x28(%rbp),%rax
  sub    -0x30(%rbp),%rax
  mov    %eax,-0x48(%rbp)
  mov    -0x7c(%rbp),%edx
  mov    -0x78(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <BLZ_Invert@plt>
  mov    -0x48(%rbp),%edx
  mov    -0x30(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <BLZ_Invert@plt>
  cmpl   $0x0,-0x50(%rbp)
  je     L656
  mov    -0x7c(%rbp),%eax
  add    $0x4,%eax
  mov    %eax,%ecx
  mov    -0x50(%rbp),%edx
  mov    -0x4c(%rbp),%eax
  add    %edx,%eax
  add    $0x3,%eax
  and    $0xfffffffc,%eax
  add    $0x8,%eax
  cmp    %eax,%ecx
  jae    L346
L656:
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x78(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x7c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  jmp    L4
L494:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x28(%rbp)
  addq   $0x1,-0x20(%rbp)
L4:
  mov    -0x20(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  jb     L494
  jmp    L623
L547:
  mov    -0x28(%rbp),%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x28(%rbp)
L623:
  mov    -0x28(%rbp),%rax
  sub    -0x30(%rbp),%rax
  and    $0x3,%eax
  test   %rax,%rax
  jne    L547
  mov    -0x28(%rbp),%rax
  movl   $0x0,(%rax)
  addq   $0x4,-0x28(%rbp)
  jmp    L525
L346:
  mov    -0x4c(%rbp),%edx
  mov    -0x50(%rbp),%eax
  add    %edx,%eax
  add    $0xb,%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <Memory@plt>
  mov    %rax,-0x8(%rbp)
  movl   $0x0,-0x68(%rbp)
  jmp    L473
L308:
  mov    -0x68(%rbp),%edx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  mov    -0x68(%rbp),%ecx
  mov    -0x8(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x68(%rbp)
L473:
  mov    -0x68(%rbp),%eax
  cmp    -0x4c(%rbp),%eax
  jb     L308
  movl   $0x0,-0x68(%rbp)
  jmp    L524
L535:
  mov    -0x68(%rbp),%edx
  mov    -0x48(%rbp),%eax
  add    %edx,%eax
  sub    -0x50(%rbp),%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    -0x4c(%rbp),%ecx
  mov    -0x68(%rbp),%edx
  add    %ecx,%edx
  mov    %edx,%ecx
  mov    -0x8(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x68(%rbp)
L524:
  mov    -0x68(%rbp),%eax
  cmp    -0x50(%rbp),%eax
  jb     L535
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x8(%rbp),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x4c(%rbp),%edx
  mov    -0x50(%rbp),%eax
  add    %rax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x50(%rbp),%eax
  mov    %eax,-0x44(%rbp)
  movl   $0x8,-0x6c(%rbp)
  mov    -0x7c(%rbp),%eax
  sub    -0x50(%rbp),%eax
  sub    -0x4c(%rbp),%eax
  mov    %eax,-0x40(%rbp)
  jmp    L611
L409:
  mov    -0x28(%rbp),%rax
  movb   $0xff,(%rax)
  addq   $0x1,-0x28(%rbp)
  addl   $0x1,-0x6c(%rbp)
L611:
  mov    -0x28(%rbp),%rax
  sub    -0x30(%rbp),%rax
  and    $0x3,%eax
  test   %rax,%rax
  jne    L409
  mov    -0x44(%rbp),%edx
  mov    -0x6c(%rbp),%eax
  add    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  addq   $0x3,-0x28(%rbp)
  mov    -0x6c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x28(%rbp)
  mov    -0x40(%rbp),%eax
  sub    -0x6c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  addq   $0x4,-0x28(%rbp)
L525:
  mov    -0x28(%rbp),%rax
  sub    -0x30(%rbp),%rax
  mov    %eax,%edx
  mov    -0x88(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x30(%rbp),%rax
  leave
  ret
```

assistant: ```c
char *BLZ_Code(unsigned char *raw_buffer, int raw_len, int *new_len, int best) {
  unsigned char *pak_buffer, *pak, *raw, *raw_end, *flg, *tmp;
  unsigned int pak_len, inc_len, hdr_len, enc_len, len, pos, max;
  unsigned int len_best, pos_best, len_next, pos_next, len_post, pos_post;
  unsigned int pak_tmp, raw_tmp;
  unsigned char mask;
  pak_tmp = 0;
  raw_tmp = raw_len;
  pak_len = raw_len + ((raw_len + 7) / 8) + 11;
  pak_buffer = (unsigned char *)Memory(pak_len, sizeof(char));
  BLZ_Invert(raw_buffer, raw_len);
  pak = pak_buffer;
  raw = raw_buffer;
  raw_end = raw_buffer + raw_len;
  mask = 0;
  while (raw < raw_end) {
    if (!(mask >>= 1)) {
      *(flg = pak) = 0;
      pak++;
      mask = 0x80;
    }
    {
      len_best = 2;
      max = raw - raw_buffer >= 0x1002 ? 0x1002 : raw - raw_buffer;
      for (pos = 3; pos <= max; pos++) {
        for (len = 0; len < 0x12; len++) {
          if (raw + len == raw_end)
            break;
          if (len >= pos)
            break;
          if (*(raw + len) != *(raw + len - pos))
            break;
        }
        if (len > len_best) {
          pos_best = pos;
          if ((len_best = len) == 0x12)
            break;
        }
      }
    };
    if (best) {
      if (len_best > 2) {
        if (raw + len_best < raw_end) {
          raw += len_best;
          {
            len_next = 2;
            max = raw - raw_buffer >= 0x1002 ? 0x1002 : raw - raw_buffer;
            for (pos = 3; pos <= max; pos++) {
              for (len = 0; len < 0x12; len++) {
                if (raw + len == raw_end)
                  break;
                if (len >= pos)
                  break;
                if (*(raw + len) != *(raw + len - pos))
                  break;
              }
              if (len > len_next) {
                pos_next = pos;
                if ((len_next = len) == 0x12)
                  break;
              }
            }
          };
          raw -= len_best - 1;
          {
            len_post = 2;
            max = raw - raw_buffer >= 0x1002 ? 0x1002 : raw - raw_buffer;
            for (pos = 3; pos <= max; pos++) {
              for (len = 0; len < 0x12; len++) {
                if (raw + len == raw_end)
                  break;
                if (len >= pos)
                  break;
                if (*(raw + len) != *(raw + len - pos))
                  break;
              }
              if (len > len_post) {
                pos_post = pos;
                if ((len_post = len) == 0x12)
                  break;
              }
            }
          };
          raw--;
          if (len_next <= 2)
            len_next = 1;
          if (len_post <= 2)
            len_post = 1;
          if (len_best + len_next <= 1 + len_post)
            len_best = 1;
        }
      }
    }
    *flg <<= 1;
    if (len_best > 2) {
      raw += len_best;
      *flg |= 1;
      *pak = ((len_best - (2 + 1)) << 4) | ((pos_best - 3) >> 8);
      pak++;
      *pak = (pos_best - 3) & 0xFF;
      pak++;
    } else {
      *pak = *raw;
      pak++;
      raw++;
    }
    if (pak - pak_buffer + raw_len - (raw - raw_buffer) < pak_tmp + raw_tmp) {
      pak_tmp = pak - pak_buffer;
      raw_tmp = raw_len - (raw - raw_buffer);
    }
  }
  while (mask && (mask != 1)) {
    mask >>= 1;
    *flg <<= 1;
  }
  pak_len = pak - pak_buffer;
  BLZ_Invert(raw_buffer, raw_len);
  BLZ_Invert(pak_buffer, pak_len);
  if (!pak_tmp || (raw_len + 4 < ((pak_tmp + raw_tmp + 3) & -4) + 8)) {
    pak = pak_buffer;
    raw = raw_buffer;
    raw_end = raw_buffer + raw_len;
    while (raw < raw_end) {
      *pak = *raw;
      pak++;
      raw++;
    }
    while ((pak - pak_buffer) & 3) {
      *pak = 0;
      pak++;
    }
    *(unsigned int *)pak = 0;
    pak += 4;
  } else {
    tmp = (unsigned char *)Memory(raw_tmp + pak_tmp + 11, sizeof(char));
    for (len = 0; len < raw_tmp; len++)
      tmp[len] = raw_buffer[len];
    for (len = 0; len < pak_tmp; len++)
      tmp[raw_tmp + len] = pak_buffer[len + pak_len - pak_tmp];
    pak = pak_buffer;
    pak_buffer = tmp;
    free(pak);
    pak = pak_buffer + raw_tmp + pak_tmp;
    enc_len = pak_tmp;
    hdr_len = 8;
    inc_len = raw_len - pak_tmp - raw_tmp;
    while ((pak - pak_buffer) & 3) {
      *pak = 0xFF;
      pak++;
      hdr_len++;
    }
    *(unsigned int *)pak = enc_len + hdr_len;
    pak += 3;
    *pak = hdr_len;
    pak++;
    *(unsigned int *)pak = inc_len - hdr_len;
    pak += 4;
  }
  *new_len = pak - pak_buffer;
  return (pak_buffer);
}
```