user: Translate the below assembly code into C programming language:

```asm
<Heap>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %rcx,-0x50(%rbp)
  mov    %r8,-0x58(%rbp)
  mov    -0x58(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  movq   $0x1,-0x30(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  jmp    L55
L45:
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <LeftChild@plt>
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  cmp    -0x50(%rbp),%rax
  jge    L43
  mov    -0x28(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  jbe    L43
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x28(%rbp)
L43:
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <RightChild@plt>
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  cmp    -0x50(%rbp),%rax
  jge    L74
  mov    -0x28(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  jbe    L74
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x28(%rbp)
L74:
  mov    -0x28(%rbp),%rax
  cmp    -0x20(%rbp),%rax
  jne    L67
  movq   $0x0,-0x30(%rbp)
  jmp    L55
L67:
  mov    -0x20(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    -0x20(%rbp),%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x48(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%rax
  mov    %rax,(%rdx)
  mov    -0x28(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x20(%rbp)
L55:
  cmpq   $0x0,-0x30(%rbp)
  jne    L45
  nop
  nop
  leave
  ret
```

assistant: ```c
void Heap(double *Vector, long *TieBreaker, long *Rank, long ListSize, long start) {
  long notdone;
  long left, right, largest, current;
  long tmprank;
  current = start;
  notdone = 1;
  largest = current;
  while (notdone) {
    left = LeftChild(current);
    if (left < ListSize) {
      if (Vector[Rank[largest]] < Vector[Rank[left]])
        largest = left;
    }
    right = RightChild(current);
    if (right < ListSize) {
      if (Vector[Rank[largest]] < Vector[Rank[right]])
        largest = right;
    }
    if (largest == current)
      notdone = 0;
    else {
      tmprank = Rank[current];
      Rank[current] = Rank[largest];
      Rank[largest] = tmprank;
      current = largest;
    }
  }
}
```