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

```asm
<isValidOperator>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  cmpq   $0x0,-0x48(%rbp)
  jne    L100
  mov    $0x0,%eax
  jmp    L81
L100:
  mov    -0x50(%rbp),%rax
  mov    %rax,%rsi
  lea    D54(%rip),%rax
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L43
  lea    D13(%rip),%rax
  mov    %rax,-0x30(%rbp)
  movl   $0x0,-0x34(%rbp)
  jmp    L16
L171:
  mov    -0x34(%rbp),%eax
  cltq
  mov    -0x30(%rbp,%rax,8),%rax
  mov    -0x48(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L24
  mov    $0x1,%eax
  jmp    L81
L24:
  addl   $0x1,-0x34(%rbp)
L16:
  cmpl   $0x0,-0x34(%rbp)
  jle    L171
  jmp    L99
L43:
  mov    -0x50(%rbp),%rax
  mov    %rax,%rsi
  lea    D10(%rip),%rax
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L178
  lea    D13(%rip),%rax
  mov    %rax,-0x30(%rbp)
  lea    D100(%rip),%rax
  mov    %rax,-0x28(%rbp)
  movl   $0x0,-0x34(%rbp)
  jmp    L123
L13:
  mov    -0x34(%rbp),%eax
  cltq
  mov    -0x30(%rbp,%rax,8),%rax
  mov    -0x48(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L142
  mov    $0x1,%eax
  jmp    L81
L142:
  addl   $0x1,-0x34(%rbp)
L123:
  cmpl   $0x1,-0x34(%rbp)
  jle    L13
  jmp    L99
L178:
  mov    -0x50(%rbp),%rax
  mov    %rax,%rsi
  lea    D12(%rip),%rax
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L99
  lea    D13(%rip),%rax
  mov    %rax,-0x30(%rbp)
  lea    D107(%rip),%rax
  mov    %rax,-0x28(%rbp)
  lea    D28(%rip),%rax
  mov    %rax,-0x20(%rbp)
  lea    D73(%rip),%rax
  mov    %rax,-0x18(%rbp)
  lea    D63(%rip),%rax
  mov    %rax,-0x10(%rbp)
  movl   $0x0,-0x34(%rbp)
  jmp    L140
L93:
  mov    -0x34(%rbp),%eax
  cltq
  mov    -0x30(%rbp,%rax,8),%rax
  mov    -0x48(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L141
  mov    $0x1,%eax
  jmp    L81
L141:
  addl   $0x1,-0x34(%rbp)
L140:
  cmpl   $0x4,-0x34(%rbp)
  jle    L93
L99:
  mov    $0x0,%eax
L81:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L84
  call   <__stack_chk_fail@plt>
L84:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: data_tag: D54
datatype: string
name: retrieve_data
arguments: data_tag: D13
datatype: string
name: retrieve_data
arguments: data_tag: D10
datatype: string
name: retrieve_data
arguments: data_tag: D100
datatype: string
name: retrieve_data
arguments: data_tag: D12
datatype: string
name: retrieve_data
arguments: data_tag: D107
datatype: string
name: retrieve_data
arguments: data_tag: D28
datatype: string
name: retrieve_data
arguments: data_tag: D73
datatype: string
name: retrieve_data
arguments: data_tag: D63
datatype: string

tool: D54: ID

tool: D13: EQ

tool: D10: NAME

tool: D100: ~

tool: D12: DATE

tool: D107: LT

tool: D28: LE

tool: D73: GT

tool: D63: GE

assistant: ```c
bool isValidOperator(char *op, char *attr) {
  int i;
  if (op == NULL)
    return false;
  if (strcmp("ID", attr) == 0) {
    char *operators[1] = {"EQ"};
    for (i = 0; i < 1; i++) {
      if ((strcmp(operators[i], op) == 0))
        return true;
    }
  } else if (strcmp("NAME", attr) == 0) {
    char *operators[2] = {"EQ", "~"};
    for (i = 0; i < 2; i++) {
      if ((strcmp(operators[i], op) == 0))
        return true;
    }
  } else if (strcmp("DATE", attr) == 0) {
    char *operators[5] = {"EQ", "LT", "LE", "GT", "GE"};
    for (i = 0; i < 5; i++) {
      if ((strcmp(operators[i], op) == 0))
        return true;
    }
  }
  return false;
}
```