user: 请从给定的汇编指令推导出C源代码:

```asm
<cgiDecodeString>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L55
L97:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x25,%al
  jne    L101
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D8(%rip),%rax
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L18
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D8(%rip),%rax
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L18
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <islower@plt>
  test   %rax,%rax
  je     L44
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    -0x20(%rbp),%rdx
  lea    0x1(%rdx),%rbx
  mov    %eax,%edi
  call   <toupper@plt>
  mov    %al,(%rbx)
L44:
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <islower@plt>
  test   %rax,%rax
  je     L37
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    -0x20(%rbp),%rdx
  lea    0x2(%rdx),%rbx
  mov    %eax,%edi
  call   <toupper@plt>
  mov    %al,(%rbx)
L37:
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x40,%al
  jle    L78
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x37,%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  jmp    L12
L78:
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  shl    $0x4,%eax
  mov    %eax,%edx
L12:
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  cmp    $0x40,%al
  jle    L108
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  sub    $0x37,%eax
  jmp    L23
L108:
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  sub    $0x30,%eax
L23:
  add    %edx,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x18(%rbp)
  addq   $0x2,-0x20(%rbp)
  jmp    L18
L101:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    -0x20(%rbp),%rdx
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L18:
  addq   $0x1,-0x20(%rbp)
L55:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L97
  mov    -0x20(%rbp),%rax
  sub    -0x18(%rbp),%rax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <bzero@plt>
  mov    -0x28(%rbp),%rax
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D8
type: string

tool: D8: 0123456789ABCDEFabcdef

assistant: ```c
char *cgiDecodeString(char *text) {
  char *cp, *xp;
  for (cp = text, xp = text; *cp; cp++) {
    if (*cp == '%') {
      if (strchr("0123456789ABCDEFabcdef", *(cp + 1)) && strchr("0123456789ABCDEFabcdef", *(cp + 2))) {
        if (islower(*(cp + 1)))
          *(cp + 1) = toupper(*(cp + 1));
        if (islower(*(cp + 2)))
          *(cp + 2) = toupper(*(cp + 2));
        *(xp) = (*(cp + 1) >= 'A' ? *(cp + 1) - 'A' + 10 : *(cp + 1) - '0') * 16 + (*(cp + 2) >= 'A' ? *(cp + 2) - 'A' + 10 : *(cp + 2) - '0');
        xp++;
        cp += 2;
      }
    } else {
      *(xp++) = *cp;
    }
  }
  bzero(xp, cp - xp);
  return text;
}
```