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

```asm
<main>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  mov    %edi,%ebp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  mov    D7(%rip),%rax
  mov    %rax,0x8(%rsp)
  mov    D146(%rip),%rax
  mov    %rax,0x10(%rsp)
  xor    %eax,%eax
  call   <initialiseLookupTable@plt>
  cmp    $0x4,%ebp
  je     L49
  movsd  0x10(%rsp),%xmm1
  movsd  0x8(%rsp),%xmm0
  mov    $0x2,%eax
  lea    D132(%rip),%rdi
  call   <writeLookupTableForOctave@plt>
  movsd  0x10(%rsp),%xmm1
  movsd  0x8(%rsp),%xmm0
  lea    D128(%rip),%rdi
  mov    %eax,%ebx
  mov    $0x2,%eax
  call   <writeLookupTableForAssembler@plt>
  add    %ebx,%eax
L15:
  mov    0x18(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L35
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L49:
  mov    0x8(%rbx),%rdi
  lea    0x4(%rsp),%rdx
  lea    D28(%rip),%rsi
  xor    %eax,%eax
  lea    D92(%rip),%r13
  call   <sscanf@plt>
  mov    0x10(%rbx),%rdi
  lea    0x8(%rsp),%rdx
  mov    %r13,%rsi
  mov    %eax,%ebp
  xor    %eax,%eax
  call   <sscanf@plt>
  mov    0x18(%rbx),%rdi
  lea    0x10(%rsp),%rdx
  mov    %r13,%rsi
  mov    %eax,%r12d
  xor    %eax,%eax
  call   <sscanf@plt>
  add    %r12d,%ebp
  add    %eax,%ebp
  cmp    $0x3,%ebp
  je     L27
  lea    D150(%rip),%rdi
  call   <puts@plt>
  mov    $0x1,%eax
  jmp    L15
L27:
  mov    0x4(%rsp),%esi
  movsd  0x10(%rsp),%xmm1
  lea    D12(%rip),%rdi
  mov    $0x2,%eax
  movsd  0x8(%rsp),%xmm0
  call   <printf@plt>
  movsd  0x10(%rsp),%xmm1
  movsd  0x8(%rsp),%xmm0
  mov    $0x2,%eax
  mov    0x4(%rsp),%edi
  call   <sunriseTime@plt>
  movsd  0x10(%rsp),%xmm1
  movsd  0x8(%rsp),%xmm0
  mov    0x4(%rsp),%edi
  mov    %eax,%ebx
  mov    $0x2,%eax
  call   <sunsetTime@plt>
  pxor   %xmm0,%xmm0
  pxor   %xmm1,%xmm1
  movsd  D152(%rip),%xmm5
  cvtsi2sd %eax,%xmm0
  pxor   %xmm2,%xmm2
  movsd  D69(%rip),%xmm4
  movsd  D46(%rip),%xmm3
  cvtsi2sd %ebx,%xmm1
  lea    D9(%rip),%rdi
  xor    %eax,%eax
  mulsd  %xmm5,%xmm0
  mulsd  %xmm5,%xmm1
  cvttsd2si %xmm0,%ecx
  cvttsd2si %xmm1,%esi
  cvtsi2sd %ecx,%xmm2
  subsd  %xmm2,%xmm0
  pxor   %xmm2,%xmm2
  cvtsi2sd %esi,%xmm2
  mulsd  %xmm4,%xmm0
  subsd  %xmm2,%xmm1
  mulsd  %xmm4,%xmm1
  addsd  %xmm3,%xmm0
  cvttsd2si %xmm0,%r8d
  addsd  %xmm3,%xmm1
  cvttsd2si %xmm1,%edx
  call   <printf@plt>
  movsd  0x10(%rsp),%xmm1
  movsd  0x8(%rsp),%xmm0
  mov    $0x2,%eax
  mov    0x4(%rsp),%edi
  call   <lookupSunriseTime@plt>
  movsd  0x10(%rsp),%xmm1
  movsd  0x8(%rsp),%xmm0
  mov    0x4(%rsp),%edi
  mov    %eax,%ebx
  mov    $0x2,%eax
  call   <lookupSunsetTime@plt>
  pxor   %xmm0,%xmm0
  pxor   %xmm2,%xmm2
  lea    D43(%rip),%rdi
  cvtsi2sd %eax,%xmm0
  mov    D152(%rip),%rax
  cvtsi2sd %ebx,%xmm2
  movq   %rax,%xmm5
  mov    D69(%rip),%rax
  mulsd  %xmm5,%xmm0
  movq   %rax,%xmm4
  mov    D46(%rip),%rax
  mulsd  %xmm5,%xmm2
  movq   %rax,%xmm3
  xor    %eax,%eax
  cvttsd2si %xmm0,%ecx
  cvttsd2si %xmm2,%esi
  movapd %xmm2,%xmm1
  pxor   %xmm2,%xmm2
  cvtsi2sd %ecx,%xmm2
  subsd  %xmm2,%xmm0
  pxor   %xmm2,%xmm2
  cvtsi2sd %esi,%xmm2
  mulsd  %xmm4,%xmm0
  subsd  %xmm2,%xmm1
  mulsd  %xmm4,%xmm1
  addsd  %xmm3,%xmm0
  cvttsd2si %xmm0,%r8d
  addsd  %xmm3,%xmm1
  cvttsd2si %xmm1,%edx
  call   <printf@plt>
  xor    %eax,%eax
  jmp    L15
L35:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: tag: D7
data_type: f64
name: unpack_data
arguments: tag: D146
data_type: byte[8]
name: unpack_data
arguments: tag: D132
data_type: string
name: unpack_data
arguments: tag: D128
data_type: string
name: unpack_data
arguments: tag: D28
data_type: string
name: unpack_data
arguments: tag: D92
data_type: string
name: unpack_data
arguments: tag: D150
data_type: string
name: unpack_data
arguments: tag: D12
data_type: string
name: unpack_data
arguments: tag: D152
data_type: byte[8]
name: unpack_data
arguments: tag: D69
data_type: byte[8]
name: unpack_data
arguments: tag: D46
data_type: f64
name: unpack_data
arguments: tag: D9
data_type: string
name: unpack_data
arguments: tag: D43
data_type: string

tool: D7: 51.509865

tool: {"D146": [0xca,0x52,0xeb,0xfd,0x46,0x3b,0xbe,0xbf]}

tool: D132: lookup.txt

tool: D128: lookup.asm

tool: D28: %d

tool: D92: %lg

tool: D150: Unable to parse arguments.  Expected day, latitude and longitude.

tool: D12: For %g,%g on day %d:


tool: {"D152": [0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40]}

tool: {"D69": [0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x40]}

tool: D46: 0.5

tool: D9: Actual: sunrise=%.2d:%.2d, sunset=%.2d:%.2d


tool: D43: Lookup: sunrise=%.2d:%.2d, sunset=%.2d:%.2d


assistant: ```c
int main(int argc, char *argv[]) {
  double latitude = 51.509865;
  double longitude = -0.118092;
  initialiseLookupTable();
  if (argc == 4) {
    double sunrise, sunset;
    int day;
    int success = sscanf(argv[1], "%d", &day) + sscanf(argv[2], "%lg", &latitude) + sscanf(argv[3], "%lg", &longitude);
    if (success != 3) {
      printf("Unable to parse arguments.  "
             "Expected day, latitude and longitude.\n");
      return 1;
    }
    printf("For %g,%g on day %d:\n", latitude, longitude, day);
    sunrise = sunriseTime(day, latitude, longitude);
    sunset = sunsetTime(day, latitude, longitude);
    printf("Actual: sunrise=%.2d:%.2d, sunset=%.2d:%.2d\n", ((int)((sunrise)*24)), ((int)(((sunrise)*24 - ((int)((sunrise)*24))) * 60 + 0.5)), ((int)((sunset)*24)), ((int)(((sunset)*24 - ((int)((sunset)*24))) * 60 + 0.5)));
    sunrise = lookupSunriseTime(day, latitude, longitude);
    sunset = lookupSunsetTime(day, latitude, longitude);
    printf("Lookup: sunrise=%.2d:%.2d, sunset=%.2d:%.2d\n", ((int)((sunrise)*24)), ((int)(((sunrise)*24 - ((int)((sunrise)*24))) * 60 + 0.5)), ((int)((sunset)*24)), ((int)(((sunset)*24 - ((int)((sunset)*24))) * 60 + 0.5)));
    return 0;
  }
  return writeLookupTableForOctave("lookup.txt", latitude, longitude) + writeLookupTableForAssembler("lookup.asm", latitude, longitude);
}
```