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

```asm
<main>:
  endbr64
  push   %r15
  lea    D25(%rip),%rdi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  call   <mls_conf_ini@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  je     L18
L56:
  lea    D66(%rip),%r12
  mov    %rbp,%rdi
  lea    D124(%rip),%rbx
  call   <mls_conf_load@plt>
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    D92(%rip),%r13
  call   <mls_conf_get@plt>
  mov    %r12,%rsi
  lea    D39(%rip),%r12
  lea    D113(%rip),%r14
  test   %rax,%rax
  mov    %rax,%rdx
  lea    D94(%rip),%r15
  mov    %r12,%rdi
  cmove  %rbx,%rdx
  call   <printf@plt>
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <mls_conf_get@plt>
  mov    %r13,%rsi
  mov    %r12,%rdi
  test   %rax,%rax
  mov    %rax,%rdx
  cmove  %rbx,%rdx
  call   <printf@plt>
  mov    %r14,%rsi
  mov    %rbp,%rdi
  call   <mls_conf_get@plt>
  mov    %r14,%rsi
  mov    %r12,%rdi
  lea    D85(%rip),%r14
  test   %rax,%rax
  mov    %rax,%rdx
  cmove  %rbx,%rdx
  call   <printf@plt>
  mov    %r14,%rsi
  mov    %rbp,%rdi
  call   <mls_conf_get@plt>
  mov    %r14,%rsi
  mov    %r12,%rdi
  lea    D139(%rip),%r14
  test   %rax,%rax
  mov    %rax,%rdx
  cmove  %rbx,%rdx
  call   <printf@plt>
  mov    %r14,%rsi
  mov    %rbp,%rdi
  call   <mls_conf_get@plt>
  mov    %r14,%rsi
  mov    %r12,%rdi
  test   %rax,%rax
  mov    %rax,%rdx
  cmove  %rbx,%rdx
  call   <printf@plt>
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <mls_conf_set@plt>
  test   %eax,%eax
  jne    L4
L8:
  lea    D9(%rip),%r8
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %r8,%rdi
  lea    D31(%rip),%rbx
  lea    D86(%rip),%r15
  call   <printf@plt>
  mov    %rbx,%rdx
  mov    %r15,%rsi
  mov    %rbp,%rdi
  call   <mls_conf_set@plt>
  lea    D9(%rip),%r8
  test   %eax,%eax
  jne    L10
L46:
  mov    %r8,%rdi
  mov    %rbx,%rdx
  lea    D124(%rip),%rbx
  mov    %r15,%rsi
  call   <printf@plt>
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <mls_conf_get@plt>
  mov    %r13,%rsi
  mov    %r12,%rdi
  test   %rax,%rax
  mov    %rax,%rdx
  cmove  %rbx,%rdx
  call   <printf@plt>
  mov    %r15,%rsi
  mov    %rbp,%rdi
  call   <mls_conf_get@plt>
  mov    %r15,%rsi
  mov    %r12,%rdi
  test   %rax,%rax
  mov    %rax,%rdx
  cmove  %rbx,%rdx
  call   <printf@plt>
  mov    %r14,%rsi
  mov    %rbp,%rdi
  call   <mls_conf_get@plt>
  mov    %r14,%rsi
  mov    %r12,%rdi
  test   %rax,%rax
  mov    %rax,%rdx
  cmove  %rbx,%rdx
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <mls_conf_store@plt>
  mov    %rbp,%rdi
  call   <mls_conf_fin@plt>
  add    $0x8,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L4:
  mov    %r15,%rdx
  mov    %r13,%rsi
  lea    D13(%rip),%rdi
  xor    %eax,%eax
  call   <mls_fatal_perror@plt>
  xor    %eax,%eax
  call   <abort@plt>
  jmp    L8
L10:
  mov    %rbx,%rdx
  mov    %r15,%rsi
  lea    D13(%rip),%rdi
  xor    %eax,%eax
  call   <mls_fatal_perror@plt>
  xor    %eax,%eax
  call   <abort@plt>
  lea    D9(%rip),%r8
  jmp    L46
L18:
  lea    D22(%rip),%rdi
  xor    %eax,%eax
  call   <mls_fatal_perror@plt>
  xor    %eax,%eax
  call   <abort@plt>
  jmp    L56
```

tool_calls: name: disassemble_data
arguments: data_tag: D25
type_guessed: string
name: disassemble_data
arguments: data_tag: D66
type_guessed: string
name: disassemble_data
arguments: data_tag: D124
type_guessed: string
name: disassemble_data
arguments: data_tag: D92
type_guessed: string
name: disassemble_data
arguments: data_tag: D39
type_guessed: string
name: disassemble_data
arguments: data_tag: D113
type_guessed: string
name: disassemble_data
arguments: data_tag: D94
type_guessed: string
name: disassemble_data
arguments: data_tag: D85
type_guessed: string
name: disassemble_data
arguments: data_tag: D139
type_guessed: string
name: disassemble_data
arguments: data_tag: D9
type_guessed: string
name: disassemble_data
arguments: data_tag: D31
type_guessed: string
name: disassemble_data
arguments: data_tag: D86
type_guessed: string
name: disassemble_data
arguments: data_tag: D13
type_guessed: string
name: disassemble_data
arguments: data_tag: D22
type_guessed: string

tool: D25: ./test.ini

tool: D66: key1

tool: D124: NOTFOUND

tool: D92: key2

tool: D39: GET: %s = %s


tool: D113: ckey1

tool: D94: modify-val2

tool: D85: undef

tool: D139: keyX

tool: D9: SET: %s = %s


tool: D31: val3

tool: D86: key3

tool: D13: Set error %s:%s

tool: D22: mls_conf_ini

assistant: ```c
int main(int ac, char *argv[]) {
  struct mls_conf *conf;
  conf = mls_conf_ini("./test.ini");
  if (NULL == conf) {
    do {
      mls_fatal_perror("mls_conf_ini");
      abort();
    } while (0);
  }
  mls_conf_load(conf);
  {
    ({
      char *val;
      val = mls_conf_get((conf), ("key1"));
      printf("GET: %s = %s\n", ("key1"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("key2"));
      printf("GET: %s = %s\n", ("key2"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("ckey1"));
      printf("GET: %s = %s\n", ("ckey1"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("undef"));
      printf("GET: %s = %s\n", ("undef"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("keyX"));
      printf("GET: %s = %s\n", ("keyX"), (NULL != val) ? val : "NOTFOUND");
    });
  }
  {
    ({
      int ret = 0;
      ret = mls_conf_set((conf), ("key2"), ("modify-val2"));
      if (0 != ret) {
        do {
          mls_fatal_perror("Set error %s:%s", ("key2"), ("modify-val2"));
          abort();
        } while (0);
      }
      printf("SET: %s = %s\n", ("key2"), ("modify-val2"));
    });
    ({
      int ret = 0;
      ret = mls_conf_set((conf), ("key3"), ("val3"));
      if (0 != ret) {
        do {
          mls_fatal_perror("Set error %s:%s", ("key3"), ("val3"));
          abort();
        } while (0);
      }
      printf("SET: %s = %s\n", ("key3"), ("val3"));
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("key2"));
      printf("GET: %s = %s\n", ("key2"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("key3"));
      printf("GET: %s = %s\n", ("key3"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("keyX"));
      printf("GET: %s = %s\n", ("keyX"), (NULL != val) ? val : "NOTFOUND");
    });
  }
  mls_conf_store(conf);
  mls_conf_fin(conf);
  return 0;
}
```