user: Demonstrate the C code that generates the assembly output below:

```asm
<strcoloncmp2>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %esi,-0x3c(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %ecx,-0x40(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  cmpq   $0x0,-0x38(%rbp)
  je     L325
  cmpq   $0x0,-0x48(%rbp)
  je     L325
  mov    $0x1,%eax
  jmp    L301
L325:
  mov    $0x0,%eax
L301:
  mov    %eax,%edi
  call   <assert@plt>
  cmpl   $0xffffffff,-0x3c(%rbp)
  jl     L295
  cmpl   $0xff,-0x3c(%rbp)
  jg     L295
  mov    $0x1,%eax
  jmp    L230
L295:
  mov    $0x0,%eax
L230:
  mov    %eax,%edi
  call   <assert@plt>
  cmpl   $0x0,-0x40(%rbp)
  je     L56
  cmpl   $0x1,-0x40(%rbp)
  jne    L231
L56:
  mov    $0x1,%eax
  jmp    L119
L231:
  mov    $0x0,%eax
L119:
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3a,%al
  jne    L206
  addq   $0x1,-0x20(%rbp)
  jmp    L206
L279:
  mov    -0x20(%rbp),%rax
  cmp    -0x48(%rbp),%rax
  je     L219
  mov    -0x20(%rbp),%rax
  sub    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x3a,%al
  jne    L65
L219:
  mov    $0x1,%eax
  jmp    L281
L65:
  mov    $0x0,%eax
L281:
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L36
L220:
  cmpl   $0x0,-0x40(%rbp)
  je     L244
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L221
L244:
  cmpl   $0x0,-0x40(%rbp)
  jne    L228
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <tolower@plt>
  mov    %rax,%rbx
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <tolower@plt>
  cmp    %rax,%rbx
  jne    L221
L228:
  addq   $0x1,-0x18(%rbp)
  addq   $0x1,-0x20(%rbp)
L36:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L221
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L220
L221:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L73
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3a,%al
  jne    L87
L73:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    %eax,-0x3c(%rbp)
  je     L25
  cmpl   $0xffffffff,-0x3c(%rbp)
  jne    L87
L25:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x8,%al
  jne    L289
  mov    -0x18(%rbp),%rax
  movzbl -0x1(%rax),%eax
  mov    %al,-0x21(%rbp)
  jmp    L166
L43:
  addq   $0x2,-0x18(%rbp)
L166:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x8,%al
  jne    L289
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x21(%rbp)
  je     L43
L289:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %eax,%eax
  jne    L87
  mov    $0x1,%eax
  jmp    L321
L87:
  nop
L270:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L206
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  movzbl (%rax),%eax
  cmp    $0x3a,%al
  jne    L270
L206:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L279
  mov    $0x0,%eax
L321:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
int strcoloncmp2(char *candidate, int end, const char *list, int sen) {
  const char *l = list;
  char *c, c2;
  assert(candidate != NULL && list != NULL);
  assert(end >= -1 && end <= 255);
  assert(sen == 0 || sen == 1);
  if (*l == ':')
    l++;
  while (*l) {
    assert(l == list || l[-1] == ':');
    for (c = candidate; *c && *l; c++, l++)
      if ((sen && *c != *l) || (!sen && tolower(*c) != tolower(*l)))
        break;
    if ((*l == '\0' || *l == ':') && (*c == end || end == -1)) {
      if (*c == '\b') {
        c2 = c[-1];
        while (*c == '\b' && c[1] == c2)
          c += 2;
      }
      if (!isdigit(*c))
        return 1;
    }
    while (*l && *l++ != ':')
      ;
  }
  return 0;
}
```