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

```asm
<FullElement>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbx
  sub    $0x48,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %rdx,-0x58(%rbp)
  mov    %ecx,-0x5c(%rbp)
  mov    %r8d,%edx
  mov    %r9d,-0x64(%rbp)
  mov    0x10(%rbp),%eax
  mov    %dl,-0x60(%rbp)
  mov    %al,-0x68(%rbp)
  mov    0x18(%rbp),%rax
  movl   $0x0,(%rax)
  mov    0x20(%rbp),%rax
  movl   $0x0,(%rax)
  mov    0x28(%rbp),%rax
  movl   $0x0,(%rax)
  mov    0x30(%rbp),%rax
  movl   $0x0,(%rax)
  mov    -0x64(%rbp),%eax
  cmp    -0x5c(%rbp),%eax
  jl     L359
  mov    $0x0,%eax
  jmp    L95
L359:
  mov    -0x64(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,-0x34(%rbp)
  mov    $0x0,%r13d
  mov    $0x0,%r14d
  mov    $0x0,%r15d
  movl   $0xffffffff,-0x38(%rbp)
  mov    $0x1,%ebx
  jmp    L514
L98:
  test   %ebx,%ebx
  jne    L414
  movslq %ebx,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x60(%rbp)
  jne    L414
  movslq %ebx,%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x60(%rbp)
  jne    L414
  movslq %ebx,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x60(%rbp)
  je     L384
L414:
  movslq %ebx,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x60(%rbp)
  je     L156
  movslq %ebx,%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x60(%rbp)
  je     L156
  movslq %ebx,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x60(%rbp)
  jne    L384
L156:
  test   %ebx,%ebx
  jle    L123
  movslq %ebx,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  movslq %ebx,%rax
  lea    -0x1(%rax),%rcx
  mov    -0x48(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L384
  movslq %ebx,%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  movslq %ebx,%rax
  lea    -0x1(%rax),%rcx
  mov    -0x50(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L384
  movslq %ebx,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  movslq %ebx,%rax
  lea    -0x1(%rax),%rcx
  mov    -0x58(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L384
L123:
  mov    -0x5c(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,%ebx
  jne    L484
L384:
  cmp    -0x34(%rbp),%r13d
  jl     L386
  cmp    -0x34(%rbp),%r14d
  jl     L386
  cmp    -0x34(%rbp),%r15d
  jge    L386
  mov    0x18(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%edx
  mov    0x18(%rbp),%rax
  mov    %edx,(%rax)
  jmp    L82
L386:
  cmp    -0x34(%rbp),%r13d
  jge    L450
  cmp    -0x34(%rbp),%r14d
  jl     L450
  cmp    -0x34(%rbp),%r15d
  jl     L450
  mov    0x20(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%edx
  mov    0x20(%rbp),%rax
  mov    %edx,(%rax)
  jmp    L82
L450:
  cmp    -0x34(%rbp),%r13d
  jl     L306
  cmp    -0x34(%rbp),%r14d
  jge    L306
  cmp    -0x34(%rbp),%r15d
  jge    L306
  mov    0x28(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%edx
  mov    0x28(%rbp),%rax
  mov    %edx,(%rax)
  jmp    L82
L306:
  cmp    -0x34(%rbp),%r13d
  jge    L82
  cmp    -0x34(%rbp),%r14d
  jge    L82
  cmp    -0x34(%rbp),%r15d
  jl     L82
  mov    0x30(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%edx
  mov    0x30(%rbp),%rax
  mov    %edx,(%rax)
L82:
  cmp    -0x34(%rbp),%r13d
  jl     L177
  cmp    -0x34(%rbp),%r14d
  jl     L430
  cmp    -0x34(%rbp),%r15d
  jge    L177
L430:
  mov    -0x38(%rbp),%eax
  lea    -0x1(%rax),%r12d
  jmp    L172
L376:
  movslq %r12d,%rdx
  mov    -0x48(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x68(%rbp),%eax
  mov    %al,(%rdx)
  add    $0x1,%r12d
L172:
  cmp    %ebx,%r12d
  jl     L376
L177:
  cmp    -0x34(%rbp),%r14d
  jl     L33
  cmp    -0x34(%rbp),%r13d
  jl     L268
  cmp    -0x34(%rbp),%r15d
  jge    L33
L268:
  mov    -0x38(%rbp),%eax
  lea    -0x1(%rax),%r12d
  jmp    L244
L513:
  movslq %r12d,%rdx
  mov    -0x50(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x68(%rbp),%eax
  mov    %al,(%rdx)
  add    $0x1,%r12d
L244:
  cmp    %ebx,%r12d
  jl     L513
L33:
  cmp    -0x34(%rbp),%r15d
  jl     L421
  cmp    -0x34(%rbp),%r13d
  jl     L449
  cmp    -0x34(%rbp),%r14d
  jge    L421
L449:
  mov    -0x38(%rbp),%eax
  lea    -0x1(%rax),%r12d
  jmp    L320
L107:
  movslq %r12d,%rdx
  mov    -0x58(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x68(%rbp),%eax
  mov    %al,(%rdx)
  add    $0x1,%r12d
L320:
  cmp    %ebx,%r12d
  jl     L107
L421:
  mov    $0x0,%r13d
  mov    $0x0,%r14d
  mov    $0x0,%r15d
  movl   $0xffffffff,-0x38(%rbp)
  jmp    L323
L484:
  movslq %ebx,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x60(%rbp)
  jne    L319
  add    $0x1,%r13d
L319:
  movslq %ebx,%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x60(%rbp)
  jne    L451
  add    $0x1,%r14d
L451:
  movslq %ebx,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x60(%rbp)
  jne    L417
  add    $0x1,%r15d
L417:
  cmpl   $0xffffffff,-0x38(%rbp)
  jne    L323
  cmp    $0x1,%r13d
  je     L97
  cmp    $0x1,%r14d
  je     L97
  cmp    $0x1,%r15d
  jne    L323
L97:
  mov    %ebx,-0x38(%rbp)
L323:
  add    $0x1,%ebx
L514:
  cmp    -0x5c(%rbp),%ebx
  jl     L98
  movsbl -0x68(%rbp),%ecx
  movsbl -0x60(%rbp),%edx
  mov    -0x34(%rbp),%edi
  mov    -0x5c(%rbp),%esi
  mov    -0x48(%rbp),%rax
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <CorrectAsn@plt>
  movsbl -0x68(%rbp),%ecx
  movsbl -0x60(%rbp),%edx
  mov    -0x34(%rbp),%edi
  mov    -0x5c(%rbp),%esi
  mov    -0x50(%rbp),%rax
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <CorrectAsn@plt>
  movsbl -0x68(%rbp),%ecx
  movsbl -0x60(%rbp),%edx
  mov    -0x34(%rbp),%edi
  mov    -0x5c(%rbp),%esi
  mov    -0x58(%rbp),%rax
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <CorrectAsn@plt>
  mov    0x18(%rbp),%rax
  mov    (%rax),%edx
  mov    0x20(%rbp),%rax
  mov    (%rax),%eax
  imul   %eax,%edx
  mov    0x28(%rbp),%rax
  mov    (%rax),%eax
  imul   %eax,%edx
  mov    0x30(%rbp),%rax
  mov    (%rax),%eax
  imul   %edx,%eax
L95:
  add    $0x48,%rsp
  pop    %rbx
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  pop    %rbp
  ret
```

assistant: ```c
int FullElement(char *Asn1, char *Asn2, char *Asn3, int Length, char SecStrType, int ElemLength, char EditChar, int *YYN, int *NYY, int *YNN, int *NNY) {
  register int i, j, Count1, Count2, Count3;
  int Beg, ElLength;
  *YYN = 0;
  *NYY = 0;
  *YNN = 0;
  *NNY = 0;
  if (ElemLength >= Length)
    return (0);
  ElLength = ElemLength - 1;
  Count1 = 0;
  Count2 = 0;
  Count3 = 0;
  Beg = -1;
  for (i = 1; i < Length; i++) {
    if ((i == 0 && (Asn1[i] == SecStrType && Asn2[i] == SecStrType && Asn3[i] == SecStrType) || (Asn1[i] != SecStrType && Asn2[i] != SecStrType && Asn3[i] != SecStrType)) || (i > 0 && (Asn1[i] != Asn1[i - 1] || Asn2[i] != Asn2[i - 1] || Asn3[i] != Asn3[i - 1])) || i == Length - 1) {
      if (Count1 >= ElLength && Count2 >= ElLength && Count3 < ElLength)
        (*YYN)++;
      else if (Count1 < ElLength && Count2 >= ElLength && Count3 >= ElLength)
        (*NYY)++;
      else if (Count1 >= ElLength && Count2 < ElLength && Count3 < ElLength)
        (*YNN)++;
      else if (Count1 < ElLength && Count2 < ElLength && Count3 >= ElLength)
        (*NNY)++;
      if (Count1 >= ElLength && (Count2 < ElLength || Count3 < ElLength))
        for (j = Beg - 1; j < i; j++)
          Asn1[j] = EditChar;
      if (Count2 >= ElLength && (Count1 < ElLength || Count3 < ElLength))
        for (j = Beg - 1; j < i; j++)
          Asn2[j] = EditChar;
      if (Count3 >= ElLength && (Count1 < ElLength || Count2 < ElLength))
        for (j = Beg - 1; j < i; j++)
          Asn3[j] = EditChar;
      Count1 = 0;
      Count2 = 0;
      Count3 = 0;
      Beg = -1;
    } else {
      if (Asn1[i] == SecStrType)
        Count1++;
      if (Asn2[i] == SecStrType)
        Count2++;
      if (Asn3[i] == SecStrType)
        Count3++;
      if (Beg == -1 && (Count1 == 1 || Count2 == 1 || Count3 == 1))
        Beg = i;
    }
  }
  CorrectAsn(Asn1, Length, SecStrType, EditChar, ElLength);
  CorrectAsn(Asn2, Length, SecStrType, EditChar, ElLength);
  CorrectAsn(Asn3, Length, SecStrType, EditChar, ElLength);
  return ((*YYN) * (*NYY) * (*YNN) * (*NNY));
}
```