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

```asm
<string_strcmp_ignore_chars>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  sub    $0x8,%rsp
  test   %rdi,%rdi
  je     L144
  mov    %rdi,%r12
  mov    %rdx,%rbx
  mov    %ecx,%r13d
  test   %rsi,%rsi
  je     L69
  nopl   0x0(%rax)
L238:
  movsbl (%r12),%esi
  test   %sil,%sil
  je     L352
  test   %rbp,%rbp
  je     L292
  cmpb   $0x0,0x0(%rbp)
  jne    L323
  jmp    L292
  nopl   0x0(%rax,%rax,1)
L34:
  movsbl (%rax),%esi
  test   %sil,%sil
  je     L262
L323:
  mov    %rbx,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L262
  mov    %r12,%rdi
  call   <utf8_next_char@plt>
  mov    %rax,%r12
  test   %rax,%rax
  jne    L34
  nopl   (%rax)
L262:
  movsbl 0x0(%rbp),%esi
  test   %sil,%sil
  je     L17
  mov    %rbx,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L17
  mov    %rbp,%rdi
  call   <utf8_next_char@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  jne    L262
L320:
  test   %r12,%r12
  je     L16
  cmpb   $0x0,(%r12)
  je     L16
L292:
  mov    $0x1,%eax
L38:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopw   0x0(%rax,%rax,1)
L17:
  test   %r12,%r12
  je     L286
  cmpb   $0x0,(%r12)
  je     L286
  cmpb   $0x0,0x0(%rbp)
  je     L292
  test   %r13d,%r13d
  je     L247
  movsbl (%r12),%eax
  movsbl 0x0(%rbp),%edx
  sub    %edx,%eax
L224:
  test   %eax,%eax
  jne    L249
  mov    %r12,%rdi
  call   <utf8_next_char@plt>
  mov    %rbp,%rdi
  mov    %rax,%r12
  call   <utf8_next_char@plt>
  mov    %rax,%rbp
  test   %r12,%r12
  jne    L188
  jmp    L239
  xchg   %ax,%ax
L57:
  mov    %rbx,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L377
  mov    %r12,%rdi
  call   <utf8_next_char@plt>
  mov    %rax,%r12
  test   %rax,%rax
  je     L377
L188:
  movsbl (%r12),%esi
  test   %sil,%sil
  jne    L57
L377:
  test   %rbp,%rbp
  jne    L227
  jmp    L320
  nopl   0x0(%rax)
L0:
  mov    %rbx,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L220
  mov    %rbp,%rdi
  call   <utf8_next_char@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  je     L220
L227:
  movsbl 0x0(%rbp),%esi
  test   %sil,%sil
  jne    L0
L220:
  test   %r12,%r12
  jne    L238
L352:
  test   %rbp,%rbp
  je     L16
  cmpb   $0x0,0x0(%rbp)
  jne    L285
  nopw   0x0(%rax,%rax,1)
L16:
  xor    %eax,%eax
L163:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   (%rax)
L286:
  cmpb   $0x0,0x0(%rbp)
  je     L16
L285:
  add    $0x8,%rsp
  mov    $0xffffffff,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  xchg   %ax,%ax
L247:
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <utf8_charcasecmp@plt>
  jmp    L224
L69:
  test   %rdi,%rdi
  jne    L292
L144:
  neg    %rbp
  sbb    %eax,%eax
  jmp    L38
L239:
  test   %rax,%rax
  jne    L227
  xor    %eax,%eax
  jmp    L163
  nopl   0x0(%rax)
L249:
  jns    L292
  jmp    L285
```

assistant: ```c
int string_strcmp_ignore_chars(const char *string1, const char *string2, const char *chars_ignored, int case_sensitive) {
  int diff;
  if (!string1 || !string2)
    return (string1) ? 1 : ((string2) ? -1 : 0);
  while (string1 && string1[0] && string2 && string2[0]) {
    while (string1 && string1[0] && strchr(chars_ignored, string1[0])) {
      string1 = utf8_next_char(string1);
    }
    while (string2 && string2[0] && strchr(chars_ignored, string2[0])) {
      string2 = utf8_next_char(string2);
    }
    if ((!string1 || !string1[0]) && (!string2 || !string2[0]))
      return 0;
    if ((!string1 || !string1[0]) && string2 && string2[0])
      return -1;
    if (string1 && string1[0] && (!string2 || !string2[0]))
      return 1;
    diff = (case_sensitive) ? (int)string1[0] - (int)string2[0] : utf8_charcasecmp(string1, string2);
    if (diff != 0)
      return (diff < 0) ? -1 : 1;
    string1 = utf8_next_char(string1);
    string2 = utf8_next_char(string2);
    while (string1 && string1[0] && strchr(chars_ignored, string1[0])) {
      string1 = utf8_next_char(string1);
    }
    while (string2 && string2[0] && strchr(chars_ignored, string2[0])) {
      string2 = utf8_next_char(string2);
    }
  }
  if ((!string1 || !string1[0]) && string2 && string2[0])
    return -1;
  if (string1 && string1[0] && (!string2 || !string2[0]))
    return 1;
  return 0;
}
```