// File: chhylp123[P]hifiasm/Correct.cpp
// Function: hpc_mask_ff_region(char*, long, long, long, long, long, long, double)
uint8_t hpc_mask_ff_region(char *sa, int64_t sn, int64_t s0, int64_t e0, int64_t hpc_flk, int64_t hpc_rr, int64_t hpc_cutoff, double hpc_rate)
{
    assert(e0>=s0);
    int64_t s = ((s0>=hpc_flk)?(s0-hpc_flk):0), e = (((e0+hpc_flk)<=sn)?(e0+hpc_flk):(sn)), k, r, rc, zs, ze, os, oe, ovlp; 

    for (r = 1; r <= hpc_rr; r++) {
        rc = r * (MAX(hpc_cutoff, hpc_rr));///hpc_cutoff = 6;
        
        ///inlcuding p
        for (k = ((e0>s0)?(e0-1):(e0))+r; (k < e) && ((k-r) >= s) && (sa[k] == sa[k-r]); k++); ze = k; if(ze > e) ze = e; 
        for (k = ((e0>s0)?(e0-1):(e0))-1; (k >= s) && ((k+r) < e) && (sa[k] == sa[k+r]); k--); zs = k + 1; if(zs < s) zs = s;
        if(((ze - zs) > r) && ((ze - zs) >= rc)) {
            os = MAX(zs, s0); oe = MIN(ze, e0);
	        ovlp = ((oe>os)? (oe-os):0);
            if(e0 > s0) {
                if(ovlp > 0 && (ovlp >= ((e0 - s0)*hpc_rate))) return 1;///hpc_rate = 0.51
            } else {
                if(zs <= s0 && ze >= e0) return 1;
            }
        } 

        ///do not inlcude p
        if(e0 <= s0) {
            for (k = e0 + r + 1; (k < e) && ((k-r) >= s) && (sa[k] == sa[k-r]); k++); 
            zs = e0 + 1; if(zs < s) zs = s; ze = k; if(ze > e) ze = e; 
            if(((ze - zs) > r) && ((ze - zs) >= rc)) {
                // fprintf(stderr, "-1-[M::%s] p::%ld, hh::[%ld,%ld), f::%u, %.*s\n", __func__, p, zs, ze, f?1:0, (int32_t)(ze - zs), sa + zs);
                return 1;
            }  
        }

        ///inlcuding p
        for (k = s0 - r; (k >= s) && ((k+r) < e) && (sa[k] == sa[k+r]); k--); zs = k + 1; if(zs < s) zs = s; 
        for (k = s0 + 1; (k < e) && ((k-r) >= s) && (sa[k] == sa[k-r]); k++); ze = k; if(ze > e) ze = e; 
        if(((ze - zs) > r) && ((ze - zs) >= rc)) {
            os = MAX(zs, s0); oe = MIN(ze, e0);
	        ovlp = ((oe>os)? (oe-os):0);
            if(e0 > s0) {
                if(ovlp > 0 && (ovlp >= ((e0 - s0)*hpc_rate))) return 1;
            } else {
                if(zs <= s0 && ze >= e0) return 1;
            }
        } 

        ///do not inlcude p
        if(e0 <= s0) {
            for (k = s0 - r - 1; (k >= s) && ((k+r) < e) && (sa[k] == sa[k+r]); k--); 
            zs = k + 1; if(zs < s) zs = s; ze = s0; if(ze > e) ze = e; 
            if(((ze - zs) > r) && ((ze - zs) >= rc)) {
                return 1;
            } 
        }
    }
    // fprintf(stderr, "-6-[M::%s] p::%ld, hh::[,), %.*s\n", __func__, p, (int32_t)(e - s), sa + s);
    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x110, %rsp            # imm = 0x110
movq 0x10(%rbp), %rax
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq %r8, -0x30(%rbp)
movq %r9, -0x38(%rbp)
movsd %xmm0, -0x40(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x20(%rbp), %rax
jl 0x4a1b8
jmp 0x4a1d7
leaq 0x338b14(%rip), %rdi    # 0x382cd3
leaq 0x338155(%rip), %rsi    # 0x38231b
movl $0x28d8, %edx           # imm = 0x28D8
leaq 0x338b08(%rip), %rcx    # 0x382cda
callq 0x2130
movq -0x20(%rbp), %rax
cmpq -0x30(%rbp), %rax
jl 0x4a1f2
movq -0x20(%rbp), %rax
subq -0x30(%rbp), %rax
movq %rax, -0x98(%rbp)
jmp 0x4a1fd
xorl %eax, %eax
movq %rax, -0x98(%rbp)
jmp 0x4a1fd
movq -0x98(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x28(%rbp), %rax
addq -0x30(%rbp), %rax
cmpq -0x18(%rbp), %rax
jg 0x4a227
movq -0x28(%rbp), %rax
addq -0x30(%rbp), %rax
movq %rax, -0xa0(%rbp)
jmp 0x4a232
movq -0x18(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0xa0(%rbp), %rax
movq %rax, -0x50(%rbp)
movq $0x1, -0x60(%rbp)
movq -0x60(%rbp), %rax
cmpq -0x38(%rbp), %rax
jg 0x4a94c
movq -0x60(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq 0x10(%rbp), %rax
cmpq -0x38(%rbp), %rax
jl 0x4a275
movq 0x10(%rbp), %rax
movq %rax, -0xb0(%rbp)
jmp 0x4a280
movq -0x38(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0xa8(%rbp), %rax
movq -0xb0(%rbp), %rcx
imulq %rcx, %rax
movq %rax, -0x68(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x20(%rbp), %rax
jle 0x4a2b1
movq -0x28(%rbp), %rax
subq $0x1, %rax
movq %rax, -0xb8(%rbp)
jmp 0x4a2bc
movq -0x28(%rbp), %rax
movq %rax, -0xb8(%rbp)
movq -0xb8(%rbp), %rax
addq -0x60(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rcx
xorl %eax, %eax
cmpq -0x50(%rbp), %rcx
movb %al, -0xb9(%rbp)
jge 0x4a31a
movq -0x58(%rbp), %rcx
subq -0x60(%rbp), %rcx
xorl %eax, %eax
cmpq -0x48(%rbp), %rcx
movb %al, -0xb9(%rbp)
jl 0x4a31a
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movq -0x58(%rbp), %rdx
subq -0x60(%rbp), %rdx
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0xb9(%rbp)
movb -0xb9(%rbp), %al
testb $0x1, %al
jne 0x4a326
jmp 0x4a336
jmp 0x4a328
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x4a2cb
movq -0x58(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x50(%rbp), %rax
jle 0x4a350
movq -0x50(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x20(%rbp), %rax
jle 0x4a36b
movq -0x28(%rbp), %rax
subq $0x1, %rax
movq %rax, -0xc8(%rbp)
jmp 0x4a376
movq -0x28(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0xc8(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rcx
xorl %eax, %eax
cmpq -0x48(%rbp), %rcx
movb %al, -0xc9(%rbp)
jl 0x4a3d4
movq -0x58(%rbp), %rcx
addq -0x60(%rbp), %rcx
xorl %eax, %eax
cmpq -0x50(%rbp), %rcx
movb %al, -0xc9(%rbp)
jge 0x4a3d4
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movq -0x58(%rbp), %rdx
addq -0x60(%rbp), %rdx
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0xc9(%rbp)
movb -0xc9(%rbp), %al
testb $0x1, %al
jne 0x4a3e0
jmp 0x4a3f0
jmp 0x4a3e2
movq -0x58(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x4a385
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x48(%rbp), %rax
jge 0x4a40e
movq -0x48(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x78(%rbp), %rax
subq -0x70(%rbp), %rax
cmpq -0x60(%rbp), %rax
jle 0x4a52a
movq -0x78(%rbp), %rax
subq -0x70(%rbp), %rax
cmpq -0x68(%rbp), %rax
jl 0x4a52a
movq -0x70(%rbp), %rax
cmpq -0x20(%rbp), %rax
jl 0x4a449
movq -0x70(%rbp), %rax
movq %rax, -0xd8(%rbp)
jmp 0x4a454
movq -0x20(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0xd8(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x28(%rbp), %rax
jg 0x4a476
movq -0x78(%rbp), %rax
movq %rax, -0xe0(%rbp)
jmp 0x4a481
movq -0x28(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq -0xe0(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x88(%rbp), %rax
cmpq -0x80(%rbp), %rax
jle 0x4a4b0
movq -0x88(%rbp), %rax
subq -0x80(%rbp), %rax
movq %rax, -0xe8(%rbp)
jmp 0x4a4bb
xorl %eax, %eax
movq %rax, -0xe8(%rbp)
jmp 0x4a4bb
movq -0xe8(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x20(%rbp), %rax
jle 0x4a509
cmpq $0x0, -0x90(%rbp)
jle 0x4a507
cvtsi2sdq -0x90(%rbp), %xmm0
movq -0x28(%rbp), %rax
subq -0x20(%rbp), %rax
cvtsi2sd %rax, %xmm1
mulsd -0x40(%rbp), %xmm1
ucomisd %xmm1, %xmm0
jb 0x4a507
movb $0x1, -0x1(%rbp)
jmp 0x4a950
jmp 0x4a528
movq -0x70(%rbp), %rax
cmpq -0x20(%rbp), %rax
jg 0x4a526
movq -0x78(%rbp), %rax
cmpq -0x28(%rbp), %rax
jl 0x4a526
movb $0x1, -0x1(%rbp)
jmp 0x4a950
jmp 0x4a528
jmp 0x4a52a
movq -0x28(%rbp), %rax
cmpq -0x20(%rbp), %rax
jg 0x4a612
movq -0x28(%rbp), %rax
addq -0x60(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rcx
xorl %eax, %eax
cmpq -0x50(%rbp), %rcx
movb %al, -0xe9(%rbp)
jge 0x4a597
movq -0x58(%rbp), %rcx
subq -0x60(%rbp), %rcx
xorl %eax, %eax
cmpq -0x48(%rbp), %rcx
movb %al, -0xe9(%rbp)
jl 0x4a597
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movq -0x58(%rbp), %rdx
subq -0x60(%rbp), %rdx
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0xe9(%rbp)
movb -0xe9(%rbp), %al
testb $0x1, %al
jne 0x4a5a3
jmp 0x4a5b3
jmp 0x4a5a5
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x4a548
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x48(%rbp), %rax
jge 0x4a5d1
movq -0x48(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x50(%rbp), %rax
jle 0x4a5eb
movq -0x50(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rax
subq -0x70(%rbp), %rax
cmpq -0x60(%rbp), %rax
jle 0x4a610
movq -0x78(%rbp), %rax
subq -0x70(%rbp), %rax
cmpq -0x68(%rbp), %rax
jl 0x4a610
movb $0x1, -0x1(%rbp)
jmp 0x4a950
jmp 0x4a612
movq -0x20(%rbp), %rax
subq -0x60(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rcx
xorl %eax, %eax
cmpq -0x48(%rbp), %rcx
movb %al, -0xea(%rbp)
jl 0x4a66d
movq -0x58(%rbp), %rcx
addq -0x60(%rbp), %rcx
xorl %eax, %eax
cmpq -0x50(%rbp), %rcx
movb %al, -0xea(%rbp)
jge 0x4a66d
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movq -0x58(%rbp), %rdx
addq -0x60(%rbp), %rdx
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0xea(%rbp)
movb -0xea(%rbp), %al
testb $0x1, %al
jne 0x4a679
jmp 0x4a689
jmp 0x4a67b
movq -0x58(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x4a61e
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x48(%rbp), %rax
jge 0x4a6a7
movq -0x48(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rcx
xorl %eax, %eax
cmpq -0x50(%rbp), %rcx
movb %al, -0xeb(%rbp)
jge 0x4a702
movq -0x58(%rbp), %rcx
subq -0x60(%rbp), %rcx
xorl %eax, %eax
cmpq -0x48(%rbp), %rcx
movb %al, -0xeb(%rbp)
jl 0x4a702
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movq -0x58(%rbp), %rdx
subq -0x60(%rbp), %rdx
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0xeb(%rbp)
movb -0xeb(%rbp), %al
testb $0x1, %al
jne 0x4a70e
jmp 0x4a71e
jmp 0x4a710
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x4a6b3
movq -0x58(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x50(%rbp), %rax
jle 0x4a738
movq -0x50(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rax
subq -0x70(%rbp), %rax
cmpq -0x60(%rbp), %rax
jle 0x4a854
movq -0x78(%rbp), %rax
subq -0x70(%rbp), %rax
cmpq -0x68(%rbp), %rax
jl 0x4a854
movq -0x70(%rbp), %rax
cmpq -0x20(%rbp), %rax
jl 0x4a773
movq -0x70(%rbp), %rax
movq %rax, -0xf8(%rbp)
jmp 0x4a77e
movq -0x20(%rbp), %rax
movq %rax, -0xf8(%rbp)
movq -0xf8(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x28(%rbp), %rax
jg 0x4a7a0
movq -0x78(%rbp), %rax
movq %rax, -0x100(%rbp)
jmp 0x4a7ab
movq -0x28(%rbp), %rax
movq %rax, -0x100(%rbp)
movq -0x100(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x88(%rbp), %rax
cmpq -0x80(%rbp), %rax
jle 0x4a7da
movq -0x88(%rbp), %rax
subq -0x80(%rbp), %rax
movq %rax, -0x108(%rbp)
jmp 0x4a7e5
xorl %eax, %eax
movq %rax, -0x108(%rbp)
jmp 0x4a7e5
movq -0x108(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x20(%rbp), %rax
jle 0x4a833
cmpq $0x0, -0x90(%rbp)
jle 0x4a831
cvtsi2sdq -0x90(%rbp), %xmm0
movq -0x28(%rbp), %rax
subq -0x20(%rbp), %rax
cvtsi2sd %rax, %xmm1
mulsd -0x40(%rbp), %xmm1
ucomisd %xmm1, %xmm0
jb 0x4a831
movb $0x1, -0x1(%rbp)
jmp 0x4a950
jmp 0x4a852
movq -0x70(%rbp), %rax
cmpq -0x20(%rbp), %rax
jg 0x4a850
movq -0x78(%rbp), %rax
cmpq -0x28(%rbp), %rax
jl 0x4a850
movb $0x1, -0x1(%rbp)
jmp 0x4a950
jmp 0x4a852
jmp 0x4a854
movq -0x28(%rbp), %rax
cmpq -0x20(%rbp), %rax
jg 0x4a939
movq -0x20(%rbp), %rax
subq -0x60(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rcx
xorl %eax, %eax
cmpq -0x48(%rbp), %rcx
movb %al, -0x109(%rbp)
jl 0x4a8c1
movq -0x58(%rbp), %rcx
addq -0x60(%rbp), %rcx
xorl %eax, %eax
cmpq -0x50(%rbp), %rcx
movb %al, -0x109(%rbp)
jge 0x4a8c1
movq -0x10(%rbp), %rax
movq -0x58(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movq -0x58(%rbp), %rdx
addq -0x60(%rbp), %rdx
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0x109(%rbp)
movb -0x109(%rbp), %al
testb $0x1, %al
jne 0x4a8cd
jmp 0x4a8dd
jmp 0x4a8cf
movq -0x58(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x4a872
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x48(%rbp), %rax
jge 0x4a8fb
movq -0x48(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x50(%rbp), %rax
jle 0x4a915
movq -0x50(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rax
subq -0x70(%rbp), %rax
cmpq -0x60(%rbp), %rax
jle 0x4a937
movq -0x78(%rbp), %rax
subq -0x70(%rbp), %rax
cmpq -0x68(%rbp), %rax
jl 0x4a937
movb $0x1, -0x1(%rbp)
jmp 0x4a950
jmp 0x4a939
jmp 0x4a93b
movq -0x60(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x4a245
movb $0x0, -0x1(%rbp)
movb -0x1(%rbp), %al
addq $0x110, %rsp            # imm = 0x110
popq %rbp
retq
nopl (%rax)