user: Translate the below assembly code into C programming language:

```asm
<decrypt>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x248,%rsp
  mov    %rdi,-0x248(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  mov    -0x248(%rbp),%rax
  lea    D86(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fopen@plt>
  mov    %rax,-0x210(%rbp)
  movq   $0x0,-0x150(%rbp)
  movq   $0x0,-0x148(%rbp)
  lea    -0x140(%rbp),%rdx
  mov    $0x0,%eax
  mov    $0x23,%ecx
  mov    %rdx,%rdi
  rep stos %rax,%es:(%rdi)
  mov    %rdi,%rdx
  mov    %eax,(%rdx)
  add    $0x4,%rdx
  jmp    L148
L113:
  lea    -0x1c0(%rbp),%rax
  lea    D21(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstr@plt>
  test   %rax,%rax
  je     L96
  lea    -0x1c0(%rbp),%rax
  mov    $0x20,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  add    $0x1,%rax
  mov    %rax,-0x208(%rbp)
  mov    -0x208(%rbp),%rax
  lea    D38(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strtok@plt>
  mov    %eax,%edi
  call   <atoi@plt>
  mov    %eax,-0x218(%rbp)
  lea    D38(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok@plt>
  mov    %eax,%edi
  call   <atoi@plt>
  mov    %eax,-0x214(%rbp)
  movl   $0x0,-0x238(%rbp)
  jmp    L60
L173:
  movl   $0x0,-0x234(%rbp)
  jmp    L62
L5:
  mov    -0x234(%rbp),%eax
  imul   $0x32,%eax,%edx
  mov    -0x238(%rbp),%eax
  add    %edx,%eax
  cltq
  movb   $0x1,-0x150(%rbp,%rax,1)
  addl   $0x1,-0x234(%rbp)
L62:
  mov    -0x234(%rbp),%eax
  cmp    -0x214(%rbp),%eax
  jl     L5
  addl   $0x1,-0x238(%rbp)
L60:
  mov    -0x238(%rbp),%eax
  cmp    -0x218(%rbp),%eax
  jl     L173
  jmp    L148
L96:
  lea    -0x1c0(%rbp),%rax
  lea    D39(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstr@plt>
  test   %rax,%rax
  sete   %al
  mov    %al,-0x239(%rbp)
  lea    -0x1c0(%rbp),%rax
  lea    D60(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strtok@plt>
  lea    D96(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok@plt>
  mov    %eax,%edi
  call   <atoi@plt>
  mov    %eax,-0x220(%rbp)
  lea    D96(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok@plt>
  lea    D96(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok@plt>
  mov    %eax,%edi
  call   <atoi@plt>
  mov    %eax,-0x21c(%rbp)
  cmpb   $0x0,-0x239(%rbp)
  je     L159
  movl   $0x0,-0x230(%rbp)
  jmp    L108
L46:
  mov    -0x220(%rbp),%eax
  imul   $0x32,%eax,%ebx
  mov    -0x230(%rbp),%eax
  sub    -0x21c(%rbp),%eax
  mov    $0x32,%esi
  mov    %eax,%edi
  call   <posmod@plt>
  add    %ebx,%eax
  cltq
  movzbl -0x150(%rbp,%rax,1),%edx
  mov    -0x230(%rbp),%eax
  cltq
  mov    %dl,-0x200(%rbp,%rax,1)
  addl   $0x1,-0x230(%rbp)
L108:
  cmpl   $0x31,-0x230(%rbp)
  jle    L46
  movl   $0x0,-0x22c(%rbp)
  jmp    L151
L130:
  mov    -0x220(%rbp),%eax
  imul   $0x32,%eax,%edx
  mov    -0x22c(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x22c(%rbp),%eax
  cltq
  movzbl -0x200(%rbp,%rax,1),%edx
  movslq %ecx,%rax
  mov    %dl,-0x150(%rbp,%rax,1)
  addl   $0x1,-0x22c(%rbp)
L151:
  cmpl   $0x31,-0x22c(%rbp)
  jle    L130
  jmp    L148
L159:
  movl   $0x0,-0x228(%rbp)
  jmp    L64
L189:
  mov    -0x228(%rbp),%eax
  sub    -0x21c(%rbp),%eax
  mov    $0x6,%esi
  mov    %eax,%edi
  call   <posmod@plt>
  imul   $0x32,%eax,%edx
  mov    -0x220(%rbp),%eax
  add    %edx,%eax
  cltq
  movzbl -0x150(%rbp,%rax,1),%edx
  mov    -0x228(%rbp),%eax
  cltq
  mov    %dl,-0x200(%rbp,%rax,1)
  addl   $0x1,-0x228(%rbp)
L64:
  cmpl   $0x5,-0x228(%rbp)
  jle    L189
  movl   $0x0,-0x224(%rbp)
  jmp    L137
L88:
  mov    -0x224(%rbp),%eax
  imul   $0x32,%eax,%edx
  mov    -0x220(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x224(%rbp),%eax
  cltq
  movzbl -0x200(%rbp,%rax,1),%edx
  movslq %ecx,%rax
  mov    %dl,-0x150(%rbp,%rax,1)
  addl   $0x1,-0x224(%rbp)
L137:
  cmpl   $0x5,-0x224(%rbp)
  jle    L88
L148:
  mov    -0x210(%rbp),%rdx
  lea    -0x1c0(%rbp),%rax
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <fgets@plt>
  test   %rax,%rax
  jne    L113
  lea    -0x150(%rbp),%rax
  mov    %rax,%rdi
  call   <sum_pixels@plt>
  mov    %eax,%esi
  lea    D76(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D101(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    -0x150(%rbp),%rax
  mov    %rax,%rdi
  call   <print_display@plt>
  nop
  mov    -0x18(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L156
  call   <__stack_chk_fail@plt>
L156:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D86
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D21
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D38
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D39
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D60
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D96
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D76
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D101
type_guessed: string

tool: D86: r

tool: D21: rect

tool: D38: x

tool: D39: column

tool: D60: =

tool: D96:  

tool: D76: Part 1: %d


tool: D101: Part 2:

assistant: ```c
void decrypt(char *fname) {
  FILE *fp = fopen(fname, "r");
  char instr[100];
  char display[50 * 6] = {0};
  while (fgets(instr, 100, fp) != NULL) {
    if (strstr(instr, "rect")) {
      char *num_seg = strstr(instr, " ") + 1;
      int x = atoi(strtok(num_seg, "x"));
      int y = atoi(strtok(NULL, "x"));
      for (int i = 0; i < x; i++) {
        for (int j = 0; j < y; j++) {
          display[i + 50 * j] = 1;
        }
      }
    } else {
      char rc = strstr(instr, "column") == NULL;
      strtok(instr, "=");
      int loc = atoi(strtok(NULL, " "));
      strtok(NULL, " ");
      int amt = atoi(strtok(NULL, " "));
      if (rc) {
        char temp[50];
        for (int i = 0; i < 50; i++)
          temp[i] = display[loc * 50 + posmod(i - amt, 50)];
        for (int i = 0; i < 50; i++)
          display[loc * 50 + i] = temp[i];
      } else {
        char temp[6];
        for (int i = 0; i < 6; i++)
          temp[i] = display[loc + 50 * posmod(i - amt, 6)];
        for (int i = 0; i < 6; i++)
          display[loc + 50 * i] = temp[i];
      }
    }
  }
  printf("Part 1: %d\n", sum_pixels(display));
  printf("Part 2:\n");
  print_display(display);
}
```