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

```asm
<predict_seq>:
  endbr64
  push   %r15
  push   %r14
  mov    %rdi,%r14
  push   %r13
  lea    -0x50(%rcx),%r13
  push   %r12
  lea    D15(%rip),%r12
  push   %rbp
  xor    %ebp,%ebp
  push   %rbx
  lea    -0x50(%rsi),%rbx
  sub    $0xf8,%rsp
  movdqa D16(%rip),%xmm0
  mov    %rdx,0x30(%rsp)
  lea    0x40(%rsp),%r15
  mov    %rsi,0x28(%rsp)
  mov    %rcx,0x38(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0xe8(%rsp)
  xor    %eax,%eax
  lea    -0x50(%rdx),%rax
  lea    0x44(%rsp),%rdx
  mov    %r15,0x20(%rsp)
  movl   $0x14,0xe0(%rsp)
  mov    %rax,%r15
  mov    %rdx,0x10(%rsp)
  movaps %xmm0,0x40(%rsp)
  movaps %xmm0,0x50(%rsp)
  movaps %xmm0,0x60(%rsp)
  movaps %xmm0,0x70(%rsp)
  movaps %xmm0,0x80(%rsp)
  movaps %xmm0,0x90(%rsp)
  movaps %xmm0,0xa0(%rsp)
  movaps %xmm0,0xb0(%rsp)
  movaps %xmm0,0xc0(%rsp)
  movaps %xmm0,0xd0(%rsp)
  jmp    L45
  nop
L28:
  add    $0x1,%rbp
  add    $0x4,%rbx
  add    $0x4,%r15
  add    $0x4,%r13
L45:
  mov    %r14,%rdi
  call   <strlen@plt>
  mov    %ebp,0xc(%rsp)
  cmp    %ebp,%eax
  jle    L58
  movsbl (%r14,%rbp,1),%esi
  mov    %r12,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  mov    %rax,0x18(%rsp)
  je     L28
  mov    0x20(%rsp),%rsi
  mov    0x10(%rsp),%rdi
  mov    $0xa0,%edx
  call   <memmove@plt>
  mov    0x18(%rsp),%rcx
  sub    %r12,%rcx
  cmpl   $0x13,0xc(%rsp)
  mov    %ecx,0x40(%rsp)
  jle    L28
  mov    0x20(%rsp),%rdi
  mov    %r13,%rcx
  mov    %r15,%rdx
  mov    %rbx,%rsi
  call   <predict@plt>
  jmp    L28
L58:
  lea    -0x14(%rax),%ebx
  mov    0x28(%rsp),%r13
  mov    0x30(%rsp),%r12
  movslq %ebx,%rbp
  mov    0x20(%rsp),%r15
  shl    $0x2,%rbp
  add    %rbp,%r13
  add    %rbp,%r12
  add    0x38(%rsp),%rbp
  nopw   0x0(%rax,%rax,1)
L19:
  mov    0x10(%rsp),%rdi
  mov    $0xa0,%edx
  mov    %r15,%rsi
  add    $0x1,%ebx
  call   <memmove@plt>
  mov    %rbp,%rcx
  mov    %r12,%rdx
  mov    %r13,%rsi
  mov    %r15,%rdi
  add    $0x4,%r13
  add    $0x4,%r12
  add    $0x4,%rbp
  movl   $0x14,0x40(%rsp)
  call   <predict@plt>
  mov    %r14,%rdi
  call   <strlen@plt>
  cmp    %eax,%ebx
  jl     L19
  mov    0xe8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L32
  add    $0xf8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L32:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: data_tag: D15
type: string
name: unpack_data
arguments: data_tag: D16
type: byte[16]

tool: D15: FIVWMLCHYAGNRTPDEQSK

tool: {"D16": [0x14,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x14,0x00,0x00,0x00]}

assistant: ```c
void predict_seq(char const *seq, float sm_arr[], float sb_arr[], float sr_arr[]) {
  char *alphabet = "FIVWMLCHYAGNRTPDEQSK";
  char *p;
  int i, j, s[41];
  for (i = 0; i < 41; ++i)
    s[i] = 21 - 1;
  for (i = 0; i < (int)strlen(seq); ++i) {
    p = strchr(alphabet, seq[i]);
    if (p != NULL) {
      for (j = 1; j < 41; ++j)
        s[41 - j] = s[41 - j - 1];
      s[0] = p - alphabet;
      if (i >= (41 - 1) / 2) {
        predict(s, &sm_arr[i - (41 - 1) / 2], &sb_arr[i - (41 - 1) / 2], &sr_arr[i - (41 - 1) / 2]);
      }
    }
  }
  for (i = (int)strlen(seq) - (41 - 1) / 2; i < (int)strlen(seq); ++i) {
    for (j = 1; j < 41; ++j)
      s[41 - j] = s[41 - j - 1];
    s[0] = 21 - 1;
    predict(s, &sm_arr[i], &sb_arr[i], &sr_arr[i]);
  }
  return;
}
```