user: Please show me the C implementation that matches the assembly code listed below:

```asm
<suggest>:
  endbr64
  push   %r15
  mov    %ecx,%eax
  mov    %rsi,%r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  lea    D29(%rip),%rbp
  push   %rbx
  movslq %ecx,%rbx
  sub    $0x58,%rsp
  mov    %edx,0x4(%rsp)
  cmp    %edx,%ecx
  je     L2
  add    $0x1,%eax
  lea    D29(%rip),%rbp
  mov    %rdi,%r12
  mov    %rsi,%r13
  cltq
  mov    %r9d,%r15d
  mov    %r8,%r14
  mov    %rax,0x8(%rsp)
L290:
  mov    0x8(%rsp),%rcx
  movzbl -0x1(%r12,%rcx,1),%eax
  mov    %al,-0x1(%r13,%rcx,1)
  mov    %rcx,%rax
  cmp    %ecx,0x4(%rsp)
  je     L298
  add    $0x1,%eax
  cltq
  mov    %rax,0x38(%rsp)
L131:
  mov    0x38(%rsp),%rcx
  movzbl -0x1(%r12,%rcx,1),%eax
  mov    %al,-0x1(%r13,%rcx,1)
  cmp    %ecx,0x4(%rsp)
  je     L294
  mov    %ecx,%eax
  add    $0x1,%eax
  cltq
  mov    %rax,0x10(%rsp)
  mov    %r15d,%eax
  mov    %r12,%r15
  mov    %r13,%r12
  mov    %r14,%r13
  mov    %eax,%r14d
L403:
  mov    0x10(%rsp),%rcx
  movzbl -0x1(%r15,%rcx,1),%eax
  mov    %al,-0x1(%r12,%rcx,1)
  mov    %rcx,%rax
  cmp    %ecx,0x4(%rsp)
  je     L318
  add    $0x1,%eax
  cltq
  mov    %rax,0x18(%rsp)
L351:
  mov    0x18(%rsp),%rcx
  movzbl -0x1(%r15,%rcx,1),%eax
  mov    %al,-0x1(%r12,%rcx,1)
  mov    %rcx,%rax
  cmp    %ecx,0x4(%rsp)
  je     L89
  add    $0x1,%eax
  cltq
  mov    %rax,0x20(%rsp)
L348:
  mov    0x20(%rsp),%rcx
  movzbl -0x1(%r15,%rcx,1),%eax
  mov    %al,-0x1(%r12,%rcx,1)
  cmp    %ecx,0x4(%rsp)
  je     L188
  mov    %ecx,%eax
  add    $0x1,%eax
  cltq
  mov    %rax,0x28(%rsp)
L361:
  mov    0x28(%rsp),%rdx
  movzbl -0x1(%r15,%rdx,1),%eax
  mov    %al,-0x1(%r12,%rdx,1)
  cmp    %edx,0x4(%rsp)
  je     L250
  mov    %edx,%eax
  add    $0x1,%eax
  cltq
  mov    %rax,0x30(%rsp)
L94:
  mov    0x30(%rsp),%rbx
  movzbl -0x1(%r15,%rbx,1),%eax
  mov    %al,-0x1(%r12,%rbx,1)
  cmp    %ebx,0x4(%rsp)
  je     L174
  mov    %ebx,%eax
  add    $0x1,%eax
  movslq %eax,%rbx
L261:
  movzbl -0x1(%r15,%rbx,1),%eax
  mov    %al,-0x1(%r12,%rbx,1)
  cmp    %ebx,0x4(%rsp)
  je     L284
  mov    0x4(%rsp),%eax
  lea    0x1(%rbx),%r11d
  mov    %rbx,0x40(%rsp)
  movslq %r11d,%r11
  sub    $0x1,%eax
  sub    %ebx,%eax
  lea    0x2(%rbx,%rax,1),%rax
  mov    %r11,%rbx
  mov    %rax,0x48(%rsp)
L145:
  movzbl -0x1(%r15,%rbx,1),%eax
  mov    0x4(%rsp),%edx
  mov    %r12,%rsi
  mov    %r15,%rdi
  mov    %r14d,%r9d
  mov    %r13,%r8
  mov    %ebx,%ecx
  mov    %al,-0x1(%r12,%rbx,1)
  call   <suggest>
  movsbl -0x1(%r15,%rbx,1),%edi
  mov    %r14d,%edx
  mov    %r13,%rsi
  call   <contains@plt>
  test   %rax,%rax
  je     L227
  movsbl -0x1(%r15,%rbx,1),%edi
  mov    %r14d,%edx
  mov    %r13,%rsi
  call   <replace@plt>
  mov    %al,-0x1(%r12,%rbx,1)
  add    $0x1,%rbx
  cmp    0x48(%rsp),%rbx
  jne    L145
  movslq 0x4(%rsp),%rax
  mov    0x40(%rsp),%rbx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movb   $0x0,(%r12,%rax,1)
  call   <printf@plt>
  movsbl -0x1(%r15,%rbx,1),%edi
  mov    %r14d,%edx
  mov    %r13,%rsi
  call   <contains@plt>
  test   %rax,%rax
  jne    L363
L306:
  mov    0x30(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  jne    L125
L91:
  mov    0x28(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  jne    L130
L110:
  mov    0x20(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  jne    L143
L373:
  mov    0x18(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L407
L334:
  mov    0x18(%rsp),%rbx
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rbx,1),%edi
  call   <replace@plt>
  addq   $0x1,0x18(%rsp)
  mov    %al,-0x1(%r12,%rbx,1)
  jmp    L351
  nopl   0x0(%rax)
L284:
  movslq 0x4(%rsp),%rax
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movb   $0x0,(%r12,%rax,1)
  mov    %rax,0x40(%rsp)
  call   <printf@plt>
  movsbl -0x1(%r15,%rbx,1),%edi
  mov    %r14d,%edx
  mov    %r13,%rsi
  call   <contains@plt>
  test   %rax,%rax
  je     L306
  movsbl -0x1(%r15,%rbx,1),%edi
  mov    %r14d,%edx
  mov    %r13,%rsi
  call   <replace@plt>
  mov    %r12,%rsi
  mov    %rbp,%rdi
  mov    %al,-0x1(%r12,%rbx,1)
  mov    0x40(%rsp),%rax
  movb   $0x0,(%r12,%rax,1)
  call   <printf@plt>
  mov    0x30(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L91
L125:
  mov    0x30(%rsp),%rbx
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rbx,1),%edi
  call   <replace@plt>
  addq   $0x1,0x30(%rsp)
  mov    %al,-0x1(%r12,%rbx,1)
  jmp    L94
L250:
  movslq 0x4(%rsp),%rbx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movb   $0x0,(%r12,%rbx,1)
  call   <printf@plt>
  mov    0x28(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L110
  mov    0x28(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <replace@plt>
  mov    0x28(%rsp),%rcx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  mov    %al,-0x1(%r12,%rcx,1)
  movb   $0x0,(%r12,%rbx,1)
  call   <printf@plt>
  mov    0x20(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L373
L143:
  mov    0x20(%rsp),%rbx
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rbx,1),%edi
  call   <replace@plt>
  addq   $0x1,0x20(%rsp)
  mov    %al,-0x1(%r12,%rbx,1)
  jmp    L348
L174:
  movslq 0x4(%rsp),%rbx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movb   $0x0,(%r12,%rbx,1)
  call   <printf@plt>
  mov    0x30(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L91
  mov    0x30(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <replace@plt>
  mov    0x30(%rsp),%rcx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  mov    %al,-0x1(%r12,%rcx,1)
  movb   $0x0,(%r12,%rbx,1)
  call   <printf@plt>
  mov    0x28(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L110
L130:
  mov    0x28(%rsp),%rbx
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rbx,1),%edi
  call   <replace@plt>
  addq   $0x1,0x28(%rsp)
  mov    %al,-0x1(%r12,%rbx,1)
  jmp    L361
L188:
  movslq 0x4(%rsp),%rbx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movb   $0x0,(%r12,%rbx,1)
  call   <printf@plt>
  mov    0x20(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L373
  mov    0x20(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <replace@plt>
  mov    0x20(%rsp),%rcx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  mov    %al,-0x1(%r12,%rcx,1)
  movb   $0x0,(%r12,%rbx,1)
  call   <printf@plt>
  mov    0x18(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  jne    L334
L407:
  mov    0x10(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L349
  mov    0x10(%rsp),%rbx
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rbx,1),%edi
  call   <replace@plt>
  addq   $0x1,0x10(%rsp)
  mov    %al,-0x1(%r12,%rbx,1)
  jmp    L403
L89:
  movslq 0x4(%rsp),%rbx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movb   $0x0,(%r12,%rbx,1)
  call   <printf@plt>
  mov    0x18(%rsp),%rax
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L407
  mov    0x18(%rsp),%rax
  mov    %r13,%rsi
  mov    %r14d,%edx
  movsbl -0x1(%r15,%rax,1),%edi
  call   <replace@plt>
  mov    0x18(%rsp),%rcx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  mov    %al,-0x1(%r12,%rcx,1)
  movb   $0x0,(%r12,%rbx,1)
  call   <printf@plt>
  jmp    L407
L349:
  mov    %r14d,%eax
  mov    %r13,%r14
  mov    %r12,%r13
  mov    %r15,%r12
  mov    %eax,%r15d
L85:
  mov    0x38(%rsp),%rax
  mov    %r15d,%edx
  mov    %r14,%rsi
  movsbl -0x1(%r12,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L401
  mov    0x38(%rsp),%rbx
  mov    %r15d,%edx
  mov    %r14,%rsi
  movsbl -0x1(%r12,%rbx,1),%edi
  call   <replace@plt>
  addq   $0x1,0x38(%rsp)
  mov    %al,-0x1(%r13,%rbx,1)
  jmp    L131
L318:
  movslq 0x4(%rsp),%rbx
  mov    %r14d,%eax
  mov    %r13,%r14
  mov    %r12,%r13
  mov    %r13,%rsi
  mov    %rbp,%rdi
  mov    %r15,%r12
  mov    %eax,%r15d
  movb   $0x0,0x0(%r13,%rbx,1)
  call   <printf@plt>
  mov    0x10(%rsp),%rax
  mov    %r15d,%edx
  mov    %r14,%rsi
  movsbl -0x1(%r12,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L85
  mov    0x10(%rsp),%rax
  mov    %r14,%rsi
  mov    %r15d,%edx
  movsbl -0x1(%r12,%rax,1),%edi
  call   <replace@plt>
  mov    0x10(%rsp),%rcx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  mov    %al,-0x1(%r13,%rcx,1)
  movb   $0x0,0x0(%r13,%rbx,1)
  call   <printf@plt>
  jmp    L85
L294:
  movslq 0x4(%rsp),%rbx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  movb   $0x0,0x0(%r13,%rbx,1)
  call   <printf@plt>
  mov    0x38(%rsp),%rax
  mov    %r15d,%edx
  mov    %r14,%rsi
  movsbl -0x1(%r12,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L401
  mov    0x38(%rsp),%rax
  mov    %r14,%rsi
  mov    %r15d,%edx
  movsbl -0x1(%r12,%rax,1),%edi
  call   <replace@plt>
  mov    0x38(%rsp),%rsi
  mov    %rbp,%rdi
  mov    %al,-0x1(%r13,%rsi,1)
  mov    %r13,%rsi
  movb   $0x0,0x0(%r13,%rbx,1)
  call   <printf@plt>
L401:
  mov    0x8(%rsp),%rax
  mov    %r15d,%edx
  mov    %r14,%rsi
  movsbl -0x1(%r12,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L344
  mov    0x8(%rsp),%rbx
  mov    %r15d,%edx
  mov    %r14,%rsi
  movsbl -0x1(%r12,%rbx,1),%edi
  call   <replace@plt>
  addq   $0x1,0x8(%rsp)
  mov    %al,-0x1(%r13,%rbx,1)
  jmp    L290
L298:
  movslq 0x4(%rsp),%rbx
  mov    %r15d,%eax
  mov    %r13,%r15
  lea    D29(%rip),%rbp
  mov    %r14,%rdx
  mov    %r15,%rsi
  mov    %rbp,%rdi
  mov    %r12,%r14
  movb   $0x0,(%r15,%rbx,1)
  mov    %rdx,%r12
  mov    %eax,%r13d
  call   <printf@plt>
  mov    0x8(%rsp),%rax
  mov    %r13d,%edx
  mov    %r12,%rsi
  movsbl -0x1(%r14,%rax,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L344
  mov    0x8(%rsp),%rax
  mov    %r13d,%edx
  mov    %r12,%rsi
  movsbl -0x1(%r14,%rax,1),%edi
  call   <replace@plt>
  mov    0x8(%rsp),%rdx
  mov    %al,-0x1(%r15,%rdx,1)
L2:
  movb   $0x0,(%r15,%rbx,1)
  add    $0x58,%rsp
  mov    %r15,%rsi
  mov    %rbp,%rdi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1070 <printf@plt>
L344:
  add    $0x58,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L227:
  mov    0x40(%rsp),%rbx
  mov    %r14d,%edx
  mov    %r13,%rsi
  movsbl -0x1(%r15,%rbx,1),%edi
  call   <contains@plt>
  test   %rax,%rax
  je     L306
L363:
  movsbl -0x1(%r15,%rbx,1),%edi
  mov    %r14d,%edx
  mov    %r13,%rsi
  call   <replace@plt>
  mov    %al,-0x1(%r12,%rbx,1)
  add    $0x1,%rbx
  jmp    L261
```

tool_calls: name: read_data
arguments: data_tag: D29
type: string

tool: D29: %s 


assistant: ```c
void suggest(char password[], char out[], int len, int pos, char map[][2], int map_len) {
  if (len == pos) {
    out[len] = '\0';
    printf("%s \n", out);
    return;
  }
  out[pos] = password[pos];
  suggest(password, out, len, pos + 1, map, map_len);
  if (contains(password[pos], map, map_len)) {
    out[pos] = replace(password[pos], map, map_len);
    suggest(password, out, len, pos + 1, map, map_len);
  }
}
```