// File: Fohlen[P]cubescript-standalone/./tools.h
// Function: void quicksort<sortitem, sortfun>(sortitem*, sortitem*, sortfun)
static inline void quicksort(T *start, T *end, F fun)
{
    while(end-start > 10)
    {
        T *mid = &start[(end-start)/2], *i = start+1, *j = end-2, pivot;
        if(fun(*start, *mid)) /* start < mid */
        {
            if(fun(end[-1], *start)) { pivot = *start; *start = end[-1]; end[-1] = *mid; } /* end < start < mid */
            else if(fun(end[-1], *mid)) { pivot = end[-1]; end[-1] = *mid; } /* start <= end < mid */
            else { pivot = *mid; } /* start < mid <= end */
        }
        else if(fun(*start, end[-1])) { pivot = *start; *start = *mid; } /*mid <= start < end */
        else if(fun(*mid, end[-1])) { pivot = end[-1]; end[-1] = *start; *start = *mid; } /* mid < end <= start */
        else { pivot = *mid; swap(*start, end[-1]); }  /* end <= mid <= start */
        *mid = end[-2];
        do
        {
            while(fun(*i, pivot)) if(++i >= j) goto partitioned;
            while(fun(pivot, *--j)) if(i >= j) goto partitioned;
            swap(*i, *j);
        }
        while(++i < j);
    partitioned:
        end[-2] = *i;
        *i = pivot;

        if(i-start < end-(i+1))
        {
            quicksort(start, i, fun);
            start = i+1;
        }
        else
        {
            quicksort(i+1, end, fun);
            end = i;
        }
    }

    insertionsort(start, end, fun);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xc0, %rsp
leaq 0x10(%rbp), %rax
movq %rax, -0x90(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
subq %rcx, %rax
movl $0x18, %ecx
cqto
idivq %rcx
cmpq $0xa, %rax
jle 0x15561
movq -0x90(%rbp), %rdi
movq -0x8(%rbp), %rax
movq %rax, -0x98(%rbp)
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
subq %rcx, %rax
movl $0x18, %ecx
cqto
idivq %rcx
movl $0x2, %ecx
cqto
idivq %rcx
movq %rax, %rcx
movq -0x98(%rbp), %rax
imulq $0x18, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rax
addq $0x18, %rax
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
addq $-0x30, %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rsi
movq -0x18(%rbp), %rdx
callq 0x17990
testb $0x1, %al
jne 0x15191
jmp 0x15287
movq -0x90(%rbp), %rdi
movq -0x10(%rbp), %rsi
addq $-0x18, %rsi
movq -0x8(%rbp), %rdx
callq 0x17990
testb $0x1, %al
jne 0x151af
jmp 0x1520a
movq -0x8(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x40(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x38(%rbp)
movq 0x10(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rcx
movq -0x8(%rbp), %rax
movq -0x18(%rcx), %rdx
movq %rdx, (%rax)
movq -0x10(%rcx), %rdx
movq %rdx, 0x8(%rax)
movq -0x8(%rcx), %rcx
movq %rcx, 0x10(%rax)
movq -0x18(%rbp), %rcx
movq -0x10(%rbp), %rax
movq (%rcx), %rdx
movq %rdx, -0x18(%rax)
movq 0x8(%rcx), %rdx
movq %rdx, -0x10(%rax)
movq 0x10(%rcx), %rcx
movq %rcx, -0x8(%rax)
jmp 0x15282
movq -0x90(%rbp), %rdi
movq -0x10(%rbp), %rsi
addq $-0x18, %rsi
movq -0x18(%rbp), %rdx
callq 0x17990
testb $0x1, %al
jne 0x15228
jmp 0x15265
movq -0x10(%rbp), %rax
movq -0x18(%rax), %rcx
movq %rcx, -0x40(%rbp)
movq -0x10(%rax), %rcx
movq %rcx, -0x38(%rbp)
movq -0x8(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x18(%rbp), %rcx
movq -0x10(%rbp), %rax
movq (%rcx), %rdx
movq %rdx, -0x18(%rax)
movq 0x8(%rcx), %rdx
movq %rdx, -0x10(%rax)
movq 0x10(%rcx), %rcx
movq %rcx, -0x8(%rax)
jmp 0x15280
movq -0x18(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x40(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x38(%rbp)
movq 0x10(%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x15282
jmp 0x1538c
movq -0x90(%rbp), %rdi
movq -0x8(%rbp), %rsi
movq -0x10(%rbp), %rdx
addq $-0x18, %rdx
callq 0x17990
testb $0x1, %al
jne 0x152a5
jmp 0x152e3
movq -0x8(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x40(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x38(%rbp)
movq 0x10(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
movq (%rcx), %rdx
movq %rdx, (%rax)
movq 0x8(%rcx), %rdx
movq %rdx, 0x8(%rax)
movq 0x10(%rcx), %rcx
movq %rcx, 0x10(%rax)
jmp 0x1538a
movq -0x90(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x10(%rbp), %rdx
addq $-0x18, %rdx
callq 0x17990
testb $0x1, %al
jne 0x15301
jmp 0x1535c
movq -0x10(%rbp), %rax
movq -0x18(%rax), %rcx
movq %rcx, -0x40(%rbp)
movq -0x10(%rax), %rcx
movq %rcx, -0x38(%rbp)
movq -0x8(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rcx
movq -0x10(%rbp), %rax
movq (%rcx), %rdx
movq %rdx, -0x18(%rax)
movq 0x8(%rcx), %rdx
movq %rdx, -0x10(%rax)
movq 0x10(%rcx), %rcx
movq %rcx, -0x8(%rax)
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
movq (%rcx), %rdx
movq %rdx, (%rax)
movq 0x8(%rcx), %rdx
movq %rdx, 0x8(%rax)
movq 0x10(%rcx), %rcx
movq %rcx, 0x10(%rax)
jmp 0x15388
movq -0x18(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x40(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x38(%rbp)
movq 0x10(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
addq $-0x18, %rsi
callq 0x155c0
jmp 0x1538a
jmp 0x1538c
movq -0x10(%rbp), %rcx
movq -0x18(%rbp), %rax
movq -0x30(%rcx), %rdx
movq %rdx, (%rax)
movq -0x28(%rcx), %rdx
movq %rdx, 0x8(%rax)
movq -0x20(%rcx), %rcx
movq %rcx, 0x10(%rax)
jmp 0x153ad
movq -0x90(%rbp), %rdi
movq -0x20(%rbp), %rsi
leaq -0x40(%rbp), %rdx
callq 0x17990
testb $0x1, %al
jne 0x153c7
jmp 0x153dd
movq -0x20(%rbp), %rax
addq $0x18, %rax
movq %rax, -0x20(%rbp)
cmpq -0x28(%rbp), %rax
jb 0x153db
jmp 0x15434
jmp 0x153ad
jmp 0x153df
movq -0x90(%rbp), %rdi
movq -0x28(%rbp), %rdx
addq $-0x18, %rdx
movq %rdx, -0x28(%rbp)
leaq -0x40(%rbp), %rsi
callq 0x17990
testb $0x1, %al
jne 0x15401
jmp 0x1540f
movq -0x20(%rbp), %rax
cmpq -0x28(%rbp), %rax
jb 0x1540d
jmp 0x15434
jmp 0x153df
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x155c0
movq -0x20(%rbp), %rax
addq $0x18, %rax
movq %rax, -0x20(%rbp)
cmpq -0x28(%rbp), %rax
jb 0x153ab
jmp 0x15434
movq -0x20(%rbp), %rcx
movq -0x10(%rbp), %rax
movq (%rcx), %rdx
movq %rdx, -0x30(%rax)
movq 0x8(%rcx), %rdx
movq %rdx, -0x28(%rax)
movq 0x10(%rcx), %rcx
movq %rcx, -0x20(%rax)
movq -0x20(%rbp), %rax
movq -0x40(%rbp), %rcx
movq %rcx, (%rax)
movq -0x38(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rcx
movq %rcx, 0x10(%rax)
movq -0x20(%rbp), %rax
movq -0x8(%rbp), %rcx
subq %rcx, %rax
movl $0x18, %ecx
cqto
idivq %rcx
movq %rax, -0xa0(%rbp)
movq -0x10(%rbp), %rax
movq -0x20(%rbp), %rcx
addq $0x18, %rcx
subq %rcx, %rax
movl $0x18, %ecx
cqto
idivq %rcx
movq %rax, %rcx
movq -0xa0(%rbp), %rax
cmpq %rcx, %rax
jge 0x15508
movq -0x90(%rbp), %rax
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq (%rax), %rcx
movq %rcx, -0x58(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x50(%rbp)
movq 0x10(%rax), %rax
movq %rax, -0x48(%rbp)
leaq -0x58(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0x10(%rsp)
callq 0x150e0
movq -0x20(%rbp), %rax
addq $0x18, %rax
movq %rax, -0x8(%rbp)
jmp 0x1555c
movq -0x90(%rbp), %rax
movq -0x20(%rbp), %rdi
addq $0x18, %rdi
movq -0x10(%rbp), %rsi
movq (%rax), %rcx
movq %rcx, -0x70(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x68(%rbp)
movq 0x10(%rax), %rax
movq %rax, -0x60(%rbp)
leaq -0x70(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0x10(%rsp)
callq 0x150e0
movq -0x20(%rbp), %rax
movq %rax, -0x10(%rbp)
jmp 0x150fe
movq -0x90(%rbp), %rax
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq (%rax), %rcx
movq %rcx, -0x88(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x80(%rbp)
movq 0x10(%rax), %rax
movq %rax, -0x78(%rbp)
leaq -0x88(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0x10(%rsp)
callq 0x15630
addq $0xc0, %rsp
popq %rbp
retq
nopl (%rax,%rax)