// File: BenLangmead[P]bowtie/./aligner.h
// Function: PairedBWAlignerV1<EbwtRangeSource>::report(Range const&, Range const&, unsigned int, unsigned int, unsigned int, unsigned int, bool, bool, bool)
bool report(const Range& rL, // range for upstream mate
	            const Range& rR, // range for downstream mate
	            TIndexOffU first,  // ref idx
	            TIndexOffU upstreamOff, // offset for upstream mate
	            TIndexOffU dnstreamOff, // offset for downstream mate
	            TIndexOffU tlen, // length of ref
	            bool pairFw,   // whether the pair is being mapped to fw strand
	            bool ebwtFwL,
	            bool ebwtFwR)
	{
		assert(gAllowMateContainment || upstreamOff < dnstreamOff);
		TIndexOffU spreadL = rL.bot - rL.top;
		TIndexOffU spreadR = rR.bot - rR.top;
		TIndexOffU oms = min(spreadL, spreadR) - 1;
		Read* bufL = pairFw ? bufa_ : bufb_;
		Read* bufR = pairFw ? bufb_ : bufa_;
		TIndexOffU lenL = pairFw ? alen_ : blen_;
		TIndexOffU lenR = pairFw ? blen_ : alen_;
		bool ret;
		assert(!params_->sink().exceededOverThresh());
		params_->setFw(rL.fw);
		// Print upstream mate first
		ret = params_->reportHit(
				rL.fw ? (ebwtFwL?  bufL->patFw  :  bufL->patFwRev) :
					    (ebwtFwL?  bufL->patRc  :  bufL->patRcRev),
				rL.fw ? (ebwtFwL? &bufL->qual    : &bufL->qualRev) :
				        (ebwtFwL? &bufL->qualRev : &bufL->qual),
				&bufL->name,
				ebwtFwL,
				rL.mms,                       // mismatch positions
				rL.refcs,                     // reference characters for mms
				rL.numMms,                    // # mismatches
				make_pair(first, upstreamOff),// position
				make_pair(first, dnstreamOff),// mate position
				rR.fw,                        // mate orientation
				lenR,                         // mate length
				make_pair(rL.top, rL.bot),    // arrows
				tlen,                         // textlen
				lenL,                         // qlen
				rL.stratum,                   // alignment stratum
				rL.cost,                      // cost, including quality penalty
				oms,                          // # other hits
				bufL->patid,
				bufL->seed,
				pairFw ? 1 : 2);
		if(ret) {
			return true; // can happen when -m is set
		}
		params_->setFw(rR.fw);
		ret = params_->reportHit(
				rR.fw ? (ebwtFwR?  bufR->patFw  :  bufR->patFwRev) :
					    (ebwtFwR?  bufR->patRc  :  bufR->patRcRev),
				rR.fw ? (ebwtFwR? &bufR->qual    : &bufR->qualRev) :
				        (ebwtFwR? &bufR->qualRev : &bufR->qual),
				&bufR->name,
				ebwtFwR,
				rR.mms,                       // mismatch positions
				rR.refcs,                     // reference characters for mms
				rR.numMms,                    // # mismatches
				make_pair(first, dnstreamOff),// position
				make_pair(first, upstreamOff),// mate position
				rL.fw,                        // mate orientation
				lenL,                         // mate length
				make_pair(rR.top, rR.bot),    // arrows
				tlen,                         // textlen
				lenR,                         // qlen
				rR.stratum,                   // alignment stratum
				rR.cost,                      // cost, including quality penalty
				oms,                          // # other hits
				bufR->patid,
				bufR->seed,
				pairFw ? 2 : 1);
		return ret;
	}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x278, %rsp            # imm = 0x278
movl %ecx, -0xcc(%rbp)
movq %rdx, -0xc8(%rbp)
movq %rsi, %r10
movl -0xcc(%rbp), %esi
movq %rdi, %r11
movq -0xc8(%rbp), %rdi
movb 0x28(%rbp), %al
movb 0x20(%rbp), %cl
movb 0x18(%rbp), %dl
movl 0x10(%rbp), %ebx
movq %r11, -0x38(%rbp)
movq %r10, -0x40(%rbp)
movq %rdi, -0x48(%rbp)
movl %esi, -0x4c(%rbp)
movl %r8d, -0x50(%rbp)
movl %r9d, -0x54(%rbp)
andb $0x1, %dl
movb %dl, -0x55(%rbp)
andb $0x1, %cl
movb %cl, -0x56(%rbp)
andb $0x1, %al
movb %al, -0x57(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0x40(%rbp), %rax
movl 0x4(%rax), %eax
movq -0x40(%rbp), %rcx
subl (%rcx), %eax
movl %eax, -0x5c(%rbp)
movq -0x48(%rbp), %rax
movl 0x4(%rax), %eax
movq -0x48(%rbp), %rcx
subl (%rcx), %eax
movl %eax, -0x60(%rbp)
leaq -0x5c(%rbp), %rdi
leaq -0x60(%rbp), %rsi
callq 0x26c20
movl (%rax), %eax
subl $0x1, %eax
movl %eax, -0x64(%rbp)
testb $0x1, -0x55(%rbp)
je 0x629f2
movq -0xc0(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0xd8(%rbp)
jmp 0x62a04
movq -0xc0(%rbp), %rax
movq 0x28(%rax), %rax
movq %rax, -0xd8(%rbp)
movq -0xd8(%rbp), %rax
movq %rax, -0x70(%rbp)
testb $0x1, -0x55(%rbp)
je 0x62a29
movq -0xc0(%rbp), %rax
movq 0x28(%rax), %rax
movq %rax, -0xe0(%rbp)
jmp 0x62a3b
movq -0xc0(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0xe0(%rbp)
movq -0xe0(%rbp), %rax
movq %rax, -0x78(%rbp)
testb $0x1, -0x55(%rbp)
je 0x62a5e
movq -0xc0(%rbp), %rax
movl 0x20(%rax), %eax
movl %eax, -0xe4(%rbp)
jmp 0x62a6e
movq -0xc0(%rbp), %rax
movl 0x30(%rax), %eax
movl %eax, -0xe4(%rbp)
movl -0xe4(%rbp), %eax
movl %eax, -0x7c(%rbp)
testb $0x1, -0x55(%rbp)
je 0x62a8f
movq -0xc0(%rbp), %rax
movl 0x30(%rax), %eax
movl %eax, -0xe8(%rbp)
jmp 0x62a9f
movq -0xc0(%rbp), %rax
movl 0x20(%rax), %eax
movl %eax, -0xe8(%rbp)
movq -0xc0(%rbp), %rax
movl -0xe8(%rbp), %ecx
movl %ecx, -0x80(%rbp)
movq 0x90(%rax), %rdi
movq -0x40(%rbp), %rax
movb 0x14(%rax), %al
andb $0x1, %al
movzbl %al, %esi
callq 0x49a40
movq -0xc0(%rbp), %rax
movq 0x90(%rax), %rax
movq %rax, -0xf0(%rbp)
movq -0x40(%rbp), %rax
testb $0x1, 0x14(%rax)
je 0x62b1a
testb $0x1, -0x56(%rbp)
je 0x62af9
movq -0x70(%rbp), %rax
movq %rax, -0xf8(%rbp)
jmp 0x62b0a
movq -0x70(%rbp), %rax
addq $0x90, %rax
movq %rax, -0xf8(%rbp)
movq -0xf8(%rbp), %rax
movq %rax, -0x100(%rbp)
jmp 0x62b50
testb $0x1, -0x56(%rbp)
je 0x62b31
movq -0x70(%rbp), %rax
addq $0x30, %rax
movq %rax, -0x108(%rbp)
jmp 0x62b42
movq -0x70(%rbp), %rax
addq $0xc0, %rax
movq %rax, -0x108(%rbp)
movq -0x108(%rbp), %rax
movq %rax, -0x100(%rbp)
movq -0x100(%rbp), %rax
movq %rax, -0x110(%rbp)
movq -0x40(%rbp), %rax
testb $0x1, 0x14(%rax)
je 0x62ba0
testb $0x1, -0x56(%rbp)
je 0x62b7f
movq -0x70(%rbp), %rax
addq $0x60, %rax
movq %rax, -0x118(%rbp)
jmp 0x62b90
movq -0x70(%rbp), %rax
addq $0xf0, %rax
movq %rax, -0x118(%rbp)
movq -0x118(%rbp), %rax
movq %rax, -0x120(%rbp)
jmp 0x62bd6
testb $0x1, -0x56(%rbp)
je 0x62bb9
movq -0x70(%rbp), %rax
addq $0xf0, %rax
movq %rax, -0x128(%rbp)
jmp 0x62bc8
movq -0x70(%rbp), %rax
addq $0x60, %rax
movq %rax, -0x128(%rbp)
movq -0x128(%rbp), %rax
movq %rax, -0x120(%rbp)
movq -0x120(%rbp), %rax
movq %rax, -0x180(%rbp)
movq -0x70(%rbp), %rax
addq $0x150, %rax            # imm = 0x150
movq %rax, -0x178(%rbp)
movb -0x56(%rbp), %al
movb %al, -0x182(%rbp)
movq -0x40(%rbp), %rax
addq $0x18, %rax
movq %rax, -0x170(%rbp)
movq -0x40(%rbp), %rax
addq $0x38, %rax
movq %rax, -0x160(%rbp)
movq -0x40(%rbp), %rax
movl 0x10(%rax), %eax
movq %rax, -0x158(%rbp)
leaq -0x4c(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x4cb80
movq %rax, -0x8c(%rbp)
leaq -0x4c(%rbp), %rdi
leaq -0x54(%rbp), %rsi
callq 0x4cb80
movq %rax, -0x94(%rbp)
movq -0x48(%rbp), %rax
movb 0x14(%rax), %al
movb %al, -0x181(%rbp)
movl -0x80(%rbp), %eax
movw %ax, -0x13a(%rbp)
movq -0x40(%rbp), %rdi
movq -0x40(%rbp), %rsi
addq $0x4, %rsi
callq 0x4d4f0
movb -0x182(%rbp), %r8b
movb -0x181(%rbp), %sil
movq -0x180(%rbp), %rdx
movq -0x178(%rbp), %rcx
movq -0x170(%rbp), %r9
movq %rax, -0x9c(%rbp)
movl 0x10(%rbp), %r13d
movl -0x7c(%rbp), %r12d
movq -0x40(%rbp), %rax
movl 0xc(%rax), %r15d
movq -0x40(%rbp), %rax
movw 0x8(%rax), %r14w
movl -0x64(%rbp), %ebx
movq -0x70(%rbp), %rax
movl 0x1a4(%rax), %r11d
movq -0x70(%rbp), %rax
movl 0x18c(%rax), %r10d
movb -0x55(%rbp), %al
movb %al, -0x165(%rbp)
movl $0x2, %edi
movl $0x1, %eax
movl %eax, -0x164(%rbp)
movb -0x165(%rbp), %al
testb $0x1, %al
movl -0x164(%rbp), %eax
cmovnel %eax, %edi
movq -0x160(%rbp), %rax
movb %dil, -0x129(%rbp)
movq -0x8c(%rbp), %rdi
movq %rdi, -0x150(%rbp)
movq -0x94(%rbp), %rdi
movq %rdi, -0x148(%rbp)
movq -0x9c(%rbp), %rdi
movq %rdi, -0x138(%rbp)
movq -0xf0(%rbp), %rdi
andb $0x1, %r8b
andb $0x1, %sil
movb %sil, -0x13b(%rbp)
movq -0x110(%rbp), %rsi
movzbl %r8b, %r8d
movq %rax, (%rsp)
movq -0x158(%rbp), %rax
movq %rax, 0x8(%rsp)
movq -0x150(%rbp), %rax
movq %rax, 0x10(%rsp)
movq -0x148(%rbp), %rax
movq %rax, 0x18(%rsp)
movb -0x13b(%rbp), %al
movzbl %al, %eax
movl %eax, 0x20(%rsp)
movw -0x13a(%rbp), %ax
movzwl %ax, %eax
movl %eax, 0x28(%rsp)
movq -0x138(%rbp), %rax
movq %rax, 0x30(%rsp)
movb -0x129(%rbp), %al
movl %r13d, 0x38(%rsp)
movl %r12d, 0x40(%rsp)
movl %r15d, 0x48(%rsp)
movzwl %r14w, %r14d
movl %r14d, 0x50(%rsp)
movl %ebx, 0x58(%rsp)
movl %r11d, 0x60(%rsp)
movl %r10d, 0x68(%rsp)
movzbl %al, %eax
movl %eax, 0x70(%rsp)
callq 0x4cbe0
andb $0x1, %al
movb %al, -0x81(%rbp)
testb $0x1, -0x81(%rbp)
je 0x62dfa
movb $0x1, -0x29(%rbp)
jmp 0x63145
movq -0xc0(%rbp), %rax
movq 0x90(%rax), %rdi
movq -0x48(%rbp), %rax
movb 0x14(%rax), %al
andb $0x1, %al
movzbl %al, %esi
callq 0x49a40
movq -0xc0(%rbp), %rax
movq 0x90(%rax), %rax
movq %rax, -0x190(%rbp)
movq -0x48(%rbp), %rax
testb $0x1, 0x14(%rax)
je 0x62e6c
testb $0x1, -0x57(%rbp)
je 0x62e4b
movq -0x78(%rbp), %rax
movq %rax, -0x198(%rbp)
jmp 0x62e5c
movq -0x78(%rbp), %rax
addq $0x90, %rax
movq %rax, -0x198(%rbp)
movq -0x198(%rbp), %rax
movq %rax, -0x1a0(%rbp)
jmp 0x62ea2
testb $0x1, -0x57(%rbp)
je 0x62e83
movq -0x78(%rbp), %rax
addq $0x30, %rax
movq %rax, -0x1a8(%rbp)
jmp 0x62e94
movq -0x78(%rbp), %rax
addq $0xc0, %rax
movq %rax, -0x1a8(%rbp)
movq -0x1a8(%rbp), %rax
movq %rax, -0x1a0(%rbp)
movq -0x1a0(%rbp), %rax
movq %rax, -0x1b0(%rbp)
movq -0x48(%rbp), %rax
testb $0x1, 0x14(%rax)
je 0x62ef2
testb $0x1, -0x57(%rbp)
je 0x62ed1
movq -0x78(%rbp), %rax
addq $0x60, %rax
movq %rax, -0x1b8(%rbp)
jmp 0x62ee2
movq -0x78(%rbp), %rax
addq $0xf0, %rax
movq %rax, -0x1b8(%rbp)
movq -0x1b8(%rbp), %rax
movq %rax, -0x1c0(%rbp)
jmp 0x62f28
testb $0x1, -0x57(%rbp)
je 0x62f0b
movq -0x78(%rbp), %rax
addq $0xf0, %rax
movq %rax, -0x1c8(%rbp)
jmp 0x62f1a
movq -0x78(%rbp), %rax
addq $0x60, %rax
movq %rax, -0x1c8(%rbp)
movq -0x1c8(%rbp), %rax
movq %rax, -0x1c0(%rbp)
movq -0x1c0(%rbp), %rax
movq %rax, -0x220(%rbp)
movq -0x78(%rbp), %rax
addq $0x150, %rax            # imm = 0x150
movq %rax, -0x218(%rbp)
movb -0x57(%rbp), %al
movb %al, -0x222(%rbp)
movq -0x48(%rbp), %rax
addq $0x18, %rax
movq %rax, -0x210(%rbp)
movq -0x48(%rbp), %rax
addq $0x38, %rax
movq %rax, -0x200(%rbp)
movq -0x48(%rbp), %rax
movl 0x10(%rax), %eax
movq %rax, -0x1f8(%rbp)
leaq -0x4c(%rbp), %rdi
leaq -0x54(%rbp), %rsi
callq 0x4cb80
movq %rax, -0xa4(%rbp)
leaq -0x4c(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x4cb80
movq %rax, -0xac(%rbp)
movq -0x40(%rbp), %rax
movb 0x14(%rax), %al
movb %al, -0x221(%rbp)
movl -0x7c(%rbp), %eax
movw %ax, -0x1da(%rbp)
movq -0x48(%rbp), %rdi
movq -0x48(%rbp), %rsi
addq $0x4, %rsi
callq 0x4d4f0
movb -0x222(%rbp), %r8b
movb -0x221(%rbp), %sil
movq -0x220(%rbp), %rdx
movq -0x218(%rbp), %rcx
movq -0x210(%rbp), %r9
movq %rax, -0xb4(%rbp)
movl 0x10(%rbp), %r13d
movl -0x80(%rbp), %r12d
movq -0x48(%rbp), %rax
movl 0xc(%rax), %r15d
movq -0x48(%rbp), %rax
movw 0x8(%rax), %r14w
movl -0x64(%rbp), %ebx
movq -0x78(%rbp), %rax
movl 0x1a4(%rax), %r11d
movq -0x78(%rbp), %rax
movl 0x18c(%rax), %r10d
movb -0x55(%rbp), %al
movb %al, -0x205(%rbp)
movl $0x1, %edi
movl $0x2, %eax
movl %eax, -0x204(%rbp)
movb -0x205(%rbp), %al
testb $0x1, %al
movl -0x204(%rbp), %eax
cmovnel %eax, %edi
movq -0x200(%rbp), %rax
movb %dil, -0x1c9(%rbp)
movq -0xa4(%rbp), %rdi
movq %rdi, -0x1f0(%rbp)
movq -0xac(%rbp), %rdi
movq %rdi, -0x1e8(%rbp)
movq -0xb4(%rbp), %rdi
movq %rdi, -0x1d8(%rbp)
movq -0x190(%rbp), %rdi
andb $0x1, %r8b
andb $0x1, %sil
movb %sil, -0x1db(%rbp)
movq -0x1b0(%rbp), %rsi
movzbl %r8b, %r8d
movq %rax, (%rsp)
movq -0x1f8(%rbp), %rax
movq %rax, 0x8(%rsp)
movq -0x1f0(%rbp), %rax
movq %rax, 0x10(%rsp)
movq -0x1e8(%rbp), %rax
movq %rax, 0x18(%rsp)
movb -0x1db(%rbp), %al
movzbl %al, %eax
movl %eax, 0x20(%rsp)
movw -0x1da(%rbp), %ax
movzwl %ax, %eax
movl %eax, 0x28(%rsp)
movq -0x1d8(%rbp), %rax
movq %rax, 0x30(%rsp)
movb -0x1c9(%rbp), %al
movl %r13d, 0x38(%rsp)
movl %r12d, 0x40(%rsp)
movl %r15d, 0x48(%rsp)
movzwl %r14w, %r14d
movl %r14d, 0x50(%rsp)
movl %ebx, 0x58(%rsp)
movl %r11d, 0x60(%rsp)
movl %r10d, 0x68(%rsp)
movzbl %al, %eax
movl %eax, 0x70(%rsp)
callq 0x4cbe0
andb $0x1, %al
movb %al, -0x81(%rbp)
movb -0x81(%rbp), %al
andb $0x1, %al
movb %al, -0x29(%rbp)
movb -0x29(%rbp), %al
andb $0x1, %al
addq $0x278, %rsp            # imm = 0x278
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nopl (%rax)