user: Demonstrate the C code that generates the assembly output below:

```asm
<main>:
  endbr64
  push   %r15
  lea    D2(%rip),%r15
  push   %r14
  lea    D21(%rip),%r14
  push   %r13
  lea    D23(%rip),%r13
  push   %r12
  lea    D96(%rip),%r12
  push   %rbp
  lea    D12(%rip),%rbp
  push   %rbx
  lea    D19(%rip),%rbx
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  lea    0x17(%rsp),%rax
  movq   $0x0,0x8(%rsp)
  mov    %rax,(%rsp)
  xchg   %ax,%ax
L74:
  mov    %r15,%rdi
  call   <printf@plt>
  mov    %r14,%rdi
  call   <printf@plt>
  mov    %r13,%rdi
  call   <printf@plt>
  mov    %r12,%rdi
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <printf@plt>
  mov    %rbx,%rdi
  call   <printf@plt>
  lea    D79(%rip),%rdi
  call   <printf@plt>
  mov    (%rsp),%rsi
  lea    D98(%rip),%rdi
  call   <scanf@plt>
  movzbl 0x17(%rsp),%eax
  sub    $0x64,%eax
  cmp    $0xf,%al
  ja     L57
  lea    D3(%rip),%rdx
  movzbl %al,%eax
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  nopl   0x0(%rax)
L57:
  lea    D90(%rip),%rdi
  call   <printf@plt>
  jmp    L74
  xchg   %ax,%ax
  mov    0x8(%rsp),%rdi
  call   <sort@plt>
  jmp    L74
  nop
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L69
  add    $0x28,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
  mov    0x8(%rsp),%rdi
  call   <print@plt>
  jmp    L74
  nopw   0x0(%rax,%rax,1)
  mov    0x8(%rsp),%rdi
  call   <input@plt>
  mov    %rax,0x8(%rsp)
  jmp    L74
  nopl   0x0(%rax)
  mov    0x8(%rsp),%rdi
  call   <search@plt>
  jmp    L74
  nopw   0x0(%rax,%rax,1)
  mov    0x8(%rsp),%rdi
  call   <delete@plt>
  mov    %rax,0x8(%rsp)
  jmp    L74
L69:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D2
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D21
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D23
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D96
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D12
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D19
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D79
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D98
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D90
type_guessed: string

tool: D2: 
i:input


tool: D21: p:print


tool: D23: s:sort


tool: D96: f:search


tool: D12: d:delete


tool: D19: q:quit


tool: D79: Enter your choice: 

tool: D98: %c

tool: D90: invalid choice


assistant: ```c
main() {
  char ***db = 0;
  char choice;
  while (1) {
    printf("\ni:input\n");
    printf("p:print\n");
    printf("s:sort\n");
    printf("f:search\n");
    printf("d:delete\n");
    printf("q:quit\n");
    printf("Enter your choice: ");
    scanf("%c", &choice);
    switch (choice) {
    case 'i':
      db = input(db);
      break;
    case 'p':
      print(db);
      break;
    case 's':
      sort(db);
      break;
    case 'f':
      search(db);
      break;
    case 'd':
      db = delete (db);
      break;
    case 'q':
      return;
    default:
      printf("invalid choice\n");
    }
  }
}
```