// File: chhylp123[P]hifiasm/Correct.cpp
// Function: tuning_ext_offset(overlap_region*, k_mer_hit*, long, long, long, long, long, long, long*, long*, long*, long*, long*, long*, long*)
void tuning_ext_offset(overlap_region *z, k_mer_hit *ch_a, int64_t ch_n, int64_t ql, int64_t tl, int64_t wl, 
int64_t fusion_k_len, int64_t fusion_win_occ, int64_t *ch_s0, int64_t *ch_e0, int64_t *qs0, int64_t *qe0, int64_t *ts0, int64_t *te0, int64_t *mode)
{
    ///[qs, qe)
    if((*mode) != 1 && (*mode) != 2) return;
    int64_t qs = *qs0, qe = *qe0, ts = *ts0, te = *te0, ch_s = *ch_s0, ch_e = *ch_e0;
    int64_t ke, ks, p[3], we, ws, k, wid;
    int64_t sl, gq, gt, gl, gg, update, min_g = INT32_MAX, min_id = -1;
    adjust_ext_offset(&qs, &qe, &ts, &te, ql, tl, 0, *mode); p[0] = p[1] = p[2] = -1;
    if((*mode) == 1) {///forward extension
        //qs0 and ts0 are fixed; te0 = -1, qe0 is unreliable
        if(qe > (*qe0)) {
            ///find k-mer hit
            ke = ch_a[ch_s].self_offset;
            for (ch_e = ch_s; (ch_e < ch_n) && (ch_a[ch_e].self_offset < (*qe0)); ch_e++) {
                ke = ch_a[ch_e].self_offset;
            }
            for (ke += fusion_k_len; (ch_e < ch_n) && (ch_a[ch_e].self_offset < ke); ch_e++) {
                if(ch_a[ch_e].self_offset<(*qe0)) continue;
                if((ch_a[ch_e].offset<=(*ts0))||(ch_a[ch_e].self_offset<=(*qs0))) continue;//not co-linear
                if(is_pri_aln(ch_a[ch_e])) {
                    p[2] = ch_e; break;
                } else if(ch_a[ch_e].cnt > 1 && p[1] == -1) {
                    p[1] = ch_e;
                } else if(p[0] == -1) {
                    p[0] = ch_e;
                }
            }
            if(p[2] != -1) p[0] = p[2];
            else if(p[1] != -1) p[0] = p[1];
            if(p[0] != -1) {
                (*mode) = 0;///global
                (*qe0) = ch_a[p[0]].self_offset; (*te0) = ch_a[p[0]].offset; (*ch_e0) = p[0];
                return;
            }

            ///find aligned window
            we = (*qe0); we/=wl; we *= wl; we +=wl; we--; ///next window
            for (k = 0; we < qe && we <= z->x_pos_e && k < fusion_win_occ; we+=wl) {//[ws, we]; [qs, qe)
                wid = get_win_id_by_e(z, we, wl, NULL);
                if(z->w_list.a[wid].y_end == -1) continue;//unmapped
                if(z->w_list.a[wid].x_end < (*qs0)) continue;
                if(z->w_list.a[wid].y_end < (*ts0)) continue;
                sl = z->w_list.a[wid].x_end+1-z->w_list.a[wid].x_start;
                if(z->w_list.a[wid].error > (sl/A_L)) continue;
                gq = z->w_list.a[wid].x_end-(*qs0); 
                gt = z->w_list.a[wid].y_end-(*ts0); 
                gl = MIN(gq, gt); gl/=16; if(gl <= 0) gl = 1;
                gg = (gq>=gt)?(gq-gt):(gt-gq); gg /= gl;
                update = 0;
                if(min_g>gg) {
                    update = 1;
                } else if((min_g==gg)&&(z->w_list.a[min_id].error>z->w_list.a[wid].error)) {
                    update = 1;
                } 
                if(update) {
                    min_g = gg; min_id = wid;
                }
                k++;
            }
        }

        if(min_id != -1) {
            (*qe0) = z->w_list.a[min_id].x_end+1; 
            (*te0) = z->w_list.a[min_id].y_end+1; 
            (*mode) = 0;///global
        } else {
            (*qe0) = qe; (*te0) = te;//extension
        }
    } else if((*mode) == 2) {///backward extension
        //qe0 and te0 are fixed; ts0 = -1, qs0 is unreliable
        if(qs < (*qs0)) {
            ///find k-mer hit
            ks = ch_a[ch_e].self_offset;
            for (ch_s = ch_e; (ch_s >= 0) && (ch_a[ch_s].self_offset > (*qs0)); ch_s--) {
                ks = ch_a[ch_s].self_offset;
            }
            for (ks -= fusion_k_len; (ch_s >= 0) && (ch_a[ch_s].self_offset > ks); ch_s--) {
                if(ch_a[ch_s].self_offset>(*qs0)) continue;
                if((ch_a[ch_s].offset>=(*te0))||(ch_a[ch_s].self_offset>=(*qe0))) continue;//not co-linear
                if(is_pri_aln(ch_a[ch_s])) {
                    p[2] = ch_s; break;
                } else if(ch_a[ch_s].cnt > 1 && p[1] == -1) {
                    p[1] = ch_s;
                } else if(p[0] == -1) {
                    p[0] = ch_s;
                }
            }
            // fprintf(stderr, "-[M::%s::] utg%.6dl(%c), p[0]::%ld, p[1]::%ld, p[2]::%ld\n", 
            //             __func__, (int32_t)z->y_id+1, "+-"[z->y_pos_strand], p[0], p[1], p[2]);
            if(p[2] != -1) p[0] = p[2];
            else if(p[1] != -1) p[0] = p[1];
            if(p[0] != -1) {
                (*mode) = 0;///global
                (*qs0) = ch_a[p[0]].self_offset; (*ts0) = ch_a[p[0]].offset; (*ch_s0) = p[0];
                return;
            }

            ///find aligned window
            ws = (*qs0)-1; ws/=wl; ws*=wl; 
            for (k = 0; ws >= qs && ws >= z->x_pos_s && k < fusion_win_occ; ws-=wl) {//[ws, we]; [qs, qe)
                wid = get_win_id_by_s(z, ws, wl, NULL);
                if(z->w_list.a[wid].y_end == -1) continue;//unmapped
                if(z->w_list.a[wid].x_start >= (*qe0)) continue;
                if(z->w_list.a[wid].y_start >= (*te0)) continue;
                sl = z->w_list.a[wid].x_end+1-z->w_list.a[wid].x_start;
                if(z->w_list.a[wid].error > (sl/A_L)) continue;
                gq = (*qe0) - z->w_list.a[wid].x_start; 
                gt = (*te0) - z->w_list.a[wid].y_start; 
                gl = MIN(gq, gt); gl/=16; if(gl <= 0) gl = 1;
                gg = (gq>=gt)?(gq-gt):(gt-gq); gg /= gl;
                update = 0;
                if(min_g>gg) {
                    update = 1;
                } else if((min_g==gg)&&(z->w_list.a[min_id].error>z->w_list.a[wid].error)) {
                    update = 1;
                } 
                if(update) {
                    min_g = gg; min_id = wid;
                }
                k++;
            }
        }

        if(min_id != -1) {
            (*qs0) = z->w_list.a[min_id].x_start; 
            (*ts0) = z->w_list.a[min_id].y_start; 
            (*mode) = 0;///global
        } else {
            (*qs0) = qs; (*ts0) = ts; ///still extension
        }
    }

    if((*ch_e0) == -1) {
        for ((*ch_e0)=(*ch_s0);((*ch_e0)<ch_n)&&(ch_a[(*ch_e0)].self_offset>=(*qs0))&&(ch_a[(*ch_e0)].self_offset<=(*qe0)); (*ch_e0)++);
    }

    if((*ch_s0) == -1) {
        for ((*ch_s0)=(*ch_e0);((*ch_s0)>=0)&&(ch_a[(*ch_s0)].self_offset>=(*qs0))&&(ch_a[(*ch_s0)].self_offset<=(*qe0)); (*ch_s0)--);
        (*ch_s0)++;
    }
    ///boundry
    for (;((*ch_e0)<ch_n)&&(ch_a[(*ch_e0)].self_offset>=(*qs0))&&(ch_a[(*ch_e0)].self_offset<=(*qe0)); (*ch_e0)++);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x150, %rsp            # imm = 0x150
movq 0x50(%rbp), %rax
movq 0x48(%rbp), %rax
movq 0x40(%rbp), %rax
movq 0x38(%rbp), %rax
movq 0x30(%rbp), %rax
movq 0x28(%rbp), %rax
movq 0x20(%rbp), %rax
movq 0x18(%rbp), %rax
movq 0x10(%rbp), %rax
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq %r9, -0x30(%rbp)
movq 0x50(%rbp), %rax
cmpq $0x1, (%rax)
je 0x5cd20
movq 0x50(%rbp), %rax
cmpq $0x2, (%rax)
je 0x5cd20
jmp 0x5dce7
movq 0x30(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x38(%rbp)
movq 0x38(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x40(%rbp)
movq 0x40(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x48(%rbp)
movq 0x48(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x50(%rbp)
movq 0x20(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x58(%rbp)
movq 0x28(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x60(%rbp)
movq $0x7fffffff, -0xe8(%rbp) # imm = 0x7FFFFFFF
movq $-0x1, -0xf0(%rbp)
movq -0x20(%rbp), %r8
movq -0x28(%rbp), %r9
movq 0x50(%rbp), %rax
movq (%rax), %rax
leaq -0x38(%rbp), %rdi
leaq -0x40(%rbp), %rsi
leaq -0x48(%rbp), %rdx
leaq -0x50(%rbp), %rcx
xorl %r10d, %r10d
movq $0x0, (%rsp)
movq %rax, 0x8(%rsp)
callq 0x581e0
movq $-0x1, -0x80(%rbp)
movq $-0x1, -0x88(%rbp)
movq $-0x1, -0x90(%rbp)
movq 0x50(%rbp), %rax
cmpq $0x1, (%rax)
jne 0x5d489
movq -0x40(%rbp), %rax
movq 0x38(%rbp), %rcx
cmpq (%rcx), %rax
jle 0x5d40b
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq %rax, -0x68(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rcx
xorl %eax, %eax
cmpq -0x18(%rbp), %rcx
movb %al, -0xf1(%rbp)
jge 0x5ce3b
movq -0x10(%rbp), %rax
movq -0x60(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq 0x38(%rbp), %rcx
cmpq (%rcx), %rax
setl %al
movb %al, -0xf1(%rbp)
movb -0xf1(%rbp), %al
testb $0x1, %al
jne 0x5ce47
jmp 0x5ce6b
movq -0x10(%rbp), %rax
movq -0x60(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq %rax, -0x68(%rbp)
movq -0x60(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x5ce07
movq 0x10(%rbp), %rax
addq -0x68(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x60(%rbp), %rcx
xorl %eax, %eax
cmpq -0x18(%rbp), %rcx
movb %al, -0xf2(%rbp)
jge 0x5cea8
movq -0x10(%rbp), %rax
movq -0x60(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
cmpq -0x68(%rbp), %rax
setl %al
movb %al, -0xf2(%rbp)
movb -0xf2(%rbp), %al
testb $0x1, %al
jne 0x5ceb7
jmp 0x5cfbe
movq -0x10(%rbp), %rax
movq -0x60(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq 0x38(%rbp), %rcx
cmpq (%rcx), %rax
jge 0x5ced7
jmp 0x5cfad
movq -0x10(%rbp), %rax
movq -0x60(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
movq 0x40(%rbp), %rcx
cmpq (%rcx), %rax
jle 0x5cf0d
movq -0x10(%rbp), %rax
movq -0x60(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq 0x30(%rbp), %rcx
cmpq (%rcx), %rax
jg 0x5cf12
jmp 0x5cfad
movq -0x10(%rbp), %rax
movq -0x60(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl (%rax), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
cmpl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
je 0x5cf5c
movq -0x10(%rbp), %rax
movq -0x60(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0xc(%rax), %eax
movq -0x10(%rbp), %rcx
movq -0x60(%rbp), %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movl (%rcx), %ecx
andl $0x7fffffff, %ecx       # imm = 0x7FFFFFFF
cmpl %ecx, %eax
jb 0x5cf66
movq -0x60(%rbp), %rax
movq %rax, -0x80(%rbp)
jmp 0x5cfbe
movq -0x10(%rbp), %rax
movq -0x60(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
cmpl $0x1, 0xc(%rax)
jbe 0x5cf92
cmpq $-0x1, -0x88(%rbp)
jne 0x5cf92
movq -0x60(%rbp), %rax
movq %rax, -0x88(%rbp)
jmp 0x5cfa9
cmpq $-0x1, -0x90(%rbp)
jne 0x5cfa7
movq -0x60(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x5cfa9
jmp 0x5cfab
jmp 0x5cfad
movq -0x60(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x5ce77
cmpq $-0x1, -0x80(%rbp)
je 0x5cfd2
movq -0x80(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x5cfec
cmpq $-0x1, -0x88(%rbp)
je 0x5cfea
movq -0x88(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x5cfec
cmpq $-0x1, -0x90(%rbp)
je 0x5d050
movq 0x50(%rbp), %rax
movq $0x0, (%rax)
movq -0x10(%rbp), %rax
movq -0x90(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movl %eax, %ecx
movq 0x38(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movq -0x90(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
movl %eax, %ecx
movq 0x48(%rbp), %rax
movq %rcx, (%rax)
movq -0x90(%rbp), %rcx
movq 0x28(%rbp), %rax
movq %rcx, (%rax)
jmp 0x5dce7
movq 0x38(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x98(%rbp)
movq -0x30(%rbp), %rcx
movq -0x98(%rbp), %rax
cqto
idivq %rcx
movq %rax, -0x98(%rbp)
movq -0x30(%rbp), %rax
imulq -0x98(%rbp), %rax
movq %rax, -0x98(%rbp)
movq -0x30(%rbp), %rax
addq -0x98(%rbp), %rax
movq %rax, -0x98(%rbp)
movq -0x98(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x98(%rbp)
movq $0x0, -0xa8(%rbp)
movq -0x98(%rbp), %rcx
xorl %eax, %eax
cmpq -0x40(%rbp), %rcx
movb %al, -0xf3(%rbp)
jge 0x5d0fd
movq -0x98(%rbp), %rcx
movq -0x8(%rbp), %rax
movl 0x8(%rax), %eax
movl %eax, %edx
xorl %eax, %eax
cmpq %rdx, %rcx
movb %al, -0xf3(%rbp)
jg 0x5d0fd
movq -0xa8(%rbp), %rax
cmpq 0x18(%rbp), %rax
setl %al
movb %al, -0xf3(%rbp)
movb -0xf3(%rbp), %al
testb $0x1, %al
jne 0x5d10c
jmp 0x5d409
movq -0x8(%rbp), %rdi
movq -0x98(%rbp), %rsi
movq -0x30(%rbp), %rdx
xorl %eax, %eax
movl %eax, %ecx
callq 0x9e250
movq %rax, -0xb0(%rbp)
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
cmpl $-0x1, 0xc(%rax)
jne 0x5d14c
jmp 0x5d3f2
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq 0x4(%rax), %rax
movq 0x30(%rbp), %rcx
cmpq (%rcx), %rax
jge 0x5d174
jmp 0x5d3f2
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq 0xc(%rax), %rax
movq 0x40(%rbp), %rcx
cmpq (%rcx), %rax
jge 0x5d19c
jmp 0x5d3f2
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
addl $0x1, %eax
movq -0x8(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0xb0(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
subl (%rcx), %eax
cltq
movq %rax, -0xb8(%rbp)
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movswq 0x14(%rax), %rax
movq %rax, -0x100(%rbp)
movq -0xb8(%rbp), %rax
movl $0x10, %ecx
cqto
idivq %rcx
movq %rax, %rcx
movq -0x100(%rbp), %rax
cmpq %rcx, %rax
jle 0x5d220
jmp 0x5d3f2
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq 0x4(%rax), %rax
movq 0x30(%rbp), %rcx
subq (%rcx), %rax
movq %rax, -0xc0(%rbp)
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq 0xc(%rax), %rax
movq 0x40(%rbp), %rcx
subq (%rcx), %rax
movq %rax, -0xc8(%rbp)
movq -0xc0(%rbp), %rax
cmpq -0xc8(%rbp), %rax
jg 0x5d290
movq -0xc0(%rbp), %rax
movq %rax, -0x108(%rbp)
jmp 0x5d29e
movq -0xc8(%rbp), %rax
movq %rax, -0x108(%rbp)
movq -0x108(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0xd0(%rbp), %rax
movl $0x10, %ecx
cqto
idivq %rcx
movq %rax, -0xd0(%rbp)
cmpq $0x0, -0xd0(%rbp)
jg 0x5d2d9
movq $0x1, -0xd0(%rbp)
movq -0xc0(%rbp), %rax
cmpq -0xc8(%rbp), %rax
jl 0x5d300
movq -0xc0(%rbp), %rax
subq -0xc8(%rbp), %rax
movq %rax, -0x110(%rbp)
jmp 0x5d315
movq -0xc8(%rbp), %rax
subq -0xc0(%rbp), %rax
movq %rax, -0x110(%rbp)
movq -0x110(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0xd0(%rbp), %rcx
movq -0xd8(%rbp), %rax
cqto
idivq %rcx
movq %rax, -0xd8(%rbp)
movq $0x0, -0xe0(%rbp)
movq -0xe8(%rbp), %rax
cmpq -0xd8(%rbp), %rax
jle 0x5d365
movq $0x1, -0xe0(%rbp)
jmp 0x5d3ba
movq -0xe8(%rbp), %rax
cmpq -0xd8(%rbp), %rax
jne 0x5d3b8
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xf0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movswl 0x14(%rax), %eax
movq -0x8(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0xb0(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
movswl 0x14(%rcx), %ecx
cmpl %ecx, %eax
jle 0x5d3b8
movq $0x1, -0xe0(%rbp)
jmp 0x5d3ba
cmpq $0x0, -0xe0(%rbp)
je 0x5d3e0
movq -0xd8(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq -0xb0(%rbp), %rax
movq %rax, -0xf0(%rbp)
movq -0xa8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xa8(%rbp)
movq -0x30(%rbp), %rax
addq -0x98(%rbp), %rax
movq %rax, -0x98(%rbp)
jmp 0x5d0b7
jmp 0x5d40b
cmpq $-0x1, -0xf0(%rbp)
je 0x5d46e
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xf0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
addl $0x1, %eax
movslq %eax, %rcx
movq 0x38(%rbp), %rax
movq %rcx, (%rax)
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xf0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0xc(%rax), %eax
addl $0x1, %eax
movslq %eax, %rcx
movq 0x48(%rbp), %rax
movq %rcx, (%rax)
movq 0x50(%rbp), %rax
movq $0x0, (%rax)
jmp 0x5d484
movq -0x40(%rbp), %rcx
movq 0x38(%rbp), %rax
movq %rcx, (%rax)
movq -0x50(%rbp), %rcx
movq 0x48(%rbp), %rax
movq %rcx, (%rax)
jmp 0x5db20
movq 0x50(%rbp), %rax
cmpq $0x2, (%rax)
jne 0x5db1e
movq -0x38(%rbp), %rax
movq 0x30(%rbp), %rcx
cmpq (%rcx), %rax
jge 0x5daae
movq -0x10(%rbp), %rax
movq -0x60(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq %rax, -0x70(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0x58(%rbp)
xorl %eax, %eax
cmpq $0x0, -0x58(%rbp)
movb %al, -0x111(%rbp)
jl 0x5d4f7
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq 0x30(%rbp), %rcx
cmpq (%rcx), %rax
setg %al
movb %al, -0x111(%rbp)
movb -0x111(%rbp), %al
testb $0x1, %al
jne 0x5d503
jmp 0x5d527
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq %rax, -0x70(%rbp)
movq -0x58(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x5d4c6
movq 0x10(%rbp), %rcx
movq -0x70(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x70(%rbp)
xorl %eax, %eax
cmpq $0x0, -0x58(%rbp)
movb %al, -0x112(%rbp)
jl 0x5d564
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
cmpq -0x70(%rbp), %rax
setg %al
movb %al, -0x112(%rbp)
movb -0x112(%rbp), %al
testb $0x1, %al
jne 0x5d573
jmp 0x5d67a
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq 0x30(%rbp), %rcx
cmpq (%rcx), %rax
jle 0x5d593
jmp 0x5d669
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
movq 0x48(%rbp), %rcx
cmpq (%rcx), %rax
jge 0x5d5c9
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq 0x38(%rbp), %rcx
cmpq (%rcx), %rax
jl 0x5d5ce
jmp 0x5d669
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl (%rax), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
cmpl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
je 0x5d618
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0xc(%rax), %eax
movq -0x10(%rbp), %rcx
movq -0x58(%rbp), %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movl (%rcx), %ecx
andl $0x7fffffff, %ecx       # imm = 0x7FFFFFFF
cmpl %ecx, %eax
jb 0x5d622
movq -0x58(%rbp), %rax
movq %rax, -0x80(%rbp)
jmp 0x5d67a
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
cmpl $0x1, 0xc(%rax)
jbe 0x5d64e
cmpq $-0x1, -0x88(%rbp)
jne 0x5d64e
movq -0x58(%rbp), %rax
movq %rax, -0x88(%rbp)
jmp 0x5d665
cmpq $-0x1, -0x90(%rbp)
jne 0x5d663
movq -0x58(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x5d665
jmp 0x5d667
jmp 0x5d669
movq -0x58(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x5d536
cmpq $-0x1, -0x80(%rbp)
je 0x5d68e
movq -0x80(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x5d6a8
cmpq $-0x1, -0x88(%rbp)
je 0x5d6a6
movq -0x88(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x5d6a8
cmpq $-0x1, -0x90(%rbp)
je 0x5d70c
movq 0x50(%rbp), %rax
movq $0x0, (%rax)
movq -0x10(%rbp), %rax
movq -0x90(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movl %eax, %ecx
movq 0x30(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movq -0x90(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
movl %eax, %ecx
movq 0x40(%rbp), %rax
movq %rcx, (%rax)
movq -0x90(%rbp), %rcx
movq 0x20(%rbp), %rax
movq %rcx, (%rax)
jmp 0x5dce7
movq 0x30(%rbp), %rax
movq (%rax), %rax
subq $0x1, %rax
movq %rax, -0xa0(%rbp)
movq -0x30(%rbp), %rcx
movq -0xa0(%rbp), %rax
cqto
idivq %rcx
movq %rax, -0xa0(%rbp)
movq -0x30(%rbp), %rax
imulq -0xa0(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq $0x0, -0xa8(%rbp)
movq -0xa0(%rbp), %rcx
xorl %eax, %eax
cmpq -0x38(%rbp), %rcx
movb %al, -0x113(%rbp)
jl 0x5d799
movq -0xa0(%rbp), %rcx
movq -0x8(%rbp), %rax
movl 0x4(%rax), %eax
movl %eax, %edx
xorl %eax, %eax
cmpq %rdx, %rcx
movb %al, -0x113(%rbp)
jl 0x5d799
movq -0xa8(%rbp), %rax
cmpq 0x18(%rbp), %rax
setl %al
movb %al, -0x113(%rbp)
movb -0x113(%rbp), %al
testb $0x1, %al
jne 0x5d7a8
jmp 0x5daac
movq -0x8(%rbp), %rdi
movq -0xa0(%rbp), %rsi
movq -0x30(%rbp), %rdx
xorl %eax, %eax
movl %eax, %ecx
callq 0x9e2e0
movq %rax, -0xb0(%rbp)
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
cmpl $-0x1, 0xc(%rax)
jne 0x5d7e8
jmp 0x5da92
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq (%rax), %rax
movq 0x38(%rbp), %rcx
cmpq (%rcx), %rax
jl 0x5d80f
jmp 0x5da92
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq 0x8(%rax), %rax
movq 0x48(%rbp), %rcx
cmpq (%rcx), %rax
jl 0x5d837
jmp 0x5da92
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
addl $0x1, %eax
movq -0x8(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0xb0(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
subl (%rcx), %eax
cltq
movq %rax, -0xb8(%rbp)
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xb0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movswq 0x14(%rax), %rax
movq %rax, -0x120(%rbp)
movq -0xb8(%rbp), %rax
movl $0x10, %ecx
cqto
idivq %rcx
movq %rax, %rcx
movq -0x120(%rbp), %rax
cmpq %rcx, %rax
jle 0x5d8bb
jmp 0x5da92
movq 0x38(%rbp), %rax
movq (%rax), %rax
movq -0x8(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0xb0(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
movslq (%rcx), %rcx
subq %rcx, %rax
movq %rax, -0xc0(%rbp)
movq 0x48(%rbp), %rax
movq (%rax), %rax
movq -0x8(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0xb0(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
movslq 0x8(%rcx), %rcx
subq %rcx, %rax
movq %rax, -0xc8(%rbp)
movq -0xc0(%rbp), %rax
cmpq -0xc8(%rbp), %rax
jg 0x5d930
movq -0xc0(%rbp), %rax
movq %rax, -0x128(%rbp)
jmp 0x5d93e
movq -0xc8(%rbp), %rax
movq %rax, -0x128(%rbp)
movq -0x128(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0xd0(%rbp), %rax
movl $0x10, %ecx
cqto
idivq %rcx
movq %rax, -0xd0(%rbp)
cmpq $0x0, -0xd0(%rbp)
jg 0x5d979
movq $0x1, -0xd0(%rbp)
movq -0xc0(%rbp), %rax
cmpq -0xc8(%rbp), %rax
jl 0x5d9a0
movq -0xc0(%rbp), %rax
subq -0xc8(%rbp), %rax
movq %rax, -0x130(%rbp)
jmp 0x5d9b5
movq -0xc8(%rbp), %rax
subq -0xc0(%rbp), %rax
movq %rax, -0x130(%rbp)
movq -0x130(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0xd0(%rbp), %rcx
movq -0xd8(%rbp), %rax
cqto
idivq %rcx
movq %rax, -0xd8(%rbp)
movq $0x0, -0xe0(%rbp)
movq -0xe8(%rbp), %rax
cmpq -0xd8(%rbp), %rax
jle 0x5da05
movq $0x1, -0xe0(%rbp)
jmp 0x5da5a
movq -0xe8(%rbp), %rax
cmpq -0xd8(%rbp), %rax
jne 0x5da58
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xf0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movswl 0x14(%rax), %eax
movq -0x8(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0xb0(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
movswl 0x14(%rcx), %ecx
cmpl %ecx, %eax
jle 0x5da58
movq $0x1, -0xe0(%rbp)
jmp 0x5da5a
cmpq $0x0, -0xe0(%rbp)
je 0x5da80
movq -0xd8(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq -0xb0(%rbp), %rax
movq %rax, -0xf0(%rbp)
movq -0xa8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xa8(%rbp)
movq -0x30(%rbp), %rcx
movq -0xa0(%rbp), %rax
subq %rcx, %rax
movq %rax, -0xa0(%rbp)
jmp 0x5d753
jmp 0x5daae
cmpq $-0x1, -0xf0(%rbp)
je 0x5db06
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xf0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq (%rax), %rcx
movq 0x30(%rbp), %rax
movq %rcx, (%rax)
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xf0(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq 0x8(%rax), %rcx
movq 0x40(%rbp), %rax
movq %rcx, (%rax)
movq 0x50(%rbp), %rax
movq $0x0, (%rax)
jmp 0x5db1c
movq -0x38(%rbp), %rcx
movq 0x30(%rbp), %rax
movq %rcx, (%rax)
movq -0x48(%rbp), %rcx
movq 0x40(%rbp), %rax
movq %rcx, (%rax)
jmp 0x5db1e
jmp 0x5db20
movq 0x28(%rbp), %rax
cmpq $-0x1, (%rax)
jne 0x5dbbe
movq 0x20(%rbp), %rax
movq (%rax), %rcx
movq 0x28(%rbp), %rax
movq %rcx, (%rax)
movq 0x28(%rbp), %rax
movq (%rax), %rcx
xorl %eax, %eax
cmpq -0x18(%rbp), %rcx
movb %al, -0x131(%rbp)
jge 0x5db9e
movq -0x10(%rbp), %rax
movq 0x28(%rbp), %rcx
movq (%rcx), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movl %eax, %ecx
movq 0x30(%rbp), %rdx
xorl %eax, %eax
cmpq (%rdx), %rcx
movb %al, -0x131(%rbp)
jl 0x5db9e
movq -0x10(%rbp), %rax
movq 0x28(%rbp), %rcx
movq (%rcx), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq 0x38(%rbp), %rcx
cmpq (%rcx), %rax
setle %al
movb %al, -0x131(%rbp)
movb -0x131(%rbp), %al
testb $0x1, %al
jne 0x5dbaa
jmp 0x5dbbc
jmp 0x5dbac
movq 0x28(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0x5db3c
jmp 0x5dbbe
movq 0x20(%rbp), %rax
cmpq $-0x1, (%rax)
jne 0x5dc65
movq 0x28(%rbp), %rax
movq (%rax), %rcx
movq 0x20(%rbp), %rax
movq %rcx, (%rax)
movq 0x20(%rbp), %rcx
xorl %eax, %eax
cmpq $0x0, (%rcx)
movb %al, -0x132(%rbp)
jl 0x5dc39
movq -0x10(%rbp), %rax
movq 0x20(%rbp), %rcx
movq (%rcx), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movl %eax, %ecx
movq 0x30(%rbp), %rdx
xorl %eax, %eax
cmpq (%rdx), %rcx
movb %al, -0x132(%rbp)
jl 0x5dc39
movq -0x10(%rbp), %rax
movq 0x20(%rbp), %rcx
movq (%rcx), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq 0x38(%rbp), %rcx
cmpq (%rcx), %rax
setle %al
movb %al, -0x132(%rbp)
movb -0x132(%rbp), %al
testb $0x1, %al
jne 0x5dc45
jmp 0x5dc57
jmp 0x5dc47
movq 0x20(%rbp), %rax
movq (%rax), %rcx
addq $-0x1, %rcx
movq %rcx, (%rax)
jmp 0x5dbda
movq 0x20(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0x5dc67
movq 0x28(%rbp), %rax
movq (%rax), %rcx
xorl %eax, %eax
cmpq -0x18(%rbp), %rcx
movb %al, -0x133(%rbp)
jge 0x5dcc9
movq -0x10(%rbp), %rax
movq 0x28(%rbp), %rcx
movq (%rcx), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movl %eax, %ecx
movq 0x30(%rbp), %rdx
xorl %eax, %eax
cmpq (%rdx), %rcx
movb %al, -0x133(%rbp)
jl 0x5dcc9
movq -0x10(%rbp), %rax
movq 0x28(%rbp), %rcx
movq (%rcx), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movq 0x38(%rbp), %rcx
cmpq (%rcx), %rax
setle %al
movb %al, -0x133(%rbp)
movb -0x133(%rbp), %al
testb $0x1, %al
jne 0x5dcd5
jmp 0x5dce7
jmp 0x5dcd7
movq 0x28(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0x5dc67
addq $0x150, %rsp            # imm = 0x150
popq %rbp
retq