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

```asm
<G_admin_duration>:
  endbr64
  mov    %rsi,%r8
  mov    %edx,%esi
  cmp    $0x5dfc0f00,%edi
  ja     L29
  cmp    $0x1e1337f,%edi
  jg     L7
  cmp    $0x76a6ff,%edi
  jg     L19
  cmp    $0x1517f,%edi
  jg     L51
  cmp    $0xe0f,%edi
  jg     L16
  cmp    $0x3b,%edi
  jle    L1
  pxor   %xmm0,%xmm0
  lea    D78(%rip),%rdx
  cvtsi2ss %edi,%xmm0
  divss  D93(%rip),%xmm0
  mov    %r8,%rdi
  cvttss2si %xmm0,%ecx
  jmp    1070 <Com_sprintf@plt>
  nopl   (%rax)
L7:
  pxor   %xmm0,%xmm0
  lea    D1(%rip),%rdx
  cvtsi2ss %edi,%xmm0
  divss  D94(%rip),%xmm0
  mov    %r8,%rdi
  cvttss2si %xmm0,%ecx
  jmp    1070 <Com_sprintf@plt>
  nopl   0x0(%rax,%rax,1)
L29:
  lea    D15(%rip),%rsi
  mov    %r8,%rdi
  jmp    1060 <Q_strncpyz@plt>
  nop
L16:
  pxor   %xmm0,%xmm0
  lea    D30(%rip),%rdx
  cvtsi2ss %edi,%xmm0
  divss  D86(%rip),%xmm0
  mov    %r8,%rdi
  cvttss2si %xmm0,%ecx
  jmp    1070 <Com_sprintf@plt>
  nopl   0x0(%rax,%rax,1)
L19:
  pxor   %xmm0,%xmm0
  lea    D42(%rip),%rdx
  cvtsi2ss %edi,%xmm0
  divss  D76(%rip),%xmm0
  mov    %r8,%rdi
  cvttss2si %xmm0,%ecx
  jmp    1070 <Com_sprintf@plt>
  nopl   0x0(%rax,%rax,1)
L51:
  pxor   %xmm0,%xmm0
  lea    D14(%rip),%rdx
  cvtsi2ss %edi,%xmm0
  divss  D55(%rip),%xmm0
  mov    %r8,%rdi
  cvttss2si %xmm0,%ecx
  jmp    1070 <Com_sprintf@plt>
  nopl   0x0(%rax,%rax,1)
L1:
  mov    %edi,%ecx
  lea    D61(%rip),%rdx
  mov    %r8,%rdi
  jmp    1070 <Com_sprintf@plt>
```

tool_calls: name: unpack_data
arguments: data_label: D78
type_guessed: string
name: unpack_data
arguments: data_label: D93
type_guessed: byte[4]
name: unpack_data
arguments: data_label: D1
type_guessed: string
name: unpack_data
arguments: data_label: D94
type_guessed: byte[4]
name: unpack_data
arguments: data_label: D15
type_guessed: string
name: unpack_data
arguments: data_label: D30
type_guessed: string
name: unpack_data
arguments: data_label: D86
type_guessed: byte[4]
name: unpack_data
arguments: data_label: D42
type_guessed: string
name: unpack_data
arguments: data_label: D76
type_guessed: byte[4]
name: unpack_data
arguments: data_label: D14
type_guessed: string
name: unpack_data
arguments: data_label: D55
type_guessed: byte[4]
name: unpack_data
arguments: data_label: D61
type_guessed: string

tool: D78: %1.1f minutes

tool: {"D93": [0x00,0x00,0x70,0x42]}

tool: D1: %1.1f years

tool: {"D94": [0xc0,0x99,0xf0,0x4b]}

tool: D15: PERMANENT

tool: D30: %1.1f hours

tool: {"D86": [0x00,0x00,0x61,0x45]}

tool: D42: %1.1f weeks

tool: {"D76": [0x00,0xa8,0x13,0x49]}

tool: D14: %1.1f days

tool: {"D55": [0x00,0xc0,0xa8,0x47]}

tool: D61: %i seconds

assistant: ```c
void G_admin_duration(int secs, char *duration, int dursize) {
  if (secs > (60 * 60 * 24 * 365 * 50) || secs < 0) {
    Q_strncpyz(duration, "PERMANENT", dursize);
  } else if (secs >= (60 * 60 * 24 * 365))
    Com_sprintf(duration, dursize, "%1.1f years", (secs / (60 * 60 * 24 * 365.0f)));
  else if (secs >= (60 * 60 * 24 * 90))
    Com_sprintf(duration, dursize, "%1.1f weeks", (secs / (60 * 60 * 24 * 7.0f)));
  else if (secs >= (60 * 60 * 24))
    Com_sprintf(duration, dursize, "%1.1f days", (secs / (60 * 60 * 24.0f)));
  else if (secs >= (60 * 60))
    Com_sprintf(duration, dursize, "%1.1f hours", (secs / (60 * 60.0f)));
  else if (secs >= 60)
    Com_sprintf(duration, dursize, "%1.1f minutes", (secs / 60.0f));
  else {
    Com_sprintf(duration, dursize, "%i seconds", secs);
  }
}
```