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

```asm
<main>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  add    $0xffffffffffffff80,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x78(%rsp)
  xor    %eax,%eax
  lea    D142(%rip),%r12
  lea    D7(%rip),%rbp
  lea    D130(%rip),%rbx
  lea    D117(%rip),%r13
L88:
  mov    %r12,%rdi
  call   <system@plt>
  mov    %rbp,%rdi
  call   <printf@plt>
  lea    0xc(%rsp),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  cmpl   $0x4,0xc(%rsp)
  ja     L29
  mov    0xc(%rsp),%eax
  lea    D14(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  mov    $0x0,%eax
  call   <init@plt>
  lea    D144(%rip),%rdi
  call   <printf@plt>
  lea    D29(%rip),%rdi
  call   <system@plt>
  jmp    L88
  lea    D50(%rip),%rdi
  call   <printf@plt>
  lea    0x10(%rsp),%r14
  mov    %r14,%rsi
  lea    D146(%rip),%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  lea    0x8(%rsp),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  mov    0x8(%rsp),%esi
  mov    %r14,%rdi
  call   <add@plt>
  cmp    $0x1,%eax
  je     L69
  lea    D94(%rip),%rdi
  call   <printf@plt>
L56:
  lea    D29(%rip),%rdi
  call   <system@plt>
  jmp    L88
L69:
  lea    D33(%rip),%rdi
  call   <printf@plt>
  jmp    L56
  mov    $0x0,%eax
  call   <print@plt>
  lea    D29(%rip),%rdi
  call   <system@plt>
  jmp    L88
  mov    $0x0,%eax
  call   <hapus_depan@plt>
  lea    D87(%rip),%rdi
  call   <printf@plt>
  lea    D29(%rip),%rdi
  call   <system@plt>
  jmp    L88
  mov    0x78(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L76
  mov    $0x0,%eax
  sub    $0xffffffffffffff80,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L29:
  mov    %r13,%rdi
  call   <printf@plt>
  jmp    L88
L76:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: tag: D142
type_infered: string
name: retrieve_data
arguments: tag: D7
type_infered: string
name: retrieve_data
arguments: tag: D130
type_infered: string
name: retrieve_data
arguments: tag: D117
type_infered: string
name: retrieve_data
arguments: tag: D144
type_infered: string
name: retrieve_data
arguments: tag: D29
type_infered: string
name: retrieve_data
arguments: tag: D50
type_infered: string
name: retrieve_data
arguments: tag: D146
type_infered: string
name: retrieve_data
arguments: tag: D94
type_infered: string
name: retrieve_data
arguments: tag: D33
type_infered: string
name: retrieve_data
arguments: tag: D87
type_infered: string

tool: D142: cls

tool: D7: 1.Inisiasi Linked head
2.Tambah data
3.cetak semua data
4.Hapus data
0.Exit


tool: D130: %d

tool: D117: Salah pilihan,ulangi lagi


tool: D144: Linked head terinisialisasi


tool: D29: pause

tool: D50: Ketik nama yang diinput 

tool: D146: %100s

tool: D94: Data gagal diinput


tool: D33: Data berhasil ditambahkan


tool: D87: Data berhasil dihapus


assistant: ```c
int main() {
  int id;
  char data[100];
  while (1) {
    system("cls");
    printf("1.Inisiasi Linked head\n2.Tambah data\n3.cetak semua data\n4.Hapus data\n0.Exit\n");
    int pilihan;
    scanf("%d", &pilihan);
    switch (pilihan) {
    case 1:
      init();
      printf("Linked head terinisialisasi\n");
      system("pause");
      break;
    case 2:
      printf("Ketik nama yang diinput ");
      scanf("%100s", data);
      scanf("%d", &id);
      int hasil = add(data, id);
      if (hasil == 1)
        printf("Data berhasil ditambahkan\n");
      else
        printf("Data gagal diinput\n");
      system("pause");
      break;
    case 3:
      print();
      system("pause");
      break;
    case 4:
      hapus_depan();
      printf("Data berhasil dihapus\n");
      system("pause");
      break;
    case 0:
      return 0;
      break;
    default:
      printf("Salah pilihan,ulangi lagi\n");
    }
  }
}
```