HeavyThing - ed25519.inc

Jeff Marrison

Table of functions

	; ------------------------------------------------------------------------
	; HeavyThing x86_64 assembly language library and showcase programs
	; Copyright © 2015-2018 2 Ton Digital 
	; Homepage: https://2ton.com.au/
	; Author: Jeff Marrison <jeff@2ton.com.au>
	;       
	; This file is part of the HeavyThing library.
	;       
	; HeavyThing is free software: you can redistribute it and/or modify
	; it under the terms of the GNU General Public License, or
	; (at your option) any later version.
	;       
	; HeavyThing is distributed in the hope that it will be useful, 
	; but WITHOUT ANY WARRANTY; without even the implied warranty of
	; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
	; GNU General Public License for more details.
	;       
	; You should have received a copy of the GNU General Public License along
	; with the HeavyThing library. If not, see <http://www.gnu.org/licenses/>.
	; ------------------------------------------------------------------------
	; ed25519.inc: Implementation of the SSE2 public domain variant at
	; https://github.com/floodyberry/ed25519-donna
	;
	; To generate a private key, use one of the CSPRNG methods to generate
	; 32 bytes.
	;
	; To generate a public key, use ed25519$publickey
	;
	; To sign a message, use ed25519$sign
	;
	; To verify a signature, use ed25519$verify
	;

if used ed25519$publickey | defined include_everything
	; two arguments: rdi == ptr to 32 byte private key, rsi == ptr to 32 byte public key (output)
falign
ed25519$publickey:
	prolog	ed25519$publickey
	push	r12 r13
	sub	rsp, sha512_state_size + 80
	mov	rax, rsp
	and	rax, 0xf
	sub	rsp, rax
	mov	[rsp+sha512_state_size+64], rax
	mov	r12, rdi
	mov	r13, rsi
	mov	rdi, rsp
	call	sha512$init
	mov	rdi, rsp
	mov	rsi, r12
	mov	edx, 32
	call	sha512$update
	mov	rdi, rsp
	lea	rsi, [rsp+sha512_state_size]
	xor	edx, edx
	call	sha512$final
	and	byte [rsp+sha512_state_size], 0xf8
	movzx	eax, byte [rsp+sha512_state_size+31]
	mov	rdi, rsp
	lea	rsi, [rsp+sha512_state_size]
	and	eax, 0x7f
	or	eax, 0x40
	mov	byte [rsp+sha512_state_size+31], al
	call	ed25519$expand256_modm32
	; rsp == a, nothing else in use
	lea	rdi, [rsp+64]
	mov	rsi, rsp
	call	ed25519$scalarmult
	mov	rdi, r13
	lea	rsi, [rsp+64]
	call	ed25519$pack
	mov	rcx, [rsp+sha512_state_size+64]
	add	rsp, rcx
	add	rsp, sha512_state_size + 80
	pop	r13 r12
	epilog

end if

if used ed25519$sign | defined include_everything
	; five arguments: rdi == ptr to message, rsi == length of same, rdx == ptr to 32 byte secret key, rcx == ptr to 32 byte public key, r8 == ptr to signature (output of 64 bytes)
falign
ed25519$sign:
	prolog	ed25519$sign
	push	rbx r12 r13 r14
	sub	rsp, sha512_state_size + 0x200
	mov	rbx, r8
	mov	r12, rcx
	mov	r13, rdi
	mov	r14, rsi
	mov	rdi, rsp
	push	rdx
	call	sha512$init
	pop	rsi
	mov	rdi, rsp
	mov	edx, 32
	call	sha512$update
	mov	rdi, rsp
	lea	rsi, [rsp+sha512_state_size]
	xor	edx, edx
	call	sha512$final

	and	byte [rsp+sha512_state_size], 0xf8
	movzx	eax, byte [rsp+sha512_state_size+31]
	mov	rdi, rsp
	lea	rsi, [rsp+sha512_state_size+32]
	and	eax, 0x7f
	mov	edx, 32
	or	eax, 0x40
	mov	byte [rsp+sha512_state_size+31], al
	call	sha512$update
	mov	rdi, rsp
	mov	rsi, r13
	mov	rdx, r14
	call	sha512$update
	mov	rdi, rsp
	lea	rsi, [rsp+sha512_state_size+0x40]
	xor	edx, edx
	call	sha512$final
	lea	rdi, [rsp+sha512_state_size+0x80]
	lea	rsi, [rsp+sha512_state_size+0x40]
	call	ed25519$expand256_modm64

	; done w/ 0x40 now, can reuse it
	lea	rdi, [rsp+sha512_state_size+0xb0]
	lea	rsi, [rsp+sha512_state_size+0x80]
	call	ed25519$scalarmult
	mov	rdi, rbx
	lea	rsi, [rsp+sha512_state_size+0xb0]
	call	ed25519$pack

	; hram
	mov	rdi, rsp
	mov	rsi, rbx		; first half of output
	mov	edx, 32
	call	sha512$update
	mov	rdi, rsp
	mov	rsi, r12		; public key
	mov	edx, 32
	call	sha512$update
	mov	rdi, rsp
	mov	rsi, r13		; message
	mov	rdx, r14
	call	sha512$update
	mov	rdi, rsp
	lea	rsi, [rsp+sha512_state_size+0x40]
	xor	edx, edx
	call	sha512$final
	lea	rdi, [rsp+sha512_state_size+0x1a0]
	lea	rsi, [rsp+sha512_state_size+0x40]
	call	ed25519$expand256_modm64

	lea	rdi, [rsp+sha512_state_size+0x1d0]
	lea	rsi, [rsp+sha512_state_size]
	call	ed25519$expand256_modm32

	lea	rdi, [rsp+sha512_state_size+0x1a0]
	lea	rsi, [rsp+sha512_state_size+0x1a0]
	lea	rdx, [rsp+sha512_state_size+0x1d0]
	call	ed25519$mul256_modm
	
	lea	rdi, [rsp+sha512_state_size+0x1a0]
	lea	rsi, [rsp+sha512_state_size+0x1a0]
	lea	rdx, [rsp+sha512_state_size+0x80]
	call	ed25519$add256_modm

	lea	rdi, [rbx+32]
	lea	rsi, [rsp+sha512_state_size+0x1a0]
	call	ed25519$contract256_modm

	lea	rdi, [rsp+sha512_state_size]
	xor	esi, esi
	mov	edx, 0x200
	call	memset32

	add	rsp, sha512_state_size + 0x200
	pop	r14 r13 r12 rbx
	epilog

end if

if used ed25519$verify | defined include_everything
	; four arguments: rdi == ptr to message, rsi == length of same, rdx == ptr to 32 byte public key, rcx == ptr to signature
	; returns bool in eax (0 == verify fail)
falign
ed25519$verify:
	prolog	ed25519$verify
	push	rbp rbx r12 r13 r14 r15
	sub	rsp, 0xe00
	mov	r8, rsp
	and	r8, 0xf
	sub	rsp, r8
	xor	eax, eax
	test	byte [rcx+63], 224
	jnz	.bailout
	mov	[rsp+0xdd8], rdi		; ptr to message
	mov	[rsp+0xde0], rsi		; message length
	mov	[rsp+0xde8], rdx		; public key
	mov	[rsp+0xdf0], rcx		; signature we are verifying
	mov	[rsp+0xdf8], r8			; stack modifier
	; unpack first up
	mov	rsi, rdx
	lea	rbp, [rsp+0x240]
	lea	rbx, [rsp+0x210]

	; this is unpack_negative_vartime
	mov	r11d, [rsi]
	mov	r10d, [rsi+0x4]
	mov	r9d, [rsi+0x8]
	mov	ecx, [rsi+0x18]
	mov	edi, [rsi+0x10]
	mov	edx, [rsi+0x1c]
	mov	r8d, [rsi+0xc]
	mov	r13d, [rsi+0x14]
	mov	eax, r11d
	movzx	r12d, byte [rsi+0x1f]
	mov	rsi, rbp
	and	eax, 0x3ffffff
	movaps	xmm0, [.one]
	mov	[rbx+0x30], eax
	mov	rax, r10
	mov	dword [rbx+0x58], 0x0
	shl	rax, 0x20
	mov	dword [rbx+0x5c], 0x0
	or	rax, r11
	shr	rax, 0x1a
	and	eax, 0x1ffffff
	mov	[rbx+0x34], eax
	mov	rax, r9
	shl	rax, 0x20
	or	rax, r10
	shr	rax, 0x13
	and	eax, 0x3ffffff
	mov	[rbx+0x38], eax
	mov	rax, r8
	shr	r8d, 0x6
	shl	rax, 0x20
	mov	[rbx+0x40], r8d
	or	rax, r9
	shr	rax, 0xd
	and	eax, 0x1ffffff
	mov	[rbx+0x3c], eax
	mov	eax, edi
	and	eax, 0x1ffffff
	mov	[rbx+0x44], eax
	mov	rax, r13
	shl	rax, 0x20
	or	rax, rdi
	lea	rdi, [rsp+0x70]
	shr	rax, 0x19
	and	eax, 0x3ffffff
	mov	[rbx+0x48], eax
	mov	rax, rcx
	shl	rax, 0x20
	or	rax, r13
	shr	rax, 0x13
	and	eax, 0x1ffffff
	mov	[rbx+0x4c], eax
	mov	rax, rdx
	shl	rax, 0x20
	or	rax, rcx
	movaps	[rbx+0x60], xmm0
	shr	rax, 0xc
	and	eax, 0x3ffffff

	movaps	xmm0, [.one+0x10]
	mov	[rbx+0x50], eax
	mov	eax, edx
	movaps	[rbx+0x70], xmm0
	shr	eax, 0x6
	and	eax, 0x1ffffff
	movaps	xmm0, [.one+0x20]

	mov	[rbx+0x54], eax
	movaps	[rbx+0x80], xmm0
	mov	edx, 1
	call	curve25519$square_times
	lea	rsi, [rsp+0x70]
	lea	rdi, [rsp+0xa0]
	mov	edx, .ge25519_ecd
	call	curve25519$mul
	movaps	xmm10, [rbx+0x60]
	lea	rsi, [rsp+0xa0]
	lea	rdi, [rsp+0x40]
	movaps	xmm1, [ed25519$packed2p0]
	movaps	xmm9, [rbx+0x70]
	paddd	xmm1, [rsp+0x70]
	psubd	xmm1, xmm10
	movaps	xmm0, xmm1
	paddd	xmm10, [rsp+0xa0]
	movaps	xmm2, [ed25519$packed2p1]
	paddd	xmm2, [rsp+0x80]
	psubd	xmm2, xmm9
	punpcklqdq xmm0, xmm2
	punpckhqdq xmm1, xmm2
	movaps	xmm8, [rbx+0x80]
	paddd	xmm9, [rsp+0xb0]
	pxor	xmm2, xmm2
	movaps	xmm5, [ed25519$packed2p2]
	movaps	xmm4, [ed25519$sse2_bot32bitmask]
	paddd	xmm5, [rsp+0x90]
	psubd	xmm5, xmm8
	punpcklqdq xmm2, xmm5
	paddd	xmm8, [rsp+0xc0]
	movaps	xmm3, [ed25519$sse2_bot32bitmask]
	pand	xmm4, xmm0
	psrlq	xmm0, 0x20
	pand	xmm3, xmm1
	psrlq	xmm1, 0x20
	movaps	xmm6, [ed25519$sse2_bot32bitmask]
	movaps	xmm5, xmm2
	movaps	xmm11, xmm4
	pand	xmm6, xmm2
	movaps	xmm2, [ed25519$packedmask26]
	psrlq	xmm5, 0x20
	movaps	xmm7, xmm3
	psrlq	xmm11, 0x1a
	paddq	xmm0, xmm11
	pand	xmm3, xmm2
	movaps	xmm11, xmm0
	psrlq	xmm7, 0x1a
	paddq	xmm1, xmm7
	movaps	xmm7, xmm1
	psrlq	xmm11, 0x19
	pand	xmm4, xmm2
	psrlq	xmm7, 0x19
	paddq	xmm3, xmm11
	paddq	xmm6, xmm7
	movaps	xmm11, xmm7
	movaps	xmm7, xmm6
	pand	xmm0, [ed25519$packedmask25]
	pslldq	xmm11, 0x8
	movaps	[rsp+0xa0], xmm10
	psrlq	xmm7, 0x1a
	paddq	xmm5, xmm7
	movaps	xmm7, xmm5
	pand	xmm6, xmm2
	psrlq	xmm7, 0x19
	pmuludq	xmm7, [ed25519$packednineteen]
	punpckhqdq xmm7, xmm11
	pand	xmm1, [ed25519$packedmask25]
	movaps	[rsp+0xb0], xmm9
	paddq	xmm4, xmm7
	movaps	xmm7, xmm3
	movaps	xmm11, xmm4
	pand	xmm3, xmm2
	pand	xmm4, xmm2
	psrlq	xmm7, 0x1a
	pand	xmm5, [ed25519$packedmask25]
	paddq	xmm1, xmm7
	psrlq	xmm11, 0x1a
	paddq	xmm0, xmm11
	movaps	xmm11, xmm3
	movaps	xmm7, xmm4
	punpckhdq xmm3, xmm1
	punpckldq xmm11, xmm1
	punpckldq xmm7, xmm0
	punpckhdq xmm4, xmm0
	punpckhdq xmm6, xmm5
	punpcklqdq xmm7, xmm11
	punpcklqdq xmm4, xmm3
	movaps	[rsp], xmm2
	movaps	[rsp+0x70], xmm7
	movaps	[rsp+0x80], xmm4
	movaps	[rsp+0x90], xmm6
	movaps	[rsp+0xc0], xmm8
	; subreduce and add done
	mov	edx, 1
	call	curve25519$square_times
	lea	rdx, [rsp+0xa0]
	lea	rsi, [rsp+0x40]
	lea	rdi, [rsp+0xd0]
	call	curve25519$mul
	lea	rsi, [rsp+0xd0]
	mov	rdi, rbx
	mov	edx, 1
	call	curve25519$square_times
	lea	rdx, [rsp+0xa0]
	mov	rsi, rbx
	mov	rdi, rbx
	call	curve25519$mul
	lea	rdx, [rsp+0x70]
	mov	rsi, rbx
	mov	rdi, rbx
	call	curve25519$mul

	; begin curve25519_pow_two252m3(r->x, r->x)
	lea	rdi, [rsp+0x130]
	mov	rsi, rbx
	mov	edx, 1
	call	curve25519$square_times
	lea	rsi, [rsp+0x130]
	lea	rdi, [rsp+0x160]
	mov	edx, 2
	call	curve25519$square_times
	lea	rsi, [rsp+0x160]
	lea	rdi, [rsp+0x100]
	mov	rdx, rbx
	call	curve25519$mul
	lea	rdx, [rsp+0x130]
	lea	rsi, [rsp+0x100]
	mov	rdi, rdx
	call	curve25519$mul
	lea	rsi, [rsp+0x130]
	lea	rdi, [rsp+0x160]
	mov	edx, 1
	call	curve25519$square_times
	lea	rdx, [rsp+0x100]
	lea	rsi, [rsp+0x160]
	mov	rdi, rdx
	call	curve25519$mul

	; b ([rsp+0x100]) = 2^250 - 2^0
	; begin pow_two5mtwo0_two250mtwo

	; 2^10 - 2^5
	lea	rdi, [rsp+0x300]
	lea	rsi, [rsp+0x100]
	mov	edx, 5
	call	curve25519$square_times

	; 2^10 - 2^0
	lea	rdi, [rsp+0x100]
	lea	rsi, [rsp+0x300]
	lea	rdx, [rsp+0x100]
	call	curve25519$mul

	; 2^20 - 2^10
	lea	rdi, [rsp+0x300]
	lea	rsi, [rsp+0x100]
	mov	edx, 10
	call	curve25519$square_times

	; 2^20 - 2^0
	lea	rdi, [rsp+0x330]
	lea	rsi, [rsp+0x300]
	lea	rdx, [rsp+0x100]
	call	curve25519$mul

	; 2^40 - 2^20
	lea	rdi, [rsp+0x300]
	lea	rsi, [rsp+0x330]
	mov	edx, 20
	call	curve25519$square_times

	; 2^40 - 2^0
	lea	rdi, [rsp+0x300]
	lea	rsi, [rsp+0x300]
	lea	rdx, [rsp+0x330]
	call	curve25519$mul

	; 2^50 - 2^10
	lea	rdi, [rsp+0x300]
	lea	rsi, [rsp+0x300]
	mov	edx, 10
	call	curve25519$square_times

	; 2^50 - 2^0
	lea	rdi, [rsp+0x100]
	lea	rsi, [rsp+0x300]
	lea	rdx, [rsp+0x100]
	call	curve25519$mul

	; 2^100 - 2^50
	lea	rdi, [rsp+0x300]
	lea	rsi, [rsp+0x100]
	mov	edx, 50
	call	curve25519$square_times

	; 2^100 - 2^0
	lea	rdi, [rsp+0x330]
	lea	rsi, [rsp+0x300]
	lea	rdx, [rsp+0x100]
	call	curve25519$mul

	; 2^200 - 2^100
	lea	rdi, [rsp+0x300]
	lea	rsi, [rsp+0x330]
	mov	edx, 100
	call	curve25519$square_times

	; 2^200 - 2^0
	lea	rdi, [rsp+0x300]
	lea	rsi, [rsp+0x300]
	lea	rdx, [rsp+0x330]
	call	curve25519$mul

	; 2^250 - 2^50
	lea	rdi, [rsp+0x300]
	lea	rsi, [rsp+0x300]
	mov	edx, 50
	call	curve25519$square_times

	; 2^250 - 2^0
	lea	rdi, [rsp+0x100]
	lea	rsi, [rsp+0x300]
	lea	rdx, [rsp+0x100]
	call	curve25519$mul
	; end of pow_two5mtwo0_two250mtwo0
	
	lea	rsi, [rsp+0x100]
	mov	rdi, rsi
	mov	edx, 2
	call	curve25519$square_times
	lea	rsi, [rsp+0x100]
	mov	rdx, rbx
	mov	rdi, rbx
	call	curve25519$mul
	; end of pow_two252m3


	; /* 2. computation of r->x = t * num * den^3 */
	lea	rdx, [rsp+0xd0]
	mov	rsi, rbx
	mov	rdi, rbx
	call	curve25519$mul
	lea	rdx, [rsp+0x70]
	mov	rsi, rbx
	mov	rdi, rbx
	call	curve25519$mul
	lea	rdi, [rsp+0x40]
	mov	rsi, rbx
	mov	edx, 1
	call	curve25519$square_times
	lea	rsi, [rsp+0x40]
	lea	rdx, [rsp+0xa0]
	mov	rdi, rsi
	call	curve25519$mul
	movaps	xmm1, [ed25519$packed2p0]
	lea	rsi, [rsp+0x160]
	pxor	xmm2, xmm2
	lea	rdi, [rsp+0x130]
	paddd	xmm1, [rsp+0x40]
	movaps	xmm3, [ed25519$packed2p1]
	psubd	xmm1, [rsp+0x70]
	movaps	xmm0, xmm1
	paddd	xmm3, [rsp+0x50]
	movaps	xmm5, [ed25519$packed2p2]
	psubd	xmm3, [rsp+0x80]
	punpcklqdq xmm0, xmm3
	punpckhqdq xmm1, xmm3
	movaps	xmm4, [ed25519$sse2_bot32bitmask]
	paddd	xmm5, [rsp+0x60]
	psubd	xmm5, [rsp+0x90]
	punpcklqdq xmm2, xmm5
	movaps	xmm3, [ed25519$sse2_bot32bitmask]
	pand	xmm4, xmm0
	psrlq	xmm0, 0x20
	pand	xmm3, xmm1
	psrlq	xmm1, 0x20
	movaps	xmm6, [ed25519$sse2_bot32bitmask]
	movaps	xmm5, xmm2
	movaps	xmm8, xmm4
	pand	xmm6, xmm2
	movaps	xmm2, [rsp]
	psrlq	xmm5, 0x20
	movaps	xmm7, xmm3
	psrlq	xmm8, 0x1a
	paddq	xmm0, xmm8
	pand	xmm3, xmm2
	movaps	xmm8, xmm0
	psrlq	xmm7, 0x1a
	paddq	xmm1, xmm7
	movaps	xmm7, xmm1
	psrlq	xmm8, 0x19
	pand	xmm4, xmm2
	psrlq	xmm7, 0x19
	paddq	xmm3, xmm8
	paddq	xmm6, xmm7
	movaps	xmm8, xmm7
	movaps	xmm7, xmm6
	pand	xmm0, [ed25519$packedmask25]
	pslldq	xmm8, 0x8
	movaps	[rsp+0x10], xmm2
	psrlq	xmm7, 0x1a
	paddq	xmm5, xmm7
	movaps	xmm7, xmm5
	pand	xmm6, xmm2
	psrlq	xmm7, 0x19
	pmuludq	xmm7, [ed25519$packednineteen]
	punpckhqdq xmm7, xmm8
	pand	xmm1, [ed25519$packedmask25]
	paddq	xmm4, xmm7
	movaps	xmm7, xmm3
	movaps	xmm8, xmm4
	pand	xmm3, xmm2
	pand	xmm4, xmm2
	psrlq	xmm7, 0x1a
	pand	xmm5, [ed25519$packedmask25]
	paddq	xmm1, xmm7
	psrlq	xmm8, 0x1a
	paddq	xmm0, xmm8
	movaps	xmm8, xmm3
	movaps	xmm7, xmm4
	punpckhdq xmm3, xmm1
	punpckldq xmm8, xmm1
	punpckldq xmm7, xmm0
	punpckhdq xmm4, xmm0
	punpckhdq xmm6, xmm5
	punpcklqdq xmm7, xmm8
	punpcklqdq xmm4, xmm3
	movaps	[rsp+0x180], xmm6
	movaps	[rsp+0x160], xmm7
	movaps	[rsp+0x170], xmm4
	call	curve25519$contract
	pxor	xmm4, xmm4
	pxor	xmm3, xmm3
	movaps	xmm10, [.zero]
	pxor	xmm1, xmm1
	pxor	xmm10, [rsp+0x130]
	movaps	xmm6, [.zero+0x10]
	pxor	xmm6, [rsp+0x140]
	movaps	xmm2, xmm10
	punpckhbw xmm10, xmm4
	punpcklbw xmm2, xmm4
	movaps	xmm12, xmm2
	punpcklwd xmm2, xmm3
	punpckhwd xmm12, xmm3
	movaps	xmm5, xmm2
	movaps	xmm2, xmm10
	punpckhwd xmm10, xmm3
	punpcklwd xmm2, xmm3
	movaps	xmm11, xmm2
	movaps	xmm2, xmm6
	punpckhbw xmm6, xmm4
	punpcklbw xmm2, xmm4
	movaps	xmm8, xmm2
	punpcklwd xmm2, xmm3
	punpckhwd xmm8, xmm3
	movaps	xmm9, xmm2
	movaps	xmm2, xmm6
	punpckhwd xmm6, xmm3
	punpcklwd xmm2, xmm3
	movaps	xmm7, xmm2
	movaps	xmm2, xmm12
	punpckhdq xmm12, xmm1
	punpckldq xmm2, xmm1
	movaps	xmm13, xmm2
	movaps	xmm2, xmm5
	punpckldq xmm5, xmm1
	punpckhdq xmm2, xmm1
	movaps	xmm0, xmm2
	movaps	xmm2, xmm11
	punpckhdq xmm11, xmm1
	por	xmm0, xmm13
	punpckldq xmm2, xmm1
	por	xmm0, xmm12
	por	xmm0, xmm2
	movaps	xmm2, xmm10
	punpckhdq xmm10, xmm1
	punpckldq xmm2, xmm1
	por	xmm0, xmm11
	por	xmm0, xmm2
	movaps	xmm2, xmm9
	punpckhdq xmm9, xmm1
	punpckldq xmm2, xmm1
	por	xmm0, xmm10
	por	xmm0, xmm2
	movaps	xmm2, xmm8
	punpckhdq xmm8, xmm1
	punpckldq xmm2, xmm1
	por	xmm0, xmm9
	por	xmm0, xmm2
	movaps	xmm2, xmm7
	punpckhdq xmm7, xmm1
	punpckldq xmm2, xmm1
	por	xmm0, xmm8
	por	xmm0, xmm2
	movaps	xmm2, xmm6
	punpckhdq xmm6, xmm1
	punpckldq xmm2, xmm1
	por	xmm0, xmm7
	por	xmm0, xmm2
	movaps	xmm2, [rsp+0x10]
	por	xmm0, xmm6
	por	xmm0, xmm5
	movaps	xmm6, xmm0
	psrldq	xmm6, 0x8
	por	xmm0, xmm6
	movq	[rsp], xmm0
	mov	rax, [rsp]
	sub	rax, 0x1
	test	ah, 0x1
	jnz	.unpack_verify_fail
	movaps	xmm5, [rsp+0x40]
	lea	rsi, [rsp+0x40]
	lea	rdi, [rsp+0x130]
	paddd	xmm5, [rsp+0x70]
	movaps	xmm6, [rsp+0x50]
	movaps	xmm0, xmm5
	paddd	xmm6, [rsp+0x80]
	punpcklqdq xmm0, xmm6
	punpckhqdq xmm5, xmm6
	movaps	xmm7, [ed25519$sse2_bot32bitmask]
	movaps	[rsp], xmm4
	pxor	xmm4, xmm4
	pand	xmm7, xmm0
	psrlq	xmm0, 0x20
	movaps	[rsp+0x30], xmm1
	movaps	xmm11, xmm7
	pand	xmm7, xmm2
	movaps	xmm6, [ed25519$sse2_bot32bitmask]
	psrlq	xmm11, 0x1a
	paddq	xmm0, xmm11
	movaps	xmm11, xmm0
	pand	xmm0, [ed25519$packedmask25]
	movaps	xmm8, [rsp+0x60]
	pand	xmm6, xmm5
	psrlq	xmm5, 0x20
	psrlq	xmm11, 0x19
	paddd	xmm8, [rsp+0x90]
	punpcklqdq xmm4, xmm8
	movaps	xmm9, [ed25519$sse2_bot32bitmask]
	movaps	xmm10, xmm6
	pand	xmm9, xmm4
	movaps	xmm8, xmm4
	pand	xmm6, xmm2
	psrlq	xmm10, 0x1a
	paddq	xmm5, xmm10
	movaps	xmm10, xmm5
	psrlq	xmm8, 0x20
	pand	xmm5, [ed25519$packedmask25]
	movaps	[rsp+0x20], xmm3
	psrlq	xmm10, 0x19
	paddq	xmm6, xmm11
	paddq	xmm9, xmm10
	movaps	xmm11, xmm10
	movaps	xmm10, xmm9
	pand	xmm9, xmm2
	pslldq	xmm11, 0x8
	psrlq	xmm10, 0x1a
	paddq	xmm8, xmm10
	movaps	xmm10, xmm8
	pand	xmm8, [ed25519$packedmask25]
	psrlq	xmm10, 0x19
	pmuludq	xmm10, [ed25519$packednineteen]
	punpckhqdq xmm10, xmm11
	paddq	xmm7, xmm10
	movaps	xmm10, xmm6
	movaps	xmm11, xmm7
	pand	xmm6, xmm2
	pand	xmm7, xmm2
	psrlq	xmm10, 0x1a
	paddq	xmm5, xmm10
	psrlq	xmm11, 0x1a
	paddq	xmm0, xmm11
	punpckhdq xmm9, xmm8
	movaps	xmm11, xmm6
	punpckhdq xmm6, xmm5
	movaps	xmm10, xmm7
	punpckldq xmm11, xmm5
	punpckldq xmm10, xmm0
	punpckhdq xmm7, xmm0
	movaps	[rsp+0x60], xmm9
	punpcklqdq xmm10, xmm11
	punpcklqdq xmm7, xmm6
	movaps	[rsp+0x40], xmm10
	movaps	[rsp+0x50], xmm7
	call	curve25519$contract
	movaps	xmm8, [rsp+0x130]
	pxor	xmm8, [.zero]
	movaps	xmm4, [rsp]
	movaps	xmm3, [rsp+0x20]
	movaps	xmm5, xmm8
	movaps	xmm0, [rsp+0x140]
	punpckhbw xmm8, xmm4
	punpcklbw xmm5, xmm4
	pxor	xmm0, [.zero+0x10]
	movaps	xmm1, [rsp+0x30]
	movaps	xmm6, xmm8
	movaps	xmm10, xmm5
	punpcklwd xmm5, xmm3
	punpckhwd xmm10, xmm3
	punpcklwd xmm6, xmm3
	movaps	xmm7, xmm5
	movaps	xmm5, xmm0
	movaps	xmm2, xmm10
	punpckhbw xmm0, xmm4
	movaps	xmm9, xmm6
	punpckldq xmm2, xmm1
	punpcklbw xmm5, xmm4
	movaps	xmm6, xmm0
	punpckhwd xmm0, xmm3
	movaps	xmm11, xmm2
	movaps	xmm2, xmm7
	movaps	xmm4, xmm5
	punpckhwd xmm8, xmm3
	punpckhdq xmm2, xmm1
	punpcklwd xmm4, xmm3
	punpckhwd xmm5, xmm3
	punpcklwd xmm6, xmm3
	movaps	xmm3, xmm0
	movaps	xmm0, xmm2
	punpckhdq xmm10, xmm1
	movaps	xmm2, xmm9
	por	xmm0, xmm11
	punpckldq xmm2, xmm1
	punpckhdq xmm9, xmm1
	por	xmm0, xmm10
	punpckldq xmm7, xmm1
	por	xmm0, xmm2
	movaps	xmm2, xmm8
	punpckhdq xmm8, xmm1
	punpckldq xmm2, xmm1
	por	xmm0, xmm9
	por	xmm0, xmm2
	movaps	xmm2, xmm3
	punpckldq xmm3, xmm1
	por	xmm0, xmm8
	punpckhdq xmm2, xmm1
	por	xmm0, xmm7
	por	xmm0, xmm2
	movaps	xmm2, [rsp+0x10]
	por	xmm0, xmm3
	movaps	xmm3, xmm6
	punpckldq xmm6, xmm1
	punpckhdq xmm3, xmm1
	por	xmm0, xmm3
	por	xmm0, xmm6
	movaps	xmm6, xmm5
	punpckldq xmm5, xmm1
	punpckhdq xmm6, xmm1
	por	xmm0, xmm6
	por	xmm0, xmm5
	movaps	xmm5, xmm4
	punpckldq xmm4, xmm1
	punpckhdq xmm5, xmm1
	por	xmm0, xmm5
	por	xmm0, xmm4
	movaps	xmm4, xmm0
	psrldq	xmm4, 0x8
	por	xmm0, xmm4
	movq	[rsp], xmm0
	mov	rax, [rsp]
	sub	rax, 0x1
	shr	rax, 0x8
	and	eax, 0x1
	jz	.unpack_alldone

	mov	edx, .ge25519_sqrtneg1
	mov	rsi, rbx
	mov	rdi, rbx
	movaps	[rsp], xmm2
	call	curve25519$mul
	movaps	xmm2, [rsp]
.unpack_verify_fail:			; jumped to from above if first verify kakked
	lea	rdi, [rsp+0x130]
	mov	rsi, rbx
	shr	r12b, 0x7
	movaps	[rsp], xmm2
	call	curve25519$contract
	movzx	eax, byte [rsp+0x130]
	movaps	xmm2, [rsp]
	and	eax, 0x1
	cmp	r12b,al
	je	.unpack_copyneg
	lea	rdi, [rbx+0x90]
	mov	rdx, rbp
	mov	rsi, rbx
	call	curve25519$mul
	mov	eax, 0x1
	jmp	.unpack_alldone
align 16
.ge25519_ecd:
	dd	0x035978a3,0x00d37284,0x03156ebd,0x006a0a0e,0x0001c029,0x0179e898,0x03a03cbb,0x01ce7198,0x02e2b6ff,0x01480db3
	dq	0x0
align 16
.ge25519_sqrtneg1:
	dd	0x020ea0b0,0x0186c9d2,0x008f189d,0x0035697f,0x00bd0c60,0x01fbd7a7,0x02804c9e,0x01e16569,0x0004fc1d,0x00ae0c92
	dq	0x0
calign
.unpack_copyneg:
	movaps	xmm1, [rbx]
	pxor	xmm5, xmm5
	movaps	xmm4, [ed25519$packed2p0]
	movaps	xmm3, [rbx+0x10]
	psubd	xmm4, xmm1
	movaps	xmm0, [rbx+0x20]
	movaps	[rsp+0x40], xmm1
	movaps	xmm1, xmm4
	movaps	[rsp+0x50], xmm3
	movaps	[rsp+0x60], xmm0
	movaps	xmm4, [ed25519$packed2p1]
	movaps	xmm6, [ed25519$packed2p2]
	psubd	xmm4, xmm3
	movaps	xmm3, xmm4
	psubd	xmm6, xmm0
	movaps	xmm0, xmm1
	punpcklqdq xmm5, xmm6
	punpckhqdq xmm1, xmm3
	punpcklqdq xmm0, xmm4
	movaps	xmm3, [ed25519$sse2_bot32bitmask]
	movaps	xmm4, [ed25519$sse2_bot32bitmask]
	pand	xmm3, xmm1
	psrlq	xmm1, 0x20
	pand	xmm4, xmm0
	movaps	xmm6, [ed25519$sse2_bot32bitmask]
	psrlq	xmm0, 0x20
	movaps	xmm7, xmm3
	movaps	xmm8, xmm4
	pand	xmm6, xmm5
	psrlq	xmm5, 0x20
	pand	xmm3, xmm2
	psrlq	xmm7, 0x1a
	paddq	xmm1, xmm7
	psrlq	xmm8, 0x1a
	movaps	xmm7, xmm1
	paddq	xmm0, xmm8
	movaps	xmm8, xmm0
	pand	xmm4, xmm2
	psrlq	xmm7, 0x19
	paddq	xmm6, xmm7
	pand	xmm1, [ed25519$packedmask25]
	psrlq	xmm8, 0x19
	paddq	xmm3, xmm8
	movaps	xmm8, xmm7
	movaps	xmm7, xmm6
	pand	xmm0, [ed25519$packedmask25]
	pslldq	xmm8, 0x8
	psrlq	xmm7, 0x1a
	paddq	xmm5, xmm7
	movaps	xmm7, xmm5
	pand	xmm6, xmm2
	psrlq	xmm7, 0x19
	pmuludq	xmm7, [ed25519$packednineteen]
	punpckhqdq xmm7, xmm8
	pand	xmm5, [ed25519$packedmask25]
	paddq	xmm4, xmm7
	movaps	xmm8, xmm4
	pand	xmm4, xmm2
	movaps	xmm7, xmm3
	pand	xmm2, xmm3
	psrlq	xmm8, 0x1a
	paddq	xmm0, xmm8
	psrlq	xmm7, 0x1a
	paddq	xmm1, xmm7
	punpckhdq xmm6, xmm5
	movaps	xmm3, xmm4
	punpckhdq xmm4, xmm0
	movaps	xmm7, xmm2
	punpckldq xmm3, xmm0
	punpckldq xmm7, xmm1
	punpckhdq xmm2, xmm1
	movaps	[rbx+0x20], xmm6
	punpcklqdq xmm3, xmm7
	punpcklqdq xmm4, xmm2
	movaps	[rbx], xmm3
	movaps	[rbx+0x10], xmm4

	lea	rdi, [rbx+0x90]
	mov	rdx, rbp
	mov	rsi, rbx
	call	curve25519$mul
	mov	eax, 0x1
	; fallthrough to unpack_alldone
calign
.unpack_alldone:
	mov	rbp, [rsp+0xdd8]
	mov	r12, [rsp+0xde0]
	mov	rbx, [rsp+0xde8]
	test	eax, eax
	jz	.bailout

	lea	rdi, [rsp+0x710]
	call	sha512$init
	mov	r15, [rsp+0xdf0]
	lea	rdi, [rsp+0x710]
	mov	edx, 32
	mov	rsi, r15
	call	sha512$update
	lea	rdi, [rsp+0x710]
	mov	edx, 32
	mov	rsi, rbx
	call	sha512$update
	lea	rdi, [rsp+0x710]
	mov	rdx, r12
	mov	rsi, rbp
	call	sha512$update
	lea	rdi, [rsp+0x710]
	lea	rsi, [rsp+0x1d0]
	xor	edx, edx
	call	sha512$final

	lea	rdi, [rsp+0x140]
	lea	rsi, [rsp+0x1d0]
	call	ed25519$expand256_modm64


	lea	rdi, [rsp+0x170]
	lea	rsi, [r15+32]
	call	ed25519$expand256_modm32

	; double_scalarmult_vartime...
	lea	rax, [rsp+0x510]
	lea	rdi, [rsp+0x140]
	lea	r8, [rax+0xe0]
.contract_modm_expandouter1:
	mov	rdx, [rdi]
	lea	rsi, [rax+0x38]
calign
.contract_modm_expandinner1:
	add	rax, 0x1
	mov	ecx, edx
	shr	rdx, 1
	and	ecx, 0x1
	cmp	rax, rsi
	mov	byte [rax-0x1], cl
	jne	.contract_modm_expandinner1
	add	rdi, 0x8
	cmp	rax, r8
	jne	.contract_modm_expandouter1
	mov	rdx, [rsp+0x160]
	lea	rsi, [rsp+0x610]
calign
.contract_modm_expandlast1:
	add	rax, 0x1
	mov	ecx, edx
	shr	rdx, 1
	and	ecx, 0x1
	cmp	rax, rsi
	mov	byte [rax-0x1], cl
	jne	.contract_modm_expandlast1
	lea	r8, [rsp+0x510]
	mov	r11d, 0x100
	jmp	.contract_modm_slidingstart1
calign
.contract_modm_slidingouter1:
	lea	r10, [r8+0x1]
.contract_modm_slidingnext1:
	sub	r11d, 0x1
	mov	r8, r10
	jz	.contract_modm_expand2
.contract_modm_slidingstart1:
	movzx	edi, byte [r8]
	test	edi, edi
	jz	.contract_modm_slidingouter1
	cmp	r11d, 0x1
	jle	.contract_modm_slidingouter1
	lea	rax, [rsp+0x510]
	lea	r10, [r8+0x1]
	mov	ebx, r8d
	xor	r9d, r9d
	mov	ecx, 0x1
	lea	r12, [r8+0x2]
	mov	[rsp], rax
	mov	ebp, [rsp]
	mov	rsi, r10
	sub	ebx, [rsp]
	sub	ebp, r8d
	add	ebp, 0xff
	jmp	.contract_modm_slidingmess_start1
calign
.contract_modm_slidingmess_outer1:
	add	eax, edi
	mov	byte [r8], al
	mov	byte [rsi], 0x0
.contract_modm_slidingmess_outera1:
	add	ecx, 0x1
	cmp	ecx, r11d
	je	.contract_modm_slidingnext1
	add	r9, 0x1
	add	rsi, 0x1
	cmp	ecx, 0x7
	je	.contract_modm_slidingnext1
	movzx	edi, byte [r8]
.contract_modm_slidingmess_start1:
	movzx	r14d, byte [rsi]
	movsx	r13d, dil
	mov	rdx, rsi
	movsx	eax, r14b
	shl	eax, cl
	lea	r15d, [r13+rax]
	cmp	r15d, 0xf
	jle	.contract_modm_slidingmess_outer1
	sub	r13d, eax
	cmp	r13d, 0xfffffff1
	jl	.contract_modm_slidingmess_c1
	sub	edi, eax
	lea	eax, [rcx+rbx]
	mov	byte [r8], dil
	cmp	eax, 0xff
	jg	.contract_modm_slidingmess_outera1
	cmp	byte [rsi], 0x0
	je	.contract_modm_slidingmess_b1
	lea	rdi, [r9+r10+0x1]
	mov	eax, ebp
	sub	eax, ecx
	add	rdi, rax
	lea	rax, [r12+r9]
calign
.contract_modm_slidingmess_a1:
	cmp	rax, rdi
	mov	byte [rdx], 0x0
	je	.contract_modm_slidingmess_outera1
	mov	rdx, rax
	add	rax, 0x1
	cmp	byte [rax-0x1], 0x0
	jne	.contract_modm_slidingmess_a1
.contract_modm_slidingmess_b1:
	mov	byte [rdx], 0x1
	jmp	.contract_modm_slidingmess_outera1
calign
.contract_modm_slidingmess_c1:
	test	r14b, r14b
	jz	.contract_modm_slidingmess_outera1
	sub	r11d, 0x1
	mov	r8, r10
	jne	.contract_modm_slidingstart1
.contract_modm_expand2:
	lea	rax, [rsp+0x610]
	lea	rdi, [rsp+0x170]
	lea	r8, [rax+0xe0]
.contract_modm_expandouter2:
	mov	rdx, [rdi]
	lea	rsi, [rax+0x38]
calign
.contract_modm_expandinner2:
	add	rax, 0x1
	mov	ecx, edx
	shr	rdx, 1
	and	ecx, 0x1
	cmp	rax, rsi
	mov	byte [rax-0x1], cl
	jne	.contract_modm_expandinner2
	add	rdi, 0x8
	cmp	rax, r8
	jne	.contract_modm_expandouter2
	mov	rdx, [rsp+0x190]
	lea	rsi, [rsp+0x710]
calign
.contract_modm_expandlast2:
	add	rax, 0x1
	mov	ecx, edx
	shr	rdx, 1
	and	ecx, 0x1
	cmp	rax, rsi
	mov	byte [rax-0x1], cl
	jne	.contract_modm_expandlast2
	lea	r8, [rsp+0x610]
	mov	r11d, 0x100
	jmp	.contract_modm_slidingstart2
calign
.contract_modm_slidingouter2:
	lea	r10, [r8+0x1]
.contract_modm_slidingnext2:
	sub	r11d, 0x1
	mov	r8, r10
	jz	.contract_modm_expand_done
.contract_modm_slidingstart2:
	movzx	edi, byte [r8]
	test	edi, edi
	jz	.contract_modm_slidingouter2
	cmp	r11d, 0x1
	jle	.contract_modm_slidingouter2
	lea	rax, [rsp+0x610]
	lea	r10, [r8+0x1]
	mov	ebx, r8d
	xor	r9d, r9d
	mov	ecx, 0x1
	lea	r12, [r8+0x2]
	mov	[rsp], rax
	mov	ebp, [rsp]
	mov	rsi, r10
	sub	ebx, [rsp]
	sub	ebp, r8d
	add	ebp, 0xff
	jmp	.contract_modm_slidingmess_start2
calign
.contract_modm_slidingmess_outer2:
	add	eax, edi
	mov	byte [r8], al
	mov	byte [rsi], 0x0
.contract_modm_slidingmess_outera2:
	add	ecx, 0x1
	cmp	ecx, r11d
	je	.contract_modm_slidingnext2
	add	r9, 0x1
	add	rsi, 0x1
	cmp	ecx, 0x7
	je	.contract_modm_slidingnext2
	movzx	edi, byte [r8]
.contract_modm_slidingmess_start2:
	movzx	r14d, byte [rsi]
	movsx	r13d, dil
	mov	rdx, rsi
	movsx	eax, r14b
	shl	eax, cl
	lea	r15d, [r13+rax]
	cmp	r15d, 0x3f
	jle	.contract_modm_slidingmess_outer2
	sub	r13d, eax
	cmp	r13d, 0xffffffc1
	jl	.contract_modm_slidingmess_c2
	sub	edi, eax
	lea	eax, [rbx+rcx]
	mov	byte [r8], dil
	cmp	eax, 0xff
	jg	.contract_modm_slidingmess_outera2
	cmp	byte [rsi], 0x0
	je	.contract_modm_slidingmess_b2
	lea	rdi, [r9+r10+0x1]
	mov	eax, ebp
	sub	eax, ecx
	add	rdi, rax
	lea	rax, [r12+r9]
calign
.contract_modm_slidingmess_a2:
	cmp	rax, rdi
	mov	byte [rdx], 0x0
	je	.contract_modm_slidingmess_outera2
	mov	rdx, rax
	add	rax, 0x1
	cmp	byte [rax-0x1], 0x0
	jne	.contract_modm_slidingmess_a2
.contract_modm_slidingmess_b2:
	mov	byte [rdx], 0x1
	jmp	.contract_modm_slidingmess_outera2
calign
.contract_modm_slidingmess_c2:
	test	r14b, r14b
	jz	.contract_modm_slidingmess_outera2
	sub	r11d, 0x1
	mov	r8, r10
	jnz	.contract_modm_slidingstart2

.contract_modm_expand_done:
	lea	rsi, [rsp+0x210]
	lea	rdi, [rsp+0x710]
	lea	r12, [rsp+0x390]
	call	ed25519$double_p1p1
	lea	rsi, [rsp+0x710]
	lea	rdi, [rsp+0x2d0]
	call	ed25519$p1p1_to_full
	lea	rsi, [rsp+0x210]
	lea	rdi, [rsp+0x710]
	call	.full_to_pniels
	lea	rdx, [rsp+0x710]
	lea	rbp, [rdx+0x540]
	jmp	.scalarmult_vartime_b
calign
.scalarmult_vartime_a:
	mov	rdx, rbx
.scalarmult_vartime_b:
	lea	rsi, [rsp+0x2d0]
	xor	ecx, ecx
	mov	rdi, r12
	lea	rbx, [rdx+0xc0]
	call	.pnielsadd_p1p1
	lea	rdi, [rsp+0x450]
	mov	rsi, r12
	call	ed25519$p1p1_to_full
	lea	rsi, [rsp+0x450]
	mov	rdi, rbx
	call	.full_to_pniels
	cmp	rbx, rbp
	jne	.scalarmult_vartime_a
	mov	rdi, r12
	xor	esi, esi
	mov	edx, 192
	call	memset32
	xor	eax, eax
	mov	rdi, r12
	lea	rsi, [rsp+0x70f]
	mov	dword [rsp+0x3c0], 0x1
	mov	dword [rsp+0x3f0], 0x1
	lea	rcx, [rsp+0x60f]
	jmp	.scalarmult_vartime_d
calign
.scalarmult_vartime_c:
	sub	rax, 0x1
	cmp	rax, 0xffffffffffffff00
	je	.scalarmult_vartime_done
.scalarmult_vartime_d:
	movzx	edx, byte [rsi+rax]
	lea	ebx, [rax+0xff]
	or	dl, byte [rcx+rax]
	jz	.scalarmult_vartime_c
	cmp	ebx, 0xffffffff
	jne	.scalarmult_vartime_g
	jmp	.scalarmult_vartime_done
calign
.scalarmult_vartime_e:
	cmp	byte [rsp+rbp+0x610], 0x0
	jne	.scalarmult_vartime_h
.scalarmult_vartime_f:
	lea	rsi, [rsp+0x450]
	mov	rdi, r12
	sub	ebx, 0x1
	call	ed25519$p1p1_to_partial
	cmp	ebx, 0xffffffff
	je	.scalarmult_vartime_done
.scalarmult_vartime_g:
	lea	rdi, [rsp+0x450]
	mov	rsi, r12
	movsxd rbp, ebx
	call	ed25519$double_p1p1
	cmp	byte [rsp+rbp+0x510], 0x0
	je	.scalarmult_vartime_e
	lea	rsi, [rsp+0x450]
	mov	rdi, r12
	call	ed25519$p1p1_to_full
	movsx	eax, byte [rsp+rbp+0x510]
	lea	rdi, [rsp+0x450]
	mov	rsi, r12
	cdq
	mov	ecx, eax
	xor	eax, edx
	shr	cl, 0x7
	sub	eax, edx
	movzx	ecx, cl
	sar	eax, 1
	cdqe
	lea	rdx, [rax+rax*2]
	lea	rax, [rsp+0x710]
	shl	rdx, 0x6
	add	rdx, rax
	call	.pnielsadd_p1p1
	cmp	byte [rsp+rbp+0x610], 0x0
	je	.scalarmult_vartime_f
.scalarmult_vartime_h:
	lea	rsi, [rsp+0x450]
	mov	rdi, r12
	call	ed25519$p1p1_to_full
	movaps	xmm8, [rsp+0x3c0]
	lea	rdi, [rsp+0x1a0]
	movsx	eax, byte [rsp+rbp+0x610]
	movaps	xmm1, [rsp+0x390]
	movaps	xmm0, [ed25519$packed2p0]
	cdq
	mov	ebp, eax
	paddd	xmm0, xmm8
	psubd	xmm0, xmm1
	pshufd	xmm15, xmm0, 0xa0
	pshufd	xmm10, xmm0, 0xf5
	movaps	xmm6, [rsp+0x3a0]
	paddd	xmm1, xmm8
	xor	eax, edx
	shr	bpl, 0x7
	pand	xmm15, [ed25519$sse2_bot32bitmask]
	sub	eax, edx
	mov	r13d, ebp
	movaps	xmm7, [rsp+0x3d0]
	sar	eax, 1
	pand	xmm10, [ed25519$sse2_bot32bitmask]
	cdqe
	movaps	xmm5, [ed25519$packed2p1]
	xor	r13d, 0x1
	lea	rdx, [rax+rax*8]
	movzx	eax, r13b
	movaps	xmm0, xmm15
	pand	xmm15, [ed25519$packedmask26]
	paddd	xmm5, xmm7
	psubd	xmm5, xmm6
	paddd	xmm7, xmm6
	lea	rcx, [rax+rax]
	movaps	xmm9, xmm10
	pand	xmm10, [ed25519$packedmask25]
	psrld	xmm0, 0x1a
	movaps	xmm3, [rsp+0x3e0]
	add	rax, rcx
	psrld	xmm9, 0x19
	movaps	xmm11, xmm9
	psrldq	xmm9, 0x8
	paddd	xmm5, xmm9
	movaps	xmm9, xmm5
	movaps	xmm2, [rsp+0x3b0]
	pslldq	xmm11, 0x8
	paddd	xmm15, xmm11
	movzx	ecx, bpl
	paddd	xmm0, xmm10
	movaps	xmm10, xmm15
	punpckldq xmm15, xmm0
	punpcklqdq xmm9, xmm7
	lea	rsi, [rcx+rcx]
	punpckhdq xmm10, xmm0
	shl	rdx, 0x4
	movaps	xmm0, xmm7
	add	rcx, rsi
	movaps	xmm7, xmm9
	add	rdx, .ge25519_niels_sliding_multiples
	punpcklqdq xmm15, xmm10
	shl	rax, 0x4
	movaps	xmm4, [ed25519$packed2p2]
	psrlq	xmm7, 0x20
	shl	rcx, 0x4
	add	rax, rdx
	add	rcx, rdx
	lea	rsi, [r12+0x90]
	movdqa	[rsp+0x30], xmm7
	paddd	xmm4, xmm3
	psubd	xmm4, xmm2
	movaps	xmm6, xmm15
	paddd	xmm2, xmm3
	add	rdx, 0x60
	movaps	xmm7, xmm5
	punpcklqdq xmm6, xmm1
	punpckhqdq xmm15, xmm1
	movaps	xmm1, xmm4
	punpckhqdq xmm7, xmm0
	punpcklqdq xmm1, xmm2
	movaps	xmm2, [rcx]
	movaps	xmm12, xmm6
	movaps	xmm0, xmm7
	movaps	xmm5, [rax+0x10]
	movaps	xmm4, xmm1
	psrlq	xmm12, 0x20
	psrlq	xmm0, 0x20
	movdqa	[rsp+0x70], xmm1
	movaps	xmm3, xmm2
	psrlq	xmm4, 0x20
	movdqa	[rsp+0x60], xmm0
	movaps	xmm8, xmm6
	movdqa	[rsp+0xb0], xmm4
	movaps	xmm14, xmm15
	movdqa	[rsp+0x40], xmm7
	psrlq	xmm14, 0x20
	movaps	xmm1, [rax]
	movaps	xmm0, [rcx+0x10]
	punpckhqdq xmm2, xmm1
	movaps	xmm13, xmm0
	punpcklqdq xmm3, xmm1
	punpckhqdq xmm0, xmm5
	punpcklqdq xmm13, xmm5
	movaps	xmm1, xmm2
	movaps	xmm4, xmm3
	psrlq	xmm3, 0x20
	psrlq	xmm1, 0x20
	movaps	xmm11, xmm1
	movaps	xmm5, xmm0
	movaps	xmm1, xmm13
	psrlq	xmm13, 0x20
	pmuludq xmm8, xmm4
	movdqa	[rsp+0x10], xmm13
	psrlq	xmm5, 0x20
	movdqa	[rsp+0x20], xmm5
	movaps	xmm5, xmm12
	movdqa	[rsp+0x80], xmm8
	pmuludq xmm5, xmm4
	movaps	xmm8, xmm15
	pmuludq xmm8, xmm4
	movaps	xmm13, [rcx+0x20]
	punpcklqdq xmm13, [rax+0x20]
	movaps	xmm10, xmm13
	psrlq	xmm10, 0x20
	movdqa	[rsp+0x50], xmm10
	movaps	xmm10, xmm6
	pmuludq xmm10, xmm3
	paddq	xmm5, xmm10
	movdqa	[rsp+0x90], xmm5
	movaps	xmm5, xmm12
	pslld	xmm5, 0x1
	movaps	xmm10, xmm5
	pmuludq xmm10, xmm3
	movaps	xmm7, xmm10
	movaps	xmm10, xmm6
	paddq	xmm7, xmm8
	movaps	xmm8, xmm7
	pmuludq xmm10, xmm2
	paddq	xmm8, xmm10
	movaps	xmm10, xmm14
	movdqa	[rsp+0xa0], xmm8
	movaps	xmm8, xmm15
	pmuludq xmm10, xmm4
	pmuludq xmm8, xmm3
	paddq	xmm8, xmm10
	movaps	xmm10, xmm12
	pmuludq xmm10, xmm2
	movaps	xmm7, xmm10
	movaps	xmm10, xmm11
	paddq	xmm7, xmm8
	pmuludq xmm10, xmm6
	paddq	xmm7, xmm10
	movaps	xmm10, xmm14
	movdqa	[rsp+0xf0], xmm7
	pslld	xmm10, 0x1
	movaps	xmm7, xmm10
	movaps	xmm10, xmm9
	movaps	xmm8, xmm7
	pmuludq xmm10, xmm4
	pmuludq xmm8, xmm3
	paddq	xmm8, xmm10
	movaps	xmm10, xmm15
	pmuludq xmm10, xmm2
	paddq	xmm10, xmm8
	movaps	xmm8, xmm11
	pmuludq xmm8, xmm5
	paddq	xmm8, xmm10
	movaps	xmm10, xmm6
	pmuludq xmm10, xmm1
	paddq	xmm8, xmm10
	movaps	xmm10, xmm9
	movdqa	[rsp+0xc0], xmm8
	pmuludq xmm10, xmm3
	movaps	xmm8, [rsp+0x30]
	pmuludq xmm8, xmm4
	paddq	xmm10, xmm8
	movaps	xmm8, xmm14
	movdqa	[rsp], xmm11
	pmuludq xmm8, xmm2
	paddq	xmm8, xmm10
	movaps	xmm10, xmm11
	pmuludq xmm10, xmm15
	paddq	xmm10, xmm8
	movaps	xmm8, xmm12
	pmuludq xmm8, xmm1
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp+0x10]
	movaps	xmm11, xmm8
	pmuludq xmm10, xmm6
	paddq	xmm11, xmm10
	movaps	xmm10, [rsp+0x30]
	movdqa	[rsp+0xd0], xmm11
	pslld	xmm10, 0x1
	movaps	xmm11, xmm10
	movaps	xmm8, xmm11
	movaps	xmm10, [rsp+0x40]
	pmuludq xmm8, xmm3
	pmuludq xmm10, xmm4
	paddq	xmm8, xmm10
	movaps	xmm10, xmm9
	pmuludq xmm10, xmm2
	paddq	xmm10, xmm8
	movaps	xmm8, [rsp]
	pmuludq xmm8, xmm7
	paddq	xmm8, xmm10
	movaps	xmm10, xmm15
	pmuludq xmm7, [rsp+0x10]
	pmuludq xmm10, xmm1
	paddq	xmm10, xmm8
	movaps	xmm8, [rsp+0x10]
	pmuludq xmm8, xmm5
	paddq	xmm8, xmm10
	movaps	xmm10, xmm6
	pmuludq xmm5, [rsp+0x20]
	pmuludq xmm10, xmm0
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp+0x40]
	movdqa	[rsp+0xe0], xmm8
	pmuludq xmm10, xmm3
	movaps	xmm8, [rsp+0x60]
	pmuludq xmm8, xmm4
	paddq	xmm10, xmm8
	movaps	xmm8, [rsp+0x30]
	pmuludq xmm8, xmm2
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp]
	pmuludq xmm10, xmm9
	paddq	xmm10, xmm8
	movaps	xmm8, xmm14
	pmuludq xmm8, xmm1
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp+0x10]
	pmuludq xmm10, xmm15
	paddq	xmm10, xmm8
	movaps	xmm8, xmm12
	pmuludq xmm8, xmm0
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp+0x20]
	pmuludq xmm10, xmm6
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp+0x60]
	movdqa	[rsp+0x100], xmm8
	pslld	xmm10, 0x1
	pmuludq xmm10, xmm3
	movaps	xmm8, [rsp+0x70]
	pmuludq xmm8, xmm4
	paddq	xmm10, xmm8
	movaps	xmm8, [rsp+0x40]
	pmuludq xmm4, [rsp+0xb0]
	pmuludq xmm8, xmm2
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp]
	pmuludq xmm11, xmm10
	paddq	xmm11, xmm8
	movaps	xmm8, xmm9
	pmuludq xmm8, xmm1
	paddq	xmm8, xmm11
	movaps	xmm11, xmm6
	paddq	xmm7, xmm8
	movaps	xmm8, xmm15
	pmuludq xmm6, [rsp+0x50]
	pmuludq xmm11, xmm13
	pmuludq xmm8, xmm0
	paddq	xmm8, xmm7
	paddq	xmm5, xmm8
	paddq	xmm5, xmm11
	movaps	xmm11, [rsp+0x60]
	movdqa	[rsp+0x110], xmm5
	movaps	xmm5, [rsp+0x70]
	movaps	xmm7, [rsp+0x40]
	pmuludq xmm5, xmm3
	paddq	xmm5, xmm4
	movaps	xmm4, xmm11
	movaps	xmm8, [rsp+0x30]
	pmuludq xmm4, xmm2
	paddq	xmm4, xmm5
	movaps	xmm5, xmm7
	pmuludq xmm5, [rsp]
	paddq	xmm5, xmm4
	movaps	xmm4, xmm8
	pmuludq xmm4, xmm1
	paddq	xmm4, xmm5
	movaps	xmm5, [rsp+0x10]
	pmuludq xmm5, xmm9
	paddq	xmm5, xmm4
	movaps	xmm4, xmm14
	pmuludq xmm14, [ed25519$packednineteen]
	pmuludq xmm9, [ed25519$packednineteen]
	pmuludq xmm4, xmm0
	paddq	xmm4, xmm5
	movaps	xmm5, [rsp+0x20]
	pmuludq xmm5, xmm15
	paddq	xmm5, xmm4
	movaps	xmm4, xmm12
	pmuludq xmm15, [ed25519$packednineteen]
	pmuludq xmm12, [ed25519$packednineteen]
	pslld	xmm12, 0x1
	pmuludq xmm4, xmm13
	paddq	xmm4, xmm5
	paddq	xmm4, xmm6
	movaps	xmm6, xmm14
	pmuludq xmm14, xmm13
	movdqa	[rsp+0x120], xmm4
	pslld	xmm6, 0x1
	movaps	xmm5, xmm7
	movdqa	[rsp+0x60], xmm6
	pmuludq xmm12, [rsp+0x50]
	movaps	xmm6, xmm8
	pmuludq xmm5, [ed25519$packednineteen]
	pmuludq xmm6, [ed25519$packednineteen]
	movaps	xmm10, xmm6
	movaps	xmm7, xmm6
	movaps	xmm6, xmm11
	movaps	xmm11, xmm15
	pmuludq xmm15, [rsp+0x50]
	paddq	xmm14, xmm15
	pslld	xmm7, 0x1
	movdqa	[rsp+0x30], xmm7
	pmuludq xmm6, [ed25519$packednineteen]
	pmuludq xmm11, xmm13
	paddq	xmm11, xmm12
	movaps	xmm8, xmm6
	pslld	xmm6, 0x1
	movdqa	[rsp+0x40], xmm6
	movaps	xmm12, [rsp+0x60]
	pmuludq xmm12, [rsp+0x20]
	paddq	xmm12, xmm11
	movaps	xmm11, xmm9
	movaps	xmm4, [rsp+0x70]
	pmuludq xmm11, xmm0
	paddq	xmm11, xmm12
	movaps	xmm12, [rsp+0x30]
	pmuludq xmm4, [ed25519$packednineteen]
	pmuludq xmm12, [rsp+0x10]
	paddq	xmm12, xmm11
	movaps	xmm11, xmm5
	movaps	xmm7, [rsp+0xb0]
	pmuludq xmm11, xmm1
	paddq	xmm11, xmm12
	movaps	xmm12, [rsp+0x40]
	pmuludq xmm7, [ed25519$packednineteen]
	movaps	xmm6, xmm7
	pmuludq xmm12, [rsp]
	paddq	xmm12, xmm11
	movaps	xmm11, xmm4
	movaps	xmm15, [rsp+0x10]
	pslld	xmm6, 0x1
	pmuludq xmm3, xmm6
	pmuludq xmm11, xmm2
	paddq	xmm11, xmm12
	paddq	xmm3, xmm11
	movaps	xmm12, [rsp+0x20]
	paddq	xmm3, [rsp+0x80]
	pmuludq xmm2, xmm7
	movaps	xmm11, xmm10
	pmuludq xmm10, xmm13
	movdqa	[rsp+0x80], xmm3
	movaps	xmm3, xmm12
	pmuludq xmm11, xmm0
	pmuludq xmm3, xmm9
	paddq	xmm3, xmm14
	paddq	xmm11, xmm3
	movaps	xmm3, xmm15
	movaps	xmm14, [rsp]
	pmuludq xmm3, xmm5
	paddq	xmm3, xmm11
	movaps	xmm11, xmm8
	pmuludq xmm11, xmm1
	paddq	xmm11, xmm3
	movaps	xmm3, xmm14
	pmuludq xmm14, xmm6
	pmuludq xmm3, xmm4
	paddq	xmm3, xmm11
	movaps	xmm11, [rsp+0x50]
	paddq	xmm2, xmm3
	paddq	xmm2, [rsp+0x90]
	movaps	xmm3, [rsp+0x60]
	movdqa	[rsp+0x90], xmm2
	pmuludq xmm3, xmm11
	movaps	xmm2, xmm9
	pmuludq xmm9, xmm11
	paddq	xmm10, xmm9
	pmuludq xmm2, xmm13
	paddq	xmm2, xmm3
	movaps	xmm3, [rsp+0x30]
	pmuludq xmm3, xmm12
	paddq	xmm3, xmm2
	movaps	xmm2, xmm5
	movaps	xmm9, [rsp+0x40]
	pmuludq xmm2, xmm0
	paddq	xmm2, xmm3
	movaps	xmm3, [rsp+0x40]
	pmuludq xmm3, xmm15
	paddq	xmm3, xmm2
	movaps	xmm2, xmm4
	pmuludq xmm2, xmm1
	paddq	xmm2, xmm3
	movaps	xmm3, xmm14
	movaps	xmm14, [rsp+0xa0]
	pmuludq xmm1, xmm7
	paddq	xmm3, xmm2
	paddq	xmm14, xmm3
	movdqa	[rsp+0xa0], xmm14
	movaps	xmm14, xmm12
	pmuludq xmm14, xmm5
	movaps	xmm2, xmm14
	movaps	xmm14, xmm8
	pmuludq xmm8, xmm13
	paddq	xmm2, xmm10
	movaps	xmm10, xmm15
	pmuludq xmm14, xmm0
	movaps	xmm3, xmm14
	movaps	xmm14, xmm15
	pmuludq xmm10, xmm4
	movaps	xmm15, xmm11
	paddq	xmm3, xmm2
	movaps	xmm2, xmm10
	pmuludq xmm14, xmm6
	paddq	xmm2, xmm3
	paddq	xmm1, xmm2
	paddq	xmm1, [rsp+0xf0]
	movaps	xmm10, xmm1
	movaps	xmm1, [rsp+0x30]
	movaps	xmm3, xmm12
	pmuludq xmm1, xmm11
	movaps	xmm11, xmm9
	movaps	xmm2, xmm1
	movaps	xmm1, xmm5
	pmuludq xmm5, xmm15
	pmuludq xmm11, xmm12
	paddq	xmm8, xmm5
	pmuludq xmm1, xmm13
	paddq	xmm1, xmm2
	movaps	xmm2, xmm11
	paddq	xmm2, xmm1
	movaps	xmm1, xmm4
	pmuludq xmm1, xmm0
	paddq	xmm1, xmm2
	movaps	xmm2, xmm14
	pmuludq xmm0, xmm7
	movaps	xmm14, xmm15
	pmuludq xmm7, xmm13
	paddq	xmm2, xmm1
	movaps	xmm1, [rsp+0xc0]
	paddq	xmm1, xmm2
	movaps	xmm12, xmm1
	movaps	xmm1, xmm3
	movaps	xmm2, [rsp+0x80]
	pmuludq xmm1, xmm4
	paddq	xmm1, xmm8
	paddq	xmm0, xmm1
	movaps	xmm1, xmm9
	paddq	xmm0, [rsp+0xd0]
	movaps	xmm15, xmm0
	movaps	xmm0, xmm4
	pmuludq xmm4, xmm14
	pmuludq xmm1, xmm14
	paddq	xmm7, xmm4
	paddq	xmm7, [rsp+0x100]
	pmuludq xmm0, xmm13
	paddq	xmm0, xmm1
	movaps	xmm1, xmm3
	movaps	xmm3, xmm2
	movaps	xmm13, xmm7
	pmuludq xmm1, xmm6
	paddq	xmm1, xmm0
	paddq	xmm1, [rsp+0xe0]
	psrlq	xmm3, 0x1a
	paddq	xmm3, [rsp+0x90]
	movaps	xmm4, xmm3
	movaps	xmm9, xmm1
	movaps	xmm1, [ed25519$packedmask26]
	pmuludq xmm6, xmm14
	movaps	xmm5, xmm4
	paddq	xmm6, [rsp+0x110]
	pand	xmm1, xmm12
	movaps	xmm11, xmm6
	psrlq	xmm5, 0x19
	paddq	xmm5, [rsp+0xa0]
	movaps	xmm7, xmm5
	movaps	xmm0, xmm12
	pand	xmm2, [ed25519$packedmask26]
	movaps	xmm6, xmm7
	psrlq	xmm0, 0x1a
	paddq	xmm0, xmm15
	movaps	xmm3, xmm0
	psrlq	xmm6, 0x1a
	psrlq	xmm0, 0x19
	paddq	xmm6, xmm10
	paddq	xmm0, xmm9
	movaps	xmm12, xmm6
	psrlq	xmm6, 0x19
	movaps	xmm5, xmm0
	paddq	xmm1, xmm6
	psrlq	xmm0, 0x1a
	paddq	xmm0, xmm13
	movaps	xmm8, xmm0
	psrlq	xmm0, 0x19
	paddq	xmm0, xmm11
	movaps	xmm6, xmm0
	pand	xmm7, [ed25519$packedmask26]
	psrlq	xmm6, 0x1a
	paddq	xmm6, [rsp+0x120]
	movaps	xmm9, xmm6
	pand	xmm4, [ed25519$packedmask25]
	psrlq	xmm9, 0x19
	pmuludq xmm9, [ed25519$packednineteen]
	paddq	xmm2, xmm9
	pand	xmm3, [ed25519$packedmask25]
	movaps	xmm10, xmm2
	pand	xmm2, [ed25519$packedmask26]
	movaps	xmm9, xmm1
	psrlq	xmm10, 0x1a
	paddq	xmm4, xmm10
	pand	xmm12, [ed25519$packedmask25]
	psrlq	xmm9, 0x1a
	paddq	xmm3, xmm9
	movaps	xmm9, xmm7
	pand	xmm8, [ed25519$packedmask25]
	movaps	xmm10, xmm2
	pand	xmm5, [ed25519$packedmask26]
	pand	xmm1, [ed25519$packedmask26]
	punpckldq xmm9, xmm12
	punpckldq xmm10, xmm4
	movaps	xmm11, xmm5
	pand	xmm6, [ed25519$packedmask25]
	punpcklqdq xmm10, xmm9
	pand	xmm0, [ed25519$packedmask26]
	movaps	xmm9, xmm1
	punpckhdq xmm5, xmm8
	punpckhdq xmm1, xmm3
	punpckldq xmm11, xmm8
	punpckhdq xmm7, xmm12
	punpckldq xmm9, xmm3
	punpckhdq xmm2, xmm4
	punpcklqdq xmm1, xmm5
	punpcklqdq xmm9, xmm11
	movaps	xmm11, xmm0
	punpcklqdq xmm2, xmm7
	punpckhdq xmm0, xmm6
	movaps	xmm4, xmm1
	punpckldq xmm11, xmm6
	movdqa	[rsp+0x60], xmm2
	paddd	xmm4, xmm9
	movaps	xmm3, xmm0
	movdqa	[rsp+0x490], xmm4
	paddd	xmm3, xmm11
	pxor	xmm8, xmm8
	movdqa	[rsp+0x4a0], xmm3
	movaps	xmm5, xmm2
	movaps	xmm2, xmm8
	paddd	xmm5, xmm10
	movdqa	[rsp+0x480], xmm5
	movdqa	[rsp+0x50], xmm10
	movdqa	[rsp+0x40], xmm1
	movdqa	[rsp+0x30], xmm9
	movdqa	[rsp+0x20], xmm0
	movdqa	[rsp+0x10], xmm11
	movdqa	[rsp], xmm8
	movaps	xmm4, [rsp+0x3f0]
	movaps	xmm3, [rsp+0x400]
	paddd	xmm4, xmm4
	movaps	xmm13, xmm4
	paddd	xmm3, xmm3
	punpckhqdq xmm4, xmm3
	movaps	xmm6, [ed25519$sse2_bot32bitmask]
	punpcklqdq xmm13, xmm3
	movaps	xmm5, [ed25519$sse2_bot32bitmask]
	movaps	xmm7, [rsp+0x410]
	pand	xmm6, xmm13
	psrlq	xmm13, 0x20
	pand	xmm5, xmm4
	paddd	xmm7, xmm7
	movaps	xmm12, [ed25519$sse2_bot32bitmask]
	punpcklqdq xmm2, xmm7
	psrlq	xmm4, 0x20
	movaps	xmm14, xmm6
	pand	xmm6, [ed25519$packedmask26]
	movaps	xmm3, xmm5
	pand	xmm12, xmm2
	psrlq	xmm14, 0x1a
	paddq	xmm13, xmm14
	psrlq	xmm3, 0x1a
	paddq	xmm4, xmm3
	movaps	xmm3, [ed25519$packedmask25]
	movaps	xmm14, xmm4
	movaps	xmm7, xmm2
	movaps	xmm15, xmm13
	psrlq	xmm14, 0x19
	pand	xmm3, xmm13
	paddq	xmm12, xmm14
	movaps	xmm13, xmm12
	pand	xmm5, [ed25519$packedmask26]
	psrlq	xmm7, 0x20
	pslldq	xmm14, 0x8
	psrlq	xmm15, 0x19
	psrlq	xmm13, 0x1a
	paddq	xmm7, xmm13
	movaps	xmm13, xmm7
	pand	xmm4, [ed25519$packedmask25]
	psrlq	xmm13, 0x19
	pmuludq xmm13, [ed25519$packednineteen]
	punpckhqdq xmm13, xmm14
	paddq	xmm5, xmm15
	pand	xmm7, [ed25519$packedmask25]
	paddq	xmm6, xmm13
	movaps	xmm13, xmm5
	movaps	xmm14, xmm6
	pand	xmm5, [ed25519$packedmask26]
	psrlq	xmm13, 0x1a
	paddq	xmm4, xmm13
	pand	xmm6, [ed25519$packedmask26]
	psrlq	xmm14, 0x1a
	paddq	xmm3, xmm14
	pand	xmm12, [ed25519$packedmask26]
	movaps	xmm14, xmm5
	punpckhdq xmm5, xmm4
	movaps	xmm13, xmm6
	punpckldq xmm14, xmm4
	punpckhdq xmm6, xmm3
	punpckldq xmm13, xmm3
	punpckhdq xmm12, xmm7
	punpcklqdq xmm6, xmm5
	punpcklqdq xmm13, xmm14
	movdqa	[rsp+0x500], xmm12
	movdqa	[rsp+0x4f0], xmm6
	movdqa	[rsp+0x4e0], xmm13
	call	curve25519$mul
	movzx	eax, bpl
	lea	rsi, [rsp+0x450]
	add	eax, 0x2
	movaps	xmm3, [rsp+0x4e0]
	cdqe
	lea	rax, [rax+rax*2]
	movdqa	[rsp+0x4b0], xmm3
	shl	rax, 0x4
	add	rax, rsi
	movaps	xmm3, [rsp+0x4f0]
	movdqa	[rsp+0x4c0], xmm3
	movaps	xmm3, [rsp+0x500]
	movdqa	[rsp+0x4d0], xmm3
	movaps	xmm6, [rsp+0x1a0]
	movaps	xmm12, [rax]
	movaps	xmm4, [rax+0x10]
	paddd	xmm12, xmm6
	movaps	xmm3, [rax+0x20]
	movaps	xmm5, [rsp+0x1b0]
	movaps	xmm7, [rsp+0x1c0]
	paddd	xmm4, xmm5
	movdqa	[rax], xmm12
	paddd	xmm3, xmm7
	movdqa	[rax+0x10], xmm4
	movdqa	[rax+0x20], xmm3
	movzx	eax, r13b
	add	eax, 0x2
	cdqe
	lea	rax, [rax+rax*2]
	movaps	xmm2, [rsp+0x60]
	shl	rax, 0x4
	movaps	xmm1, [rsp+0x40]
	add	rax, rsi
	movaps	xmm4, xmm2
	movaps	xmm3, [rax]
	movaps	xmm12, [rax+0x10]
	punpckldq xmm4, xmm3
	movaps	xmm10, [rsp+0x50]
	punpckhdq xmm2, xmm3
	movaps	xmm3, xmm1
	movaps	xmm9, [rsp+0x30]
	punpckhdq xmm1, xmm12
	paddd	xmm4, [ed25519$packed32packed2p0]
	punpckldq xmm3, xmm12
	movaps	xmm12, xmm10
	punpckhdq xmm10, xmm6
	movaps	xmm0, [rsp+0x20]
	punpckldq xmm12, xmm6
	movaps	xmm6, xmm9
	movaps	xmm11, [rsp+0x10]
	punpckldq xmm6, xmm5
	punpckhdq xmm9, xmm5
	movaps	xmm5, [ed25519$packed32packed2p1]
	psubd	xmm4, xmm12
	punpckldq xmm0, [rax+0x20]
	paddd	xmm2, xmm5
	paddd	xmm3, xmm5
	psubd	xmm2, xmm10
	psubd	xmm3, xmm6
	punpckldq xmm11, xmm7
	paddd	xmm1, xmm5
	movaps	xmm7, xmm4
	movaps	xmm6, xmm2
	psubd	xmm1, xmm9
	punpckhqdq xmm4, xmm3
	punpcklqdq xmm7, xmm3
	paddd	xmm0, xmm5
	psubd	xmm0, xmm11
	punpcklqdq xmm6, xmm1
	movaps	xmm8, [rsp]
	punpckhqdq xmm2, xmm1
	movaps	xmm5, xmm7
	movaps	xmm1, [ed25519$packedmask26262626]
	movaps	xmm3, xmm6
	psrld	xmm5, 0x1a
	pand	xmm6, xmm1
	paddd	xmm5, xmm4
	psrld	xmm3, 0x1a
	paddd	xmm3, xmm2
	movaps	xmm4, xmm3
	pand	xmm7, xmm1
	movaps	xmm1, xmm5
	psrld	xmm4, 0x19
	movaps	xmm2, xmm4
	pslldq	xmm4, 0x8
	movaps	xmm9, xmm6
	movaps	xmm6, [ed25519$packedmask25252525]
	psrld	xmm1, 0x19
	psrldq	xmm2, 0x8
	paddd	xmm0, xmm2
	movaps	xmm2, xmm7
	pand	xmm5, xmm6
	paddd	xmm1, xmm9
	paddd	xmm2, xmm4
	movaps	xmm4, xmm2
	pand	xmm3, xmm6
	movaps	xmm6, xmm1
	punpcklqdq xmm4, xmm5
	punpcklqdq xmm6, xmm3
	punpckhqdq xmm2, xmm5
	pshufd	xmm4, xmm4, 0xd8
	punpckhqdq xmm1, xmm3
	pshufd	xmm3, xmm6, 0xd8
	movaps	xmm5, xmm4
	pshufd	xmm2, xmm2, 0xd8
	pshufd	xmm1, xmm1, 0xd8
	punpcklqdq xmm5, xmm3
	pshufd	xmm0, xmm0, 0xd8
	punpckhqdq xmm4, xmm3
	movdqa	[rsp+0x450], xmm5
	movaps	xmm5, xmm2
	punpckhqdq xmm2, xmm1
	punpcklqdq xmm5, xmm1
	movdqa	[rsp+0x460], xmm5
	movaps	xmm5, xmm0
	punpckhqdq xmm0, xmm8
	punpcklqdq xmm5, xmm8
	movdqa	[rsp+0x470], xmm5
	movdqa	[rax], xmm4
	movdqa	[rax+0x10], xmm2
	movdqa	[rax+0x20], xmm0
	jmp	.scalarmult_vartime_f
dalign
.ge25519_niels_sliding_multiples:
	db	0x3e, 0x91, 0x40, 0x03, 0x75, 0x41, 0x0e, 0x00, 0xa2, 0x73, 0xd6, 0x03, 0x05, 0x8a, 0x2e, 0x00
	db	0x7c, 0xe6, 0xf4, 0x03, 0x09, 0x8a, 0x8f, 0x00, 0x34, 0x1a, 0xc2, 0x00, 0xb8, 0xf4, 0x4c, 0x00
	db	0x81, 0x8f, 0x29, 0x01, 0xbe, 0xf4, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x85, 0x3b, 0x8c, 0x01, 0xbd, 0xf1, 0x24, 0x01, 0xf7, 0x25, 0xc3, 0x01, 0x60, 0xdc, 0x37, 0x00
	db	0xb7, 0x4c, 0x3e, 0x03, 0xc2, 0x42, 0x3d, 0x00, 0x32, 0x4c, 0xa4, 0x01, 0xe1, 0xa4, 0x4c, 0x01
	db	0x4b, 0x3d, 0xa3, 0x03, 0x74, 0x3e, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x68, 0xaa, 0x7a, 0x03, 0x61, 0x81, 0x44, 0x00, 0x79, 0xd5, 0x93, 0x00, 0x56, 0x65, 0x1e, 0x01
	db	0xa0, 0x67, 0x9b, 0x00, 0x8c, 0x59, 0x43, 0x01, 0xee, 0xe5, 0xbe, 0x01, 0x43, 0x0b, 0xb5, 0x00
	db	0xc6, 0xf0, 0x89, 0x02, 0xed, 0x45, 0xbc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x65, 0xd2, 0xfc, 0x00, 0x29, 0xfa, 0x47, 0x00, 0xcc, 0xaa, 0x4f, 0x03, 0x0d, 0x2e, 0xef, 0x01
	db	0x4f, 0x4d, 0xef, 0x00, 0xbd, 0xd6, 0x4b, 0x01, 0x10, 0x8d, 0xf9, 0x00, 0x26, 0x50, 0x4c, 0x01
	db	0xbd, 0x55, 0x75, 0x00, 0x56, 0xe4, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x30, 0x97, 0xee, 0x00, 0x13, 0x2a, 0x6c, 0x01, 0xe4, 0x55, 0x71, 0x01, 0x32, 0x44, 0x87, 0x01
	db	0x10, 0x6a, 0x09, 0x00, 0x32, 0x67, 0x01, 0x01, 0x4f, 0x01, 0xa8, 0x01, 0x23, 0x98, 0x1e, 0x01
	db	0x0f, 0xa8, 0xb9, 0x01, 0x38, 0x59, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x89, 0xd8, 0xd0, 0x01, 0xc3, 0xcf, 0xa4, 0x01, 0x95, 0x42, 0x4c, 0x03, 0xae, 0xe1, 0x10, 0x01
	db	0x8c, 0x50, 0x62, 0x01, 0x4c, 0xdb, 0xf2, 0x00, 0xc6, 0xa2, 0x72, 0x00, 0x2e, 0xda, 0x98, 0x00
	db	0x9b, 0x2b, 0xf1, 0x02, 0x9a, 0xa0, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xba, 0xd6, 0x47, 0x00, 0xe9, 0xb0, 0x60, 0x00, 0xf2, 0xef, 0x36, 0x01, 0x39, 0x59, 0x8a, 0x00
	db	0x53, 0x00, 0x54, 0x03, 0x87, 0xa0, 0x64, 0x00, 0x5c, 0x8e, 0x78, 0x02, 0x67, 0x7c, 0xbe, 0x00
	db	0xb5, 0xb1, 0x3e, 0x03, 0xf9, 0x29, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x33, 0xbb, 0xa5, 0x00, 0x02, 0x11, 0xaf, 0x00, 0x42, 0x54, 0xa0, 0x01, 0xf7, 0x3a, 0x1e, 0x00
	db	0x23, 0x41, 0x35, 0x02, 0x44, 0xec, 0xbf, 0x00, 0x2d, 0x86, 0xf5, 0x01, 0xa3, 0x7b, 0xdd, 0x00
	db	0x20, 0x6e, 0x14, 0x03, 0x33, 0x17, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x85, 0x82, 0x2a, 0x01, 0x60, 0xfc, 0xf6, 0x00, 0x97, 0x97, 0x3f, 0x02, 0xee, 0x85, 0x3e, 0x00
	db	0x20, 0x38, 0x9c, 0x00, 0x2d, 0xa7, 0xbd, 0x01, 0x8d, 0x85, 0xb3, 0x01, 0x83, 0x56, 0xd3, 0x00
	db	0xbb, 0xb3, 0x96, 0x02, 0xf9, 0xaa, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xb1, 0x21, 0x32, 0x02, 0xaa, 0x26, 0xcb, 0x01, 0x4d, 0xf7, 0x74, 0x00, 0xd1, 0xdd, 0x99, 0x00
	db	0x85, 0x80, 0xb2, 0x01, 0x3a, 0x2c, 0x19, 0x00, 0xc9, 0x27, 0x3b, 0x01, 0xbd, 0x13, 0xfc, 0x00
	db	0x31, 0xe5, 0xd2, 0x01, 0x75, 0xbb, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xbf, 0xa3, 0x4e, 0x00, 0x25, 0x34, 0x97, 0x00, 0x63, 0x4d, 0x1a, 0x00, 0xee, 0x9c, 0xd5, 0x01
	db	0xd4, 0xc0, 0xd1, 0x01, 0x49, 0x2e, 0x54, 0x00, 0x14, 0x41, 0x29, 0x01, 0x36, 0xce, 0x4f, 0x00
	db	0xc9, 0x83, 0x92, 0x02, 0xa9, 0x6f, 0x18, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xa2, 0xb3, 0xb8, 0x01, 0x00, 0x72, 0xdb, 0x00, 0x30, 0x5e, 0x93, 0x00, 0xf5, 0x29, 0x38, 0x00
	db	0x7d, 0x0d, 0xcc, 0x02, 0xf3, 0xad, 0x77, 0x00, 0x2c, 0xdd, 0x20, 0x02, 0x53, 0xea, 0x14, 0x00
	db	0xf9, 0xa0, 0xc6, 0x01, 0xec, 0x7e, 0xea, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x64, 0x80, 0x9d, 0x03, 0x80, 0x5f, 0x88, 0x01, 0x6d, 0x7e, 0x33, 0x00, 0x02, 0xa9, 0xb7, 0x01
	db	0x06, 0x82, 0x62, 0x02, 0x44, 0xb0, 0x5e, 0x01, 0x73, 0x04, 0xe3, 0x01, 0xd9, 0xf2, 0x91, 0x01
	db	0xc9, 0xad, 0x1f, 0x01, 0x69, 0x01, 0x27, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x2f, 0x63, 0xa8, 0x02, 0xa9, 0xe2, 0x99, 0x01, 0x65, 0xb3, 0xd8, 0x00, 0xe2, 0x8d, 0x7a, 0x01
	db	0x79, 0x42, 0x99, 0x02, 0xb5, 0xf5, 0x86, 0x00, 0xe3, 0xe4, 0x19, 0x01, 0xd6, 0x39, 0xeb, 0x01
	db	0xd7, 0xad, 0x38, 0x03, 0xb4, 0xe7, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x1b, 0xaf, 0x45, 0x00, 0xe4, 0x2f, 0x3a, 0x01, 0xd6, 0xe0, 0x45, 0x02, 0xce, 0x38, 0x45, 0x01
	db	0x0f, 0xfe, 0x8b, 0x03, 0x16, 0xcf, 0xd4, 0x01, 0xc9, 0x14, 0x7e, 0x03, 0x5e, 0xd5, 0x60, 0x01
	db	0x08, 0xb0, 0x21, 0x00, 0xc8, 0x05, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x48, 0x43, 0x86, 0x01, 0x92, 0xc0, 0xd6, 0x01, 0x2b, 0x26, 0x70, 0x00, 0x44, 0xb8, 0x4b, 0x01
	db	0xcd, 0x5a, 0xfb, 0x00, 0x95, 0xeb, 0x8d, 0x00, 0xb5, 0xaa, 0x3a, 0x00, 0x74, 0xf4, 0xef, 0x00
	db	0x5c, 0x9d, 0x02, 0x00, 0x66, 0xad, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xde, 0x2a, 0x80, 0x02, 0x22, 0x21, 0xc0, 0x01, 0xf7, 0xe5, 0xc4, 0x01, 0x81, 0x11, 0x78, 0x00
	db	0xfb, 0x67, 0x97, 0x03, 0x06, 0x34, 0x70, 0x01, 0x8b, 0x38, 0x42, 0x03, 0x27, 0xe2, 0xf5, 0x01
	db	0xd8, 0x46, 0x25, 0x02, 0xab, 0xd6, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xe9, 0x89, 0x60, 0x01, 0x7f, 0x31, 0xcb, 0x00, 0x05, 0x9b, 0x94, 0x00, 0x17, 0x94, 0x09, 0x01
	db	0xd2, 0x7a, 0x0c, 0x00, 0x22, 0x86, 0x1a, 0x01, 0xda, 0xcc, 0x88, 0x00, 0x86, 0x08, 0x29, 0x01
	db	0xdf, 0x53, 0x2b, 0x02, 0x54, 0x19, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x93, 0xbf, 0x7f, 0x02, 0xcc, 0x4e, 0xc0, 0x01, 0x0d, 0x6a, 0xed, 0x01, 0xbb, 0xdb, 0x4c, 0x00
	db	0xaf, 0xf3, 0xbb, 0x02, 0x68, 0x59, 0xad, 0x00, 0x55, 0x19, 0x59, 0x01, 0xa2, 0xf3, 0x94, 0x00
	db	0x02, 0x76, 0xd1, 0x02, 0x20, 0x9e, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x6d, 0x7f, 0x00, 0x02, 0xa8, 0x88, 0x30, 0x00, 0xee, 0x77, 0xdb, 0x03, 0xe6, 0xad, 0xd5, 0x00
	db	0xce, 0x12, 0xfe, 0x02, 0x07, 0xba, 0x07, 0x01, 0x7d, 0x09, 0x07, 0x01, 0x6f, 0x2a, 0x48, 0x00
	db	0x6f, 0x34, 0xec, 0x02, 0x5f, 0x3f, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x78, 0xa3, 0x2e, 0x03, 0x5c, 0x46, 0x28, 0x00, 0x6c, 0x2a, 0x8e, 0x02, 0x6e, 0xfc, 0x8e, 0x01
	db	0x9a, 0xdf, 0x90, 0x00, 0x33, 0xe5, 0xa7, 0x01, 0x48, 0xfc, 0x9b, 0x03, 0x5d, 0x74, 0x0c, 0x01
	db	0x97, 0xa0, 0xda, 0x03, 0x9b, 0xee, 0x25, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x0b, 0xcf, 0x8c, 0x02, 0x91, 0x61, 0xf3, 0x00, 0x81, 0xc0, 0x1a, 0x02, 0xc8, 0x54, 0x21, 0x01
	db	0x6e, 0x0a, 0x4e, 0x03, 0x92, 0x51, 0xb2, 0x01, 0x03, 0x04, 0x18, 0x00, 0xa1, 0xee, 0xd7, 0x01
	db	0x05, 0x8d, 0x21, 0x00, 0x35, 0xd7, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xa0, 0xea, 0xcf, 0x03, 0xc4, 0x00, 0xb3, 0x01, 0x99, 0xa4, 0x8d, 0x00, 0xe1, 0xc4, 0x68, 0x00
	db	0x0a, 0x23, 0x19, 0x02, 0xd0, 0xd4, 0xf2, 0x01, 0x60, 0xfd, 0xde, 0x02, 0xb7, 0x65, 0xe5, 0x00
	db	0xde, 0x12, 0x7f, 0x01, 0xa4, 0x88, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x16, 0xb5, 0xd0, 0x03, 0xe6, 0x8b, 0x9d, 0x00, 0xb3, 0xcb, 0xdd, 0x03, 0xfe, 0xb9, 0x71, 0x00
	db	0xbd, 0xe2, 0xac, 0x03, 0x70, 0x42, 0xd6, 0x01, 0xc9, 0x3e, 0x2d, 0x03, 0x65, 0x40, 0x08, 0x01
	db	0x4d, 0xae, 0x10, 0x02, 0x84, 0x75, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x87, 0xde, 0x20, 0x00, 0x11, 0x92, 0xe1, 0x00, 0x02, 0x81, 0xb6, 0x01, 0x97, 0xac, 0xb5, 0x00
	db	0xc0, 0x73, 0x28, 0x02, 0x25, 0x2d, 0x94, 0x01, 0x94, 0x13, 0x27, 0x01, 0x3f, 0x07, 0x02, 0x01
	db	0x82, 0x24, 0xfe, 0x02, 0xf9, 0x9f, 0xc6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x81, 0x9d, 0x0e, 0x01, 0xe5, 0xbb, 0x9d, 0x01, 0x58, 0xf2, 0x89, 0x00, 0xb8, 0x06, 0x6e, 0x00
	db	0x83, 0x18, 0x95, 0x02, 0x48, 0x12, 0x8f, 0x01, 0x37, 0x32, 0x9b, 0x01, 0x53, 0x75, 0xbc, 0x00
	db	0x85, 0xdb, 0x4d, 0x02, 0x64, 0xc9, 0xb4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x54, 0xc8, 0xc8, 0x01, 0x29, 0xae, 0x60, 0x00, 0x8e, 0x6d, 0x40, 0x01, 0xf9, 0xf2, 0xcf, 0x01
	db	0x51, 0xf4, 0xcf, 0x00, 0x0c, 0x8d, 0x77, 0x01, 0x41, 0x8c, 0xac, 0x03, 0x59, 0x2e, 0x55, 0x01
	db	0xee, 0x59, 0x65, 0x03, 0x12, 0x1b, 0x1d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x47, 0x11, 0x74, 0x00, 0x19, 0xb2, 0x51, 0x01, 0x90, 0x26, 0x09, 0x01, 0xe6, 0x77, 0xe8, 0x00
	db	0xbb, 0xd6, 0xf4, 0x01, 0x32, 0xa3, 0x72, 0x00, 0x03, 0x3b, 0xcd, 0x01, 0xf2, 0xdf, 0xda, 0x00
	db	0x5e, 0xdb, 0x97, 0x00, 0x8d, 0x59, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x2b, 0x9a, 0xc6, 0x01, 0x1b, 0xcf, 0xde, 0x01, 0x6e, 0xfa, 0xc2, 0x02, 0x4f, 0x7c, 0x3b, 0x01
	db	0xc8, 0xea, 0x7b, 0x03, 0xb5, 0x16, 0x3a, 0x01, 0xda, 0x7b, 0x8e, 0x02, 0xac, 0xe8, 0xf6, 0x01
	db	0xe9, 0x4f, 0xe3, 0x01, 0x47, 0x69, 0x72, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x67, 0x0e, 0xf1, 0x01, 0xde, 0x73, 0x3c, 0x00, 0xa2, 0x7e, 0x2b, 0x02, 0xc2, 0x32, 0x0f, 0x01
	db	0x6a, 0x77, 0xff, 0x03, 0x77, 0x22, 0x14, 0x00, 0x88, 0x8b, 0xd3, 0x01, 0x38, 0x61, 0x77, 0x00
	db	0x22, 0x08, 0xc6, 0x03, 0x40, 0x11, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x75, 0xd1, 0x36, 0x02, 0x8e, 0x74, 0x08, 0x00, 0x6d, 0x47, 0xc6, 0x03, 0xdc, 0x4c, 0x3f, 0x01
	db	0x2a, 0xd0, 0xee, 0x02, 0x47, 0x8a, 0x83, 0x00, 0x10, 0x72, 0x2e, 0x03, 0xb3, 0xcb, 0x8b, 0x01
	db	0xe4, 0x8d, 0x85, 0x00, 0x26, 0x78, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xc7, 0x7f, 0xa3, 0x00, 0x0b, 0xb4, 0x27, 0x01, 0x84, 0x78, 0x95, 0x01, 0xad, 0x30, 0x1d, 0x01
	db	0x83, 0x66, 0x81, 0x02, 0x23, 0x0e, 0x6e, 0x01, 0xe4, 0x6b, 0xb7, 0x00, 0x15, 0xb1, 0x2d, 0x01
	db	0x06, 0x65, 0x51, 0x02, 0x62, 0xce, 0x54, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xdf, 0x1e, 0x45, 0x00, 0x9e, 0x74, 0xbd, 0x00, 0x42, 0x73, 0x99, 0x03, 0x4c, 0x2c, 0xcc, 0x01
	db	0x75, 0x69, 0xeb, 0x00, 0x08, 0x95, 0xa5, 0x01, 0xcf, 0x16, 0xa5, 0x03, 0xef, 0x28, 0xc2, 0x00
	db	0x5a, 0xff, 0x68, 0x01, 0x47, 0x7b, 0x69, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x59, 0x73, 0x52, 0x00, 0x56, 0x31, 0x78, 0x01, 0x5c, 0xd7, 0xaf, 0x03, 0xdc, 0x56, 0xce, 0x00
	db	0x70, 0xb9, 0xe4, 0x00, 0xe9, 0xab, 0x1c, 0x00, 0x6d, 0x0f, 0x9e, 0x02, 0x0c, 0x85, 0x88, 0x01
	db	0xfd, 0xfe, 0x35, 0x01, 0x80, 0x6d, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x83, 0x0e, 0x15, 0x02, 0xbf, 0x8a, 0x44, 0x01, 0x32, 0x02, 0xbb, 0x02, 0x59, 0xf2, 0x2b, 0x01
	db	0x68, 0x82, 0x3c, 0x03, 0x20, 0x1e, 0x71, 0x00, 0x8f, 0x14, 0xfc, 0x03, 0x70, 0x0e, 0x5e, 0x00
	db	0xf9, 0x8b, 0x7d, 0x01, 0xe2, 0xb2, 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x83, 0x4b, 0x13, 0x02, 0x17, 0x05, 0x1a, 0x00, 0xcc, 0xc3, 0x82, 0x01, 0x82, 0x21, 0x79, 0x00
	db	0x99, 0xd7, 0x13, 0x03, 0xd7, 0x3e, 0x1a, 0x00, 0x7e, 0x54, 0x44, 0x03, 0x0d, 0x4a, 0xf2, 0x01
	db	0xd2, 0x6a, 0xde, 0x03, 0x27, 0x31, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x68, 0xa8, 0xdc, 0x00, 0x27, 0x8f, 0x61, 0x00, 0x09, 0x17, 0x5a, 0x01, 0x8a, 0xc3, 0xdd, 0x00
	db	0x13, 0xfd, 0x20, 0x03, 0x8d, 0x16, 0x36, 0x00, 0x06, 0xab, 0x71, 0x03, 0xc7, 0x3f, 0x78, 0x01
	db	0x5f, 0xe0, 0x91, 0x03, 0x5d, 0x9b, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x38, 0x11, 0x47, 0x01, 0x42, 0xa5, 0xfc, 0x00, 0xcf, 0x31, 0xca, 0x00, 0xad, 0x7b, 0xca, 0x01
	db	0xbc, 0xbf, 0x75, 0x01, 0xad, 0x08, 0xa7, 0x01, 0x12, 0xe2, 0xbc, 0x03, 0x15, 0x42, 0x24, 0x01
	db	0x99, 0xbb, 0x75, 0x00, 0x68, 0xad, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x76, 0xb9, 0xa0, 0x03, 0xd1, 0x12, 0xdc, 0x01, 0x17, 0xab, 0x1a, 0x01, 0xba, 0xa0, 0xab, 0x00
	db	0xcd, 0x06, 0x98, 0x02, 0x90, 0xf5, 0x42, 0x01, 0xea, 0xd8, 0x8f, 0x01, 0x45, 0x15, 0xa0, 0x01
	db	0x55, 0xad, 0xc4, 0x03, 0xff, 0x71, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xc0, 0x98, 0xd0, 0x00, 0xc7, 0xfd, 0x0a, 0x00, 0x30, 0xd2, 0x6c, 0x00, 0xf3, 0x6a, 0x27, 0x01
	db	0xb2, 0x05, 0xf9, 0x03, 0x4c, 0x99, 0x02, 0x01, 0xa4, 0xb8, 0x2e, 0x00, 0xeb, 0xfb, 0x5c, 0x01
	db	0x5f, 0x85, 0x5f, 0x02, 0x18, 0x55, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xb2, 0x99, 0xcf, 0x01, 0x74, 0xc5, 0x99, 0x00, 0x88, 0x9c, 0xa6, 0x01, 0x10, 0x15, 0x88, 0x00
	db	0x54, 0x4b, 0xcd, 0x01, 0x9f, 0x10, 0x12, 0x01, 0xc5, 0xbd, 0x8a, 0x00, 0x7a, 0x64, 0x74, 0x00
	db	0x1f, 0xcb, 0x77, 0x02, 0x24, 0x33, 0xe5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x53, 0x50, 0xac, 0x02, 0xb0, 0x09, 0xb1, 0x01, 0x5e, 0x09, 0x4b, 0x02, 0xb3, 0x97, 0x69, 0x01
	db	0xb6, 0x6b, 0xf2, 0x02, 0x21, 0x10, 0x31, 0x00, 0x85, 0x78, 0x19, 0x00, 0x5a, 0xa5, 0xd0, 0x01
	db	0xc8, 0xfc, 0xb6, 0x03, 0xd5, 0x20, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x34, 0x4a, 0x58, 0x02, 0xe0, 0xee, 0xe7, 0x00, 0x03, 0x7a, 0x25, 0x03, 0xa3, 0x95, 0x1e, 0x01
	db	0x91, 0xad, 0x1e, 0x01, 0x02, 0x62, 0x53, 0x00, 0x24, 0xce, 0xb1, 0x00, 0xc6, 0x16, 0x85, 0x00
	db	0x6d, 0x9d, 0x66, 0x03, 0xa8, 0xa4, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x01, 0x3f, 0x77, 0x00, 0xce, 0xc9, 0x19, 0x00, 0x71, 0x61, 0x9f, 0x01, 0xde, 0xaf, 0xd4, 0x01
	db	0x23, 0x33, 0xe3, 0x02, 0xb6, 0x29, 0xad, 0x01, 0xdc, 0xd1, 0xea, 0x02, 0xa5, 0x51, 0xed, 0x01
	db	0xd0, 0x1a, 0x85, 0x01, 0xfa, 0xbd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xe5, 0x7d, 0x57, 0x00, 0x30, 0xc7, 0xdd, 0x00, 0x52, 0x99, 0x8b, 0x03, 0xae, 0x81, 0xf2, 0x00
	db	0x90, 0x03, 0xd5, 0x01, 0x71, 0xe0, 0x02, 0x00, 0xec, 0x80, 0x07, 0x00, 0x8d, 0x44, 0x0d, 0x01
	db	0xaf, 0xa2, 0xf8, 0x01, 0xb7, 0xa5, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x41, 0x25, 0x1f, 0x03, 0xae, 0x4b, 0xd3, 0x00, 0x9d, 0xff, 0x23, 0x03, 0x6d, 0x05, 0x3a, 0x00
	db	0x43, 0x54, 0xe2, 0x02, 0x05, 0xad, 0xa1, 0x00, 0xe8, 0xbe, 0xd1, 0x00, 0x8e, 0x7f, 0x2f, 0x00
	db	0x77, 0x74, 0x00, 0x03, 0xb1, 0x24, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x13, 0xa7, 0x14, 0x01, 0x76, 0x7e, 0x45, 0x01, 0xd5, 0x55, 0x22, 0x03, 0x7f, 0x64, 0xcc, 0x01
	db	0xef, 0xbd, 0xa4, 0x02, 0x30, 0xd7, 0x53, 0x01, 0xcf, 0x8b, 0x11, 0x00, 0xff, 0x55, 0xf7, 0x00
	db	0xc7, 0x90, 0x34, 0x01, 0x4e, 0x67, 0xea, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xe8, 0xa3, 0xbd, 0x02, 0x0d, 0x49, 0xbb, 0x00, 0xea, 0x91, 0xf2, 0x00, 0x40, 0xbf, 0x0a, 0x00
	db	0x21, 0xa3, 0xde, 0x01, 0xe0, 0x9c, 0x2f, 0x00, 0x93, 0xb1, 0xb2, 0x00, 0xb5, 0x54, 0xfa, 0x00
	db	0x2f, 0x30, 0x28, 0x01, 0x8b, 0x9d, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xbd, 0xf5, 0x2e, 0x02, 0xf3, 0x8a, 0x63, 0x01, 0x8a, 0x6f, 0x8c, 0x03, 0x3d, 0x3a, 0xa3, 0x01
	db	0xb2, 0x61, 0x92, 0x03, 0xb8, 0x89, 0xbb, 0x01, 0x9d, 0xcf, 0x0b, 0x01, 0xa9, 0x42, 0xcf, 0x00
	db	0x17, 0x6f, 0x3d, 0x02, 0xca, 0x1b, 0xda, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x25, 0x5b, 0xe3, 0x00, 0x4f, 0x82, 0x0d, 0x00, 0xcf, 0xe9, 0x52, 0x01, 0x5d, 0x93, 0xed, 0x00
	db	0x60, 0x84, 0x0b, 0x02, 0x3f, 0xb8, 0xc7, 0x01, 0xe5, 0x69, 0xc9, 0x00, 0x98, 0x41, 0xa7, 0x01
	db	0xd9, 0xa9, 0x46, 0x00, 0x68, 0xc7, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x6a, 0x7c, 0x59, 0x01, 0x9b, 0xa9, 0x44, 0x01, 0x51, 0x75, 0xa5, 0x00, 0x9c, 0x26, 0x18, 0x00
	db	0x4c, 0x46, 0x3c, 0x02, 0x22, 0xb0, 0x09, 0x00, 0xe1, 0x39, 0xee, 0x00, 0xf2, 0xc7, 0x14, 0x01
	db	0xd2, 0x9a, 0x8a, 0x03, 0x17, 0x4c, 0x58, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xd5, 0xc0, 0xb0, 0x03, 0x39, 0x0a, 0xb3, 0x00, 0xe4, 0x6c, 0x8a, 0x03, 0x3a, 0xd8, 0xde, 0x01
	db	0xa6, 0x77, 0xc2, 0x01, 0x61, 0x0a, 0x01, 0x01, 0xeb, 0xd3, 0x46, 0x03, 0x5e, 0x99, 0x8d, 0x01
	db	0x7c, 0xc5, 0xf2, 0x02, 0x6b, 0x28, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xd1, 0xae, 0x92, 0x00, 0x7b, 0xe3, 0x25, 0x01, 0x01, 0xa2, 0x7c, 0x02, 0x6b, 0x6b, 0x1a, 0x00
	db	0x55, 0x0f, 0x29, 0x03, 0x48, 0xba, 0x47, 0x00, 0x6c, 0x91, 0x8d, 0x01, 0x62, 0x90, 0xa5, 0x01
	db	0xd4, 0x35, 0x3e, 0x01, 0xb1, 0xab, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xaa, 0xd2, 0x3a, 0x00, 0xc0, 0xdc, 0x7d, 0x00, 0x76, 0x0f, 0xc1, 0x00, 0x0b, 0x59, 0x01, 0x00
	db	0xa6, 0xfc, 0x2c, 0x00, 0x3e, 0xd2, 0x0e, 0x00, 0x29, 0x43, 0xee, 0x00, 0x04, 0x0f, 0x90, 0x00
	db	0x65, 0x40, 0xc2, 0x01, 0x70, 0xfa, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x60, 0x5e, 0x02, 0x02, 0xb8, 0x12, 0x39, 0x00, 0x1c, 0x04, 0x27, 0x03, 0xe5, 0x5e, 0x7e, 0x01
	db	0xec, 0xec, 0xc0, 0x02, 0x1c, 0x0d, 0x5a, 0x01, 0x7c, 0xce, 0xb1, 0x02, 0x0b, 0x22, 0x62, 0x00
	db	0x7e, 0x06, 0x45, 0x01, 0x31, 0xd9, 0xa5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xa6, 0x73, 0x96, 0x00, 0x09, 0xf6, 0xe1, 0x00, 0x2a, 0x7c, 0x92, 0x00, 0x37, 0xaa, 0x6f, 0x01
	db	0xf0, 0x0e, 0x65, 0x01, 0xb5, 0x63, 0x6f, 0x01, 0xe1, 0x40, 0xcd, 0x03, 0x8f, 0xc3, 0x3b, 0x00
	db	0xac, 0xf0, 0x61, 0x03, 0xcc, 0x2a, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x37, 0x10, 0xf8, 0x02, 0xe8, 0xa0, 0x8c, 0x00, 0xd1, 0x23, 0x7e, 0x01, 0xfe, 0xeb, 0x1d, 0x01
	db	0x68, 0xbb, 0xbc, 0x01, 0x63, 0x25, 0x2e, 0x00, 0xd6, 0xad, 0xe8, 0x03, 0xe5, 0x16, 0x08, 0x00
	db	0x75, 0x70, 0xfb, 0x03, 0xac, 0xe5, 0x53, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xcd, 0x1e, 0xb1, 0x02, 0x85, 0xf1, 0x6b, 0x01, 0xef, 0x22, 0x8f, 0x00, 0xbb, 0xd2, 0xe7, 0x00
	db	0x2e, 0xd9, 0x25, 0x02, 0x85, 0xe7, 0xec, 0x00, 0x73, 0x88, 0x50, 0x00, 0xf5, 0x16, 0x7e, 0x01
	db	0x5d, 0xe8, 0xfb, 0x01, 0x0e, 0x9a, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x79, 0x92, 0x66, 0x01, 0x0a, 0x81, 0x7c, 0x01, 0xf5, 0x41, 0x49, 0x02, 0xeb, 0xeb, 0x23, 0x00
	db	0x88, 0x76, 0xeb, 0x00, 0xf1, 0x60, 0x57, 0x00, 0x46, 0x41, 0xca, 0x02, 0xe7, 0xcd, 0x73, 0x00
	db	0x75, 0xbb, 0x52, 0x00, 0xa7, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x6b, 0x85, 0xb8, 0x03, 0xcd, 0x7d, 0xcb, 0x00, 0x06, 0x4e, 0xf1, 0x02, 0xd0, 0x20, 0x18, 0x00
	db	0x75, 0x41, 0xd7, 0x01, 0x22, 0x9e, 0xe5, 0x00, 0x50, 0xa5, 0xfb, 0x03, 0x41, 0x46, 0x48, 0x00
	db	0x88, 0x00, 0x35, 0x03, 0xa3, 0xc9, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x55, 0xf3, 0xdc, 0x00, 0x1c, 0x48, 0x04, 0x01, 0x64, 0xe4, 0x22, 0x00, 0xe7, 0x3f, 0xf7, 0x01
	db	0x25, 0x33, 0xe0, 0x00, 0x98, 0xb6, 0x52, 0x01, 0x9a, 0x76, 0xef, 0x02, 0x63, 0x36, 0x97, 0x00
	db	0x8c, 0x9b, 0x03, 0x00, 0x5b, 0x39, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x47, 0x5f, 0x80, 0x01, 0xec, 0x60, 0x91, 0x01, 0xd0, 0x2c, 0x83, 0x03, 0xeb, 0x06, 0x8b, 0x00
	db	0x17, 0xd7, 0xd4, 0x03, 0x06, 0xb0, 0x4c, 0x00, 0x8f, 0x5b, 0xa7, 0x03, 0x30, 0x3d, 0x3b, 0x01
	db	0x88, 0xad, 0xcf, 0x01, 0xd1, 0x34, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x8a, 0x33, 0x78, 0x00, 0xe3, 0xd2, 0xc7, 0x01, 0x23, 0x2b, 0xbc, 0x02, 0x05, 0x3f, 0x8b, 0x01
	db	0xaa, 0xd9, 0x80, 0x02, 0x44, 0x3d, 0x5f, 0x00, 0x5a, 0xa9, 0x20, 0x02, 0x97, 0xeb, 0xee, 0x00
	db	0xec, 0xaa, 0x62, 0x03, 0x51, 0x5d, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x43, 0xf5, 0xb9, 0x01, 0x4d, 0xac, 0x3f, 0x01, 0xae, 0x93, 0xad, 0x02, 0x64, 0xf4, 0x8e, 0x01
	db	0xf7, 0xcd, 0x12, 0x02, 0xa9, 0x8b, 0x13, 0x01, 0xab, 0x83, 0x15, 0x01, 0x26, 0x3d, 0x9c, 0x01
	db	0xb4, 0x90, 0x87, 0x02, 0xb6, 0xe2, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x58, 0xb7, 0x3b, 0x03, 0xf1, 0xdb, 0xf0, 0x01, 0xd1, 0x4b, 0x73, 0x03, 0xe5, 0xb1, 0x29, 0x01
	db	0x0e, 0x95, 0xb3, 0x02, 0x22, 0xc9, 0x3b, 0x00, 0xc8, 0x3e, 0xa5, 0x01, 0x32, 0x55, 0x8c, 0x01
	db	0xee, 0x3c, 0x6f, 0x00, 0x79, 0x3c, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x5d, 0xf9, 0x51, 0x03, 0x37, 0xa7, 0x12, 0x00, 0xb8, 0x96, 0xd5, 0x03, 0xfe, 0x58, 0x76, 0x01
	db	0x4a, 0xe5, 0xac, 0x00, 0xda, 0x66, 0x8b, 0x00, 0x99, 0xc5, 0x36, 0x00, 0xa2, 0x63, 0x2a, 0x01
	db	0xa1, 0xeb, 0x2c, 0x03, 0xac, 0x6b, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x7e, 0xfe, 0xdc, 0x03, 0x18, 0x4f, 0x9f, 0x01, 0xee, 0x1a, 0xc8, 0x01, 0x2b, 0xbc, 0x44, 0x00
	db	0x65, 0x71, 0x82, 0x00, 0x13, 0x7c, 0x4f, 0x01, 0xf0, 0x30, 0xb4, 0x03, 0xcc, 0x96, 0xbf, 0x00
	db	0x62, 0x8d, 0x0c, 0x02, 0x97, 0x19, 0x47, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x31, 0x79, 0xfc, 0x01, 0xdd, 0x42, 0x1f, 0x00, 0x4a, 0x75, 0xba, 0x00, 0x39, 0xd3, 0x5b, 0x00
	db	0x49, 0xbe, 0x3f, 0x00, 0x30, 0x39, 0x6b, 0x01, 0x9c, 0x15, 0x2a, 0x01, 0xb0, 0x83, 0x9f, 0x00
	db	0x67, 0x0f, 0x53, 0x03, 0x85, 0x7b, 0xe5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x81, 0xbd, 0xec, 0x02, 0x94, 0xc2, 0x96, 0x00, 0xa9, 0xe4, 0xfc, 0x01, 0xa5, 0x01, 0x77, 0x01
	db	0x7d, 0x04, 0x75, 0x01, 0x31, 0x4a, 0xee, 0x00, 0xe5, 0x86, 0x26, 0x01, 0xd4, 0xfc, 0x8e, 0x00
	db	0x54, 0xdc, 0x49, 0x03, 0x6f, 0x46, 0xb3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xa3, 0x9c, 0x17, 0x02, 0x14, 0x64, 0xd8, 0x01, 0xd0, 0xaf, 0xf0, 0x03, 0x64, 0x59, 0x30, 0x00
	db	0x28, 0x74, 0x5c, 0x01, 0x1e, 0x71, 0x99, 0x00, 0x42, 0x54, 0x5d, 0x01, 0x14, 0x10, 0xc7, 0x00
	db	0x2e, 0x0b, 0xb4, 0x01, 0xcf, 0x83, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x86, 0xc3, 0xaf, 0x01, 0x59, 0x48, 0x98, 0x01, 0xff, 0x03, 0x62, 0x03, 0xa8, 0xc6, 0x45, 0x00
	db	0xaa, 0xa8, 0x20, 0x00, 0xaa, 0x0b, 0x99, 0x00, 0x10, 0x3f, 0x31, 0x03, 0xde, 0xee, 0x7c, 0x00
	db	0xe4, 0x29, 0x74, 0x02, 0xce, 0x06, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xa1, 0x57, 0x93, 0x03, 0xf4, 0xf8, 0x42, 0x01, 0xb6, 0xa7, 0x94, 0x02, 0xf4, 0xcc, 0xea, 0x00
	db	0xb3, 0xed, 0x59, 0x02, 0x6e, 0x1e, 0x31, 0x01, 0x6f, 0x32, 0x4d, 0x00, 0x46, 0xc3, 0x30, 0x01
	db	0x3c, 0xef, 0xcc, 0x01, 0xb2, 0x24, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x8c, 0x91, 0x64, 0x03, 0xc0, 0x8f, 0x14, 0x00, 0x7b, 0x8a, 0x63, 0x01, 0x5b, 0xfd, 0xa1, 0x01
	db	0x13, 0xd0, 0x8a, 0x02, 0xa4, 0xe5, 0x81, 0x00, 0x33, 0x4f, 0xa5, 0x01, 0x01, 0xe1, 0x74, 0x01
	db	0x57, 0x02, 0x3d, 0x00, 0x6c, 0x85, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xcf, 0x1d, 0x05, 0x00, 0x1d, 0x2b, 0xf6, 0x00, 0xad, 0xd0, 0x43, 0x01, 0xbd, 0xad, 0x42, 0x00
	db	0x90, 0xda, 0x0f, 0x00, 0xeb, 0x3c, 0x74, 0x01, 0xe4, 0xe5, 0x73, 0x01, 0x49, 0xc7, 0x7b, 0x01
	db	0x7a, 0x13, 0xb7, 0x03, 0x96, 0xce, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x8a, 0x21, 0xf9, 0x00, 0x7c, 0x8c, 0x5b, 0x01, 0xf8, 0x02, 0xe1, 0x00, 0xe2, 0xd7, 0x58, 0x01
	db	0xb8, 0xa5, 0x69, 0x01, 0x76, 0xf1, 0xb2, 0x00, 0x7a, 0x34, 0x8b, 0x01, 0xf2, 0xfe, 0x4c, 0x01
	db	0xe3, 0xa4, 0x14, 0x02, 0x95, 0x15, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xe5, 0x7a, 0x6d, 0x00, 0x71, 0xc3, 0x95, 0x01, 0x6d, 0xe2, 0x91, 0x03, 0xc6, 0xa7, 0x62, 0x00
	db	0xab, 0x42, 0x3f, 0x00, 0x86, 0xad, 0x0d, 0x01, 0x98, 0x81, 0x4f, 0x02, 0x2a, 0x2b, 0x54, 0x01
	db	0x54, 0xc4, 0x14, 0x00, 0x71, 0xc4, 0x89, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x8e, 0x98, 0x90, 0x03, 0x9d, 0x79, 0xb8, 0x00, 0x12, 0x49, 0xe4, 0x02, 0xe6, 0xe2, 0x78, 0x00
	db	0x54, 0x56, 0x07, 0x00, 0xed, 0x3e, 0x92, 0x01, 0x72, 0xcd, 0x40, 0x00, 0x76, 0x7c, 0xa3, 0x00
	db	0x66, 0xd4, 0x09, 0x00, 0x1d, 0x53, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x70, 0x17, 0x65, 0x02, 0x01, 0x9d, 0x60, 0x00, 0x65, 0xc2, 0x86, 0x02, 0x3c, 0x51, 0x34, 0x01
	db	0x81, 0x92, 0xee, 0x00, 0x3c, 0x22, 0x5d, 0x00, 0x0c, 0x76, 0x5c, 0x03, 0x36, 0x9b, 0x67, 0x00
	db	0xb8, 0xec, 0x73, 0x00, 0x50, 0xaa, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xe4, 0x9b, 0xc8, 0x02, 0x44, 0xc2, 0x6f, 0x01, 0x83, 0x8c, 0xf3, 0x02, 0x72, 0xeb, 0x8b, 0x01
	db	0x2c, 0xce, 0xb3, 0x02, 0x65, 0xb0, 0x97, 0x00, 0x7b, 0x01, 0x4f, 0x03, 0x7f, 0x95, 0xdd, 0x01
	db	0x61, 0x8f, 0x14, 0x00, 0x57, 0xb3, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xf8, 0xd2, 0x43, 0x03, 0xfc, 0x98, 0x33, 0x00, 0x8e, 0x36, 0x1e, 0x01, 0x1f, 0x2a, 0x78, 0x00
	db	0xea, 0x9e, 0x01, 0x00, 0x6f, 0x7b, 0x11, 0x00, 0xd1, 0xd0, 0x28, 0x01, 0xbb, 0xe6, 0xa5, 0x01
	db	0x1b, 0x4f, 0x94, 0x01, 0xe1, 0x41, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x01, 0x83, 0x31, 0x03, 0x30, 0xcd, 0x8e, 0x01, 0xb1, 0xd0, 0x04, 0x01, 0x8b, 0x39, 0x38, 0x00
	db	0x01, 0x67, 0x72, 0x03, 0x8c, 0xa8, 0x9d, 0x01, 0x69, 0x97, 0x2d, 0x00, 0x81, 0xa6, 0xa7, 0x00
	db	0x28, 0x90, 0x1d, 0x03, 0x32, 0xfc, 0xeb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x5e, 0x40, 0x20, 0x02, 0xce, 0xfa, 0x71, 0x01, 0xf8, 0x30, 0xd9, 0x02, 0x6a, 0x6d, 0x7f, 0x01
	db	0x47, 0x8c, 0x3b, 0x02, 0xf9, 0xd5, 0x29, 0x01, 0x56, 0x24, 0x97, 0x02, 0x24, 0xa5, 0xa3, 0x00
	db	0xd2, 0x4c, 0x6f, 0x00, 0xfa, 0x39, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x05, 0x35, 0xc5, 0x00, 0xfd, 0xc2, 0x90, 0x01, 0x44, 0x72, 0x50, 0x00, 0xf9, 0x30, 0x99, 0x00
	db	0x70, 0x92, 0xa3, 0x01, 0xc6, 0x27, 0xd3, 0x01, 0x47, 0xbc, 0x99, 0x03, 0x3d, 0xe1, 0xcf, 0x01
	db	0x99, 0xbd, 0x32, 0x03, 0x7d, 0x3e, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xe4, 0xf5, 0x03, 0x02, 0xb5, 0x27, 0x36, 0x00, 0xf8, 0x8a, 0x01, 0x00, 0x81, 0x85, 0x47, 0x01
	db	0x18, 0x22, 0x4a, 0x00, 0xb7, 0x3b, 0x2e, 0x00, 0xd0, 0x84, 0x93, 0x03, 0x62, 0xea, 0x46, 0x01
	db	0x93, 0x96, 0x0b, 0x02, 0x5f, 0x15, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x6f, 0x7e, 0xc9, 0x03, 0x47, 0x8c, 0x73, 0x00, 0x1f, 0xdb, 0xb5, 0x03, 0xcf, 0x8f, 0x80, 0x01
	db	0x98, 0xfc, 0xe8, 0x01, 0xdd, 0x25, 0xed, 0x01, 0x45, 0x50, 0xbf, 0x01, 0x2b, 0x5c, 0xeb, 0x00
	db	0x98, 0xfe, 0x78, 0x01, 0x30, 0x55, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xb0, 0x0e, 0xc2, 0x01, 0x22, 0xec, 0xae, 0x01, 0xee, 0x9e, 0x0b, 0x03, 0x7e, 0xd0, 0xb7, 0x01
	db	0x6f, 0xe1, 0x87, 0x01, 0xfb, 0x21, 0x44, 0x01, 0x31, 0xa7, 0x9f, 0x00, 0xd7, 0xb6, 0x40, 0x00
	db	0x61, 0x18, 0x84, 0x00, 0xbc, 0x7f, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xbf, 0x9a, 0xd6, 0x02, 0xbf, 0xcd, 0x58, 0x00, 0xec, 0xf9, 0x29, 0x01, 0xae, 0x19, 0x3c, 0x01
	db	0x93, 0x5b, 0x6c, 0x02, 0xe7, 0x7f, 0x3a, 0x01, 0xba, 0xb2, 0x4b, 0x00, 0x6f, 0x22, 0x63, 0x00
	db	0xca, 0x95, 0x2a, 0x00, 0xd9, 0xef, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xc1, 0xd2, 0xf5, 0x02, 0x18, 0x83, 0x37, 0x00, 0xb5, 0x4f, 0x73, 0x03, 0x73, 0x80, 0x25, 0x01
	db	0xf6, 0xf0, 0x63, 0x02, 0xe0, 0x70, 0xad, 0x01, 0x06, 0x6d, 0xb5, 0x01, 0xbd, 0x8f, 0x18, 0x01
	db	0x03, 0x95, 0x1b, 0x01, 0xe1, 0xd2, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xcc, 0xa8, 0x13, 0x01, 0x3e, 0x1c, 0x54, 0x01, 0xbc, 0x2b, 0xac, 0x02, 0x67, 0x58, 0xd9, 0x01
	db	0x59, 0x74, 0xf4, 0x01, 0x89, 0xd4, 0xea, 0x00, 0x48, 0x5b, 0xab, 0x00, 0x45, 0x3b, 0xdb, 0x01
	db	0x01, 0xb8, 0xed, 0x00, 0x4f, 0x02, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x0f, 0x19, 0xb8, 0x00, 0xc2, 0xe4, 0x1f, 0x01, 0x82, 0x1f, 0x62, 0x00, 0xd7, 0x08, 0x05, 0x01
	db	0x76, 0x5a, 0x1a, 0x00, 0xfd, 0xd7, 0xc7, 0x00, 0x6d, 0xb9, 0xaa, 0x03, 0xdc, 0xd9, 0x9c, 0x01
	db	0x35, 0x66, 0x9c, 0x01, 0x1e, 0xaa, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xf2, 0x5c, 0x08, 0x01, 0xaf, 0x47, 0xfd, 0x01, 0xe1, 0xf5, 0xe3, 0x03, 0x99, 0x3e, 0x4b, 0x00
	db	0x6a, 0xd4, 0xe3, 0x01, 0x3c, 0x03, 0x60, 0x00, 0xa8, 0xf0, 0x5f, 0x01, 0xd8, 0xcd, 0x50, 0x01
	db	0x21, 0x8e, 0x9e, 0x02, 0xbc, 0xf1, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xb1, 0x6c, 0x15, 0x00, 0x3f, 0x62, 0x3d, 0x00, 0x69, 0xf0, 0xa4, 0x01, 0x53, 0xd0, 0xd8, 0x00
	db	0xea, 0x8a, 0xb6, 0x01, 0xb6, 0x5a, 0xca, 0x01, 0x43, 0xae, 0x16, 0x03, 0x44, 0xdc, 0x34, 0x01
	db	0x58, 0x8d, 0x1c, 0x00, 0x43, 0xb3, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x81, 0xc7, 0x18, 0x03, 0x1f, 0x44, 0x35, 0x01, 0x5e, 0x1a, 0xa5, 0x03, 0xf4, 0x93, 0x92, 0x01
	db	0x37, 0xbb, 0x48, 0x00, 0x41, 0x33, 0x3d, 0x01, 0x1e, 0x15, 0x43, 0x01, 0xe1, 0x74, 0x9c, 0x01
	db	0x14, 0x19, 0x91, 0x00, 0xde, 0xdd, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x6f, 0xc2, 0x6b, 0x00, 0x5f, 0x8e, 0xd4, 0x00, 0xbe, 0x7b, 0x22, 0x00, 0xa8, 0x9e, 0x62, 0x00
	db	0x8b, 0x5f, 0xea, 0x01, 0x30, 0xa3, 0x79, 0x01, 0x5f, 0x1d, 0x7a, 0x02, 0x8e, 0x8f, 0xbf, 0x01
	db	0x2a, 0x6e, 0xd2, 0x02, 0x5e, 0xb6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0xb6, 0x1a, 0x70, 0x01, 0x77, 0xda, 0x51, 0x00, 0x67, 0xb6, 0xb4, 0x01, 0x7c, 0xce, 0xa0, 0x00
	db	0x7b, 0xe3, 0x8a, 0x03, 0x52, 0xc8, 0x2a, 0x01, 0xfe, 0xb0, 0xa0, 0x03, 0xbb, 0xc2, 0x97, 0x00
	db	0xd2, 0x17, 0xa0, 0x00, 0x2a, 0x8b, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
	db	0x62, 0xb9, 0x20, 0x01, 0x42, 0xfb, 0x05, 0x00, 0xfd, 0xb6, 0x53, 0x03, 0xce, 0xf8, 0x61, 0x00
	db	0x63, 0x14, 0x7a, 0x00, 0x64, 0x0a, 0x56, 0x01, 0x92, 0xa7, 0xe0, 0x00, 0x92, 0x7c, 0x90, 0x01
	db	0x22, 0x66, 0x3a, 0x01, 0xf1, 0x47, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
calign
.scalarmult_vartime_done:
	lea	rdi, [rsp+0x710]
	mov	rsi, r12
	call	ed25519$pack

	; ed25519_verify...

	mov	rax, [rsp+0xdf0]
	pxor	xmm1, xmm1
	movups	xmm0, [rax]
	pxor	xmm0, [rsp+0x710]
	movaps	xmm7, xmm0
	punpckhbw xmm0, xmm1
	punpcklbw xmm7, xmm1
	movaps	xmm8, xmm0
	pxor	xmm0, xmm0
	movaps	xmm2, xmm7
	punpcklwd xmm2, xmm0
	punpckhwd xmm7, xmm0
	movaps	xmm6, xmm2
	movaps	xmm2, xmm8
	punpckhwd xmm8, xmm0
	punpcklwd xmm2, xmm0
	movaps	xmm15, xmm8
	movaps	xmm9, xmm2
	movups	xmm2, [rax+0x10]
	pxor	xmm2, [rsp+0x720]
	movaps	xmm4, xmm2
	punpckhbw xmm2, xmm1
	punpcklbw xmm4, xmm1
	movaps	xmm1, xmm4
	punpckhwd xmm4, xmm0
	punpcklwd xmm1, xmm0
	movaps	xmm3, xmm1
	movaps	xmm1, xmm2
	punpckhwd xmm2, xmm0
	punpcklwd xmm1, xmm0
	movaps	xmm0, xmm9
	movaps	xmm5, xmm1
	pxor	xmm1, xmm1
	punpckhdq xmm0, xmm1
	punpckldq xmm9, xmm1
	punpckldq xmm15, xmm1
	punpckhdq xmm8, xmm1
	por	xmm0, xmm9
	por	xmm0, xmm15
	movaps	xmm15, xmm6
	punpckldq xmm6, xmm1
	punpckhdq xmm15, xmm1
	por	xmm0, xmm8
	por	xmm0, xmm15
	movaps	xmm15, xmm7
	punpckldq xmm7, xmm1
	punpckhdq xmm15, xmm1
	por	xmm0, xmm15
	por	xmm0, xmm7
	movaps	xmm7, xmm2
	punpckldq xmm2, xmm1
	punpckhdq xmm7, xmm1
	por	xmm0, xmm6
	por	xmm0, xmm7
	movaps	xmm7, xmm5
	punpckldq xmm5, xmm1
	punpckhdq xmm7, xmm1
	por	xmm0, xmm2
	por	xmm0, xmm7
	movaps	xmm7, xmm4
	punpckldq xmm4, xmm1
	punpckhdq xmm7, xmm1
	por	xmm0, xmm5
	por	xmm0, xmm7
	movaps	xmm7, xmm3
	punpckldq xmm3, xmm1
	punpckhdq xmm7, xmm1
	por	xmm0, xmm4
	por	xmm0, xmm7
	por	xmm0, xmm3
	movaps	xmm7, xmm0
	psrldq	xmm7, 0x8
	por	xmm0, xmm7
	movq	[rsp], xmm0
	mov	rax, [rsp]
	sub	rax, 0x1
	shr	rax, 0x8
	and	eax, 0x1

	; eax is fine for our bool return.
.bailout:
	mov	rcx, [rsp+0xdf8]
	add	rsp, rcx
	add	rsp, 0xe00
	pop	r15 r14 r13 r12 rbx rbp
	epilog
align 16
.one:
	dq	1, 0, 0, 0, 0, 0
.zero:
	dq	0, 0, 0, 0
align 16
.ec2d:
	dd	0x02b2f159,0x01a6e509,0x022add7a,0x00d4141d,0x00038052,0x00f3d130,0x03407977,0x019ce331,0x01c56dff,0x00901b67
	dq	0x0
falign
.full_to_pniels:
	movaps	xmm1, [rsi+0x30]
	add	rdi, 0x90
	add	rsi, 0x90
	mov	edx, .ec2d
	paddd	xmm1, [ed25519$packed2p0]
	psubd	xmm1, [rsi-0x90]
	pshufd	xmm5, xmm1, 0xa0
	pshufd	xmm1, xmm1, 0xf5
	movaps	xmm3, [ed25519$sse2_bot32bitmask]
	pand	xmm5, xmm3
	pand	xmm1, xmm3
	movaps	xmm0, [rsi-0x50]
	movaps	xmm3, xmm5
	paddd	xmm0, [ed25519$packed2p1]
	psubd	xmm0, [rsi-0x80]
	movaps	xmm4, xmm1
	pand	xmm5, [ed25519$packedmask26]
	
	psrld	xmm3, 0x1a
	movaps	xmm2, [rsi-0x40]
	pand	xmm1, [ed25519$packedmask25]
	psrld	xmm4, 0x19
	movaps	xmm6, xmm4
	paddd	xmm2, [ed25519$packed2p2]
	psrldq	xmm4, 8
	psubd	xmm2, [rsi-0x70]
	pslldq	xmm6, 8
	movaps	[rdi-0x70], xmm2
	paddd	xmm0, xmm4
	paddd	xmm5, xmm6
	movaps	[rdi-0x80], xmm0
	paddd	xmm3, xmm1
	movaps	xmm1, xmm5
	punpckldq xmm5, xmm3
	punpckhdq xmm1, xmm3
	punpcklqdq xmm5, xmm1
	movaps	[rdi-0x90], xmm5

	movaps	xmm2, [rsi-0x90]
	movaps	xmm1, [rsi-0x80]
	paddd	xmm2, [rsi-0x60]
	movaps	xmm0, [rsi-0x70]
	paddd	xmm1, [rsi-0x50]
	paddd	xmm0, [rsi-0x40]

	movaps	[rdi-0x60], xmm2
	movaps	[rdi-0x50], xmm1
	movaps	[rdi-0x40], xmm0

	movaps	xmm2, [rsi-0x30]
	movaps	xmm1, [rsi-0x20]
	movaps	xmm0, [rsi-0x10]
	movaps	[rdi-0x30], xmm2
	movaps	[rdi-0x20], xmm1
	movaps	[rdi-0x10], xmm0
	call	curve25519$mul
	ret

falign
.pnielsadd_p1p1:
	sub	rsp, 0x130
	mov	r9d, ecx
	movzx	r8d, cl
	movaps	xmm8, [rsi+0x30]
	xor	r9d, 0x1
	movzx	eax, r9b
	lea	r8, [r8+r8*2]
	add	ecx, 0x2
	movaps	xmm1, [rsi]
	lea	rax, [rax+rax*2]
	shl	r8, 0x4
	movsxd	rcx, ecx
	movaps	xmm0, [ed25519$packed2p0]
	shl	rax, 0x4
	add	r8, rdx
	add	rax, rdx
	paddd	xmm0, xmm8
	psubd	xmm0, xmm1
	pshufd	xmm15, xmm0, 0xa0
	pshufd	xmm10, xmm0, 0xf5
	movaps	xmm6, [rsi+0x10]
	paddd	xmm1, xmm8
	pand	xmm15, [ed25519$sse2_bot32bitmask]
	movaps	xmm7, [rsi+0x40]
	pand	xmm10, [ed25519$sse2_bot32bitmask]
	movaps	xmm5, [ed25519$packed2p1]
	movaps	xmm0, xmm15
	paddd	xmm5, xmm7
	psubd	xmm5, xmm6
	pand	xmm15, [ed25519$packedmask26]
	paddd	xmm7, xmm6
	movaps	xmm9, xmm10
	psrld	xmm0, 0x1a
	movaps	xmm3, [rsi+0x50]
	pand	xmm10, [ed25519$packedmask25]
	psrld	xmm9, 0x19
	movaps	xmm11, xmm9
	psrldq	xmm9, 0x8
	paddd	xmm5, xmm9
	movaps	xmm9, xmm5
	movaps	xmm2, [rsi+0x20]
	pslldq	xmm11, 0x8
	paddd	xmm15, xmm11
	punpcklqdq xmm9, xmm7
	paddd	xmm0, xmm10
	movaps	xmm10, xmm15
	punpckldq xmm15, xmm0
	movaps	xmm4, [ed25519$packed2p2]
	punpckhdq xmm10, xmm0
	movaps	xmm0, xmm7
	movaps	xmm7, xmm9
	paddd	xmm4, xmm3
	psubd	xmm4, xmm2
	punpckhqdq xmm5, xmm0
	movaps	xmm0, [rax]
	paddd	xmm2, xmm3
	punpcklqdq xmm15, xmm10
	psrlq	xmm7, 0x20
	punpcklqdq xmm4, xmm2
	movaps	xmm11, [r8+0x20]
	movaps	xmm6, xmm15
	punpckhqdq xmm15, xmm1
	movaps	xmm2, xmm4
	punpcklqdq xmm6, xmm1
	movaps	xmm1, [r8]
	psrlq	xmm2, 0x20
	punpcklqdq xmm11, [rax+0x20]
	movaps	xmm14, xmm15
	movaps	xmm3, xmm1
	punpckhqdq xmm1, xmm0
	movaps	xmm12, xmm6
	psrlq	xmm14, 0x20
	movaps	[rsp-0x68], xmm7
	movaps	xmm7, xmm5
	psrlq	xmm12, 0x20
	movaps	[rsp-0x58], xmm5
	punpcklqdq xmm3, xmm0
	psrlq	xmm7, 0x20
	movaps	xmm0, xmm1
	movaps	xmm10, xmm11
	movaps	[rsp-0x28], xmm7
	psrlq	xmm0, 0x20
	psrlq	xmm10, 0x20
	movaps	xmm8, xmm6
	movaps	[rsp+0x48], xmm2
	movaps	xmm2, xmm0
	movaps	[rsp-0x8], xmm4
	movaps	xmm4, xmm3
	psrlq	xmm3, 0x20
	movaps	[rsp-0x38], xmm10
	movaps	xmm10, xmm6
	pmuludq	xmm8, xmm4
	movaps	[rsp+0x8], xmm8
	pmuludq	xmm10, xmm3
	movaps	xmm8, xmm15
	movaps	[rsp-0x18], xmm11
	pmuludq	xmm8, xmm4
	movaps	xmm5, [rax+0x10]
	lea	rax, [rcx+rcx*2]
	movaps	xmm7, [r8+0x10]
	shl	rax, 0x4
	add	rax, rdi
	movaps	xmm0, xmm7
	punpckhqdq xmm7, xmm5
	punpcklqdq xmm0, xmm5
	movaps	xmm5, xmm7
	psrlq	xmm5, 0x20
	movaps	[rsp-0x48], xmm5
	movaps	xmm5, xmm12
	movaps	xmm13, xmm0
	pmuludq	xmm5, xmm4
	paddq	xmm5, xmm10
	movaps	xmm10, xmm12
	movaps	[rsp+0x18], xmm5
	psrlq	xmm13, 0x20
	pslld	xmm10, 0x1
	movaps	xmm5, xmm10
	pmuludq	xmm10, xmm3
	movaps	[rsp-0x78], xmm13
	movaps	xmm13, xmm7
	movaps	xmm7, xmm10
	movaps	xmm10, xmm6
	paddq	xmm7, xmm8
	movaps	xmm8, xmm7
	pmuludq	xmm10, xmm1
	paddq	xmm8, xmm10
	movaps	xmm10, xmm14
	movaps	[rsp+0x28], xmm8
	movaps	xmm8, xmm15
	pmuludq	xmm10, xmm4
	pmuludq	xmm8, xmm3
	paddq	xmm8, xmm10
	movaps	xmm10, xmm12
	pmuludq	xmm10, xmm1
	movaps	xmm7, xmm10
	movaps	xmm10, xmm6
	paddq	xmm7, xmm8
	movaps	xmm11, xmm7
	pmuludq	xmm10, xmm2
	paddq	xmm11, xmm10
	movaps	xmm10, xmm14
	movaps	[rsp+0x38], xmm11
	pslld	xmm10, 0x1
	movaps	xmm7, xmm10
	movaps	xmm10, xmm9
	movaps	xmm8, xmm7
	pmuludq	xmm10, xmm4
	pmuludq	xmm8, xmm3
	paddq	xmm8, xmm10
	movaps	xmm10, xmm15
	pmuludq	xmm10, xmm1
	paddq	xmm10, xmm8
	movaps	xmm8, xmm5
	pmuludq	xmm8, xmm2
	paddq	xmm8, xmm10
	movaps	xmm10, xmm6
	pmuludq	xmm10, xmm0
	paddq	xmm8, xmm10
	movaps	[rsp+0x88], xmm8
	movaps	xmm10, xmm9
	movaps	[rsp+0x58], xmm13
	pmuludq	xmm10, xmm3
	movaps	xmm11, [rsp-0x68]
	movaps	xmm8, xmm11
	pmuludq	xmm8, xmm4
	paddq	xmm10, xmm8
	movaps	xmm8, xmm14
	pmuludq	xmm8, xmm1
	paddq	xmm8, xmm10
	movaps	xmm10, xmm15
	pmuludq	xmm10, xmm2
	paddq	xmm10, xmm8
	movaps	xmm8, xmm12
	pmuludq	xmm8, xmm0
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp-0x78]
	pmuludq	xmm10, xmm6
	paddq	xmm8, xmm10
	movaps	xmm10, xmm11
	movaps	[rsp+0x98], xmm8
	pslld	xmm10, 0x1
	movaps	xmm11, xmm10
	movaps	xmm8, xmm11
	pmuludq	xmm11, xmm2
	movaps	xmm10, [rsp-0x58]
	pmuludq	xmm8, xmm3
	pmuludq	xmm10, xmm4
	paddq	xmm8, xmm10
	movaps	xmm10, xmm9
	pmuludq	xmm10, xmm1
	paddq	xmm10, xmm8
	movaps	xmm8, xmm7
	pmuludq	xmm8, xmm2
	paddq	xmm8, xmm10
	movaps	xmm10, xmm15
	pmuludq	xmm10, xmm0
	paddq	xmm10, xmm8
	movaps	xmm8, [rsp-0x78]
	pmuludq	xmm8, xmm5
	paddq	xmm8, xmm10
	movaps	xmm10, xmm13
	pmuludq	xmm10, xmm6
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp-0x58]
	movaps	[rsp+0xa8], xmm8
	pmuludq	xmm10, xmm3
	movaps	xmm8, [rsp-0x28]
	pmuludq	xmm8, xmm4
	paddq	xmm10, xmm8
	movaps	xmm8, [rsp-0x68]
	pmuludq	xmm8, xmm1
	paddq	xmm8, xmm10
	movaps	xmm10, xmm9
	pmuludq	xmm10, xmm2
	paddq	xmm10, xmm8
	movaps	xmm8, xmm14
	pmuludq	xmm8, xmm0
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp-0x78]
	pmuludq	xmm10, xmm15
	paddq	xmm10, xmm8
	movaps	xmm8, xmm13
	pmuludq	xmm8, xmm12
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp-0x48]
	pmuludq	xmm10, xmm6
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp-0x28]
	movaps	[rsp+0xb8], xmm8
	pslld	xmm10, 0x1
	pmuludq	xmm10, xmm3
	movaps	xmm8, [rsp-0x8]
	pmuludq	xmm8, xmm4
	paddq	xmm10, xmm8
	movaps	xmm8, [rsp-0x58]
	pmuludq	xmm4, [rsp+0x48]
	pmuludq	xmm8, xmm1
	paddq	xmm8, xmm10
	paddq	xmm11, xmm8
	movaps	xmm8, xmm9
	pmuludq	xmm8, xmm0
	paddq	xmm8, xmm11
	movaps	xmm11, [rsp-0x78]
	pmuludq	xmm7, xmm11
	paddq	xmm7, xmm8
	movaps	xmm8, xmm13
	pmuludq	xmm8, xmm15
	paddq	xmm8, xmm7
	movaps	xmm7, [rsp-0x48]
	pmuludq	xmm5, xmm7
	paddq	xmm5, xmm8
	movaps	xmm8, [rsp-0x18]
	movaps	xmm10, xmm8
	pmuludq	xmm10, xmm6
	paddq	xmm10, xmm5
	movaps	xmm5, [rsp-0x8]
	pmuludq	xmm5, xmm3
	paddq	xmm5, xmm4
	movaps	xmm4, [rsp-0x28]
	pmuludq	xmm4, xmm1
	paddq	xmm4, xmm5
	movaps	xmm5, [rsp-0x58]
	pmuludq	xmm5, xmm2
	paddq	xmm5, xmm4
	movaps	xmm4, [rsp-0x68]
	pmuludq	xmm4, xmm0
	paddq	xmm4, xmm5
	movaps	xmm5, xmm11
	movaps	xmm11, [rsp-0x38]
	pmuludq	xmm5, xmm9
	paddq	xmm5, xmm4
	movaps	xmm4, xmm13
	movaps	xmm13, [ed25519$packednineteen]
	pmuludq	xmm6, xmm11
	pmuludq	xmm4, xmm14
	paddq	xmm4, xmm5
	movaps	xmm5, xmm7
	pmuludq	xmm14, xmm13
	movaps	xmm7, [rsp-0x28]
	pmuludq	xmm9, xmm13
	pmuludq	xmm5, xmm15
	paddq	xmm5, xmm4
	movaps	xmm4, xmm8
	pmuludq	xmm7, xmm13
	movaps	xmm8, xmm7
	pslld	xmm7, 0x1
	pmuludq	xmm4, xmm12
	paddq	xmm4, xmm5
	paddq	xmm4, xmm6
	movaps	xmm6, xmm14
	pmuludq	xmm15, xmm13
	pmuludq	xmm12, xmm13
	movaps	[rsp+0xc8], xmm4
	pslld	xmm12, 0x1
	pslld	xmm6, 0x1
	movaps	[rsp+0x68], xmm6
	movaps	xmm6, [rsp-0x68]
	pmuludq	xmm6, xmm13
	movaps	xmm4, xmm6
	movaps	xmm5, [rsp-0x58]
	pslld	xmm4, 0x1
	movaps	[rsp+0x78], xmm6
	pmuludq	xmm5, xmm13
	movaps	[rsp-0x68], xmm4
	movaps	xmm4, [rsp-0x8]
	movaps	[rsp-0x58], xmm7
	pmuludq	xmm12, [rsp-0x38]
	pmuludq	xmm4, xmm13
	movaps	xmm11, [rsp-0x18]
	pmuludq	xmm11, xmm15
	paddq	xmm11, xmm12
	movaps	xmm12, [rsp+0x68]
	pmuludq	xmm15, [rsp-0x38]
	pmuludq	xmm12, [rsp-0x48]
	paddq	xmm12, xmm11
	movaps	xmm11, [rsp+0x58]
	pmuludq	xmm11, xmm9
	paddq	xmm11, xmm12
	movaps	xmm12, [rsp-0x68]
	pmuludq	xmm12, [rsp-0x78]
	paddq	xmm12, xmm11
	movaps	xmm11, xmm5
	movaps	xmm7, [rsp+0x48]
	pmuludq	xmm11, xmm0
	paddq	xmm11, xmm12
	movaps	xmm12, [rsp-0x58]
	pmuludq	xmm7, xmm13
	movaps	xmm6, xmm7
	pmuludq	xmm12, xmm2
	paddq	xmm12, xmm11
	movaps	xmm11, xmm4
	pslld	xmm6, 0x1
	pmuludq	xmm3, xmm6
	pmuludq	xmm11, xmm1
	paddq	xmm11, xmm12
	movaps	xmm12, [rsp-0x18]
	paddq	xmm3, xmm11
	paddq	xmm3, [rsp+0x8]
	pmuludq	xmm1, xmm7
	pmuludq	xmm14, xmm12
	paddq	xmm14, xmm15
	movaps	xmm15, [rsp-0x48]
	movaps	[rsp+0x8], xmm3
	movaps	xmm3, xmm15
	pmuludq	xmm3, xmm9
	paddq	xmm3, xmm14
	movaps	xmm11, [rsp+0x78]
	movaps	xmm14, [rsp+0x58]
	pmuludq	xmm11, xmm14
	paddq	xmm11, xmm3
	movaps	xmm3, [rsp-0x78]
	pmuludq	xmm3, xmm5
	paddq	xmm3, xmm11
	movaps	xmm11, xmm8
	pmuludq	xmm11, xmm0
	paddq	xmm11, xmm3
	movaps	xmm3, xmm4
	pmuludq	xmm3, xmm2
	paddq	xmm3, xmm11
	movaps	xmm11, [rsp-0x38]
	paddq	xmm1, xmm3
	paddq	xmm1, [rsp+0x18]
	pmuludq	xmm2, xmm6
	movaps	[rsp+0x18], xmm1
	movaps	xmm1, xmm12
	pmuludq	xmm1, xmm9
	pmuludq	xmm9, xmm11
	movaps	xmm3, [rsp+0x68]
	pmuludq	xmm3, xmm11
	paddq	xmm1, xmm3
	movaps	xmm3, [rsp-0x68]
	pmuludq	xmm3, xmm15
	paddq	xmm3, xmm1
	movaps	xmm1, xmm14
	pmuludq	xmm1, xmm5
	paddq	xmm1, xmm3
	movaps	xmm3, [rsp-0x58]
	pmuludq	xmm3, [rsp-0x78]
	paddq	xmm3, xmm1
	movaps	xmm1, xmm4
	pmuludq	xmm1, xmm0
	paddq	xmm1, xmm3
	paddq	xmm2, xmm1
	movaps	xmm1, xmm15
	paddq	xmm2, [rsp+0x28]
	pmuludq	xmm0, xmm7
	movaps	[rsp+0x28], xmm2
	pmuludq	xmm1, xmm5
	movaps	xmm3, xmm15
	movaps	xmm15, xmm11
	movaps	xmm2, [rsp+0x78]
	pmuludq	xmm2, xmm12
	paddq	xmm2, xmm9
	paddq	xmm1, xmm2
	movaps	xmm2, xmm14
	movaps	xmm9, xmm12
	pmuludq	xmm2, xmm8
	paddq	xmm2, xmm1
	movaps	xmm1, [rsp-0x78]
	pmuludq	xmm8, xmm9
	pmuludq	xmm1, xmm4
	paddq	xmm1, xmm2
	paddq	xmm0, xmm1
	paddq	xmm0, [rsp+0x38]
	movaps	[rsp+0x38], xmm0
	movaps	xmm0, [rsp-0x68]
	pmuludq	xmm0, xmm11
	movaps	xmm1, xmm0
	movaps	xmm0, xmm12
	movaps	xmm12, [rsp-0x58]
	movaps	xmm2, xmm12
	pmuludq	xmm0, xmm5
	paddq	xmm0, xmm1
	pmuludq	xmm5, xmm15
	paddq	xmm8, xmm5
	movaps	xmm5, xmm3
	pmuludq	xmm2, xmm3
	movaps	xmm1, xmm2
	movaps	xmm2, xmm14
	pmuludq	xmm5, xmm6
	paddq	xmm1, xmm0
	movaps	xmm0, xmm14
	pmuludq	xmm2, xmm7
	movaps	xmm14, xmm9
	movaps	xmm9, [rsp+0x98]
	pmuludq	xmm0, xmm4
	paddq	xmm0, xmm1
	movaps	xmm1, [rsp-0x78]
	pmuludq	xmm1, xmm6
	paddq	xmm1, xmm0
	movaps	xmm0, [rsp+0x88]
	paddq	xmm0, xmm1
	movaps	xmm1, xmm2
	movaps	xmm11, xmm0
	movaps	xmm0, xmm3
	movaps	xmm2, xmm14
	pmuludq	xmm0, xmm4
	paddq	xmm0, xmm8
	paddq	xmm1, xmm0
	movaps	xmm0, xmm12
	paddq	xmm9, xmm1
	pmuludq	xmm7, xmm2
	movaps	xmm3, xmm15
	pmuludq	xmm0, xmm15
	movaps	xmm1, xmm0
	movaps	xmm0, xmm14
	pmuludq	xmm6, xmm3
	paddq	xmm10, xmm6
	movaps	xmm3, [ed25519$packedmask26]
	pmuludq	xmm0, xmm4
	paddq	xmm0, xmm1
	movaps	xmm1, xmm5
	movaps	xmm5, [rsp+0xa8]
	pmuludq	xmm4, xmm15
	paddq	xmm7, xmm4
	paddq	xmm1, xmm0
	movaps	xmm0, xmm11
	paddq	xmm7, [rsp+0xb8]
	paddq	xmm5, xmm1
	movaps	xmm1, [rsp+0x8]
	movaps	xmm14, xmm5
	psrlq	xmm0, 0x1a
	paddq	xmm0, xmm9
	movaps	xmm15, xmm7
	movaps	xmm2, xmm1
	pand	xmm3, xmm11
	pand	xmm1, [ed25519$packedmask26]
	psrlq	xmm2, 0x1a
	paddq	xmm2, [rsp+0x18]
	movaps	xmm5, xmm2
	movaps	xmm4, xmm2
	movaps	xmm2, xmm0
	pand	xmm5, [ed25519$packedmask25]
	psrlq	xmm4, 0x19
	psrlq	xmm2, 0x19
	paddq	xmm4, [rsp+0x28]
	paddq	xmm2, xmm14
	movaps	xmm7, xmm4
	movaps	xmm6, xmm4
	movaps	xmm4, xmm2
	pand	xmm7, [ed25519$packedmask26]
	psrlq	xmm6, 0x1a
	psrlq	xmm4, 0x1a
	paddq	xmm6, [rsp+0x38]
	paddq	xmm4, xmm15
	movaps	xmm9, xmm6
	movaps	xmm8, xmm6
	movaps	xmm6, xmm4
	pand	xmm9, [ed25519$packedmask25]
	psrlq	xmm6, 0x19
	paddq	xmm10, xmm6
	movaps	xmm6, xmm10
	pand	xmm10, [ed25519$packedmask26]
	psrlq	xmm8, 0x19
	paddq	xmm3, xmm8
	psrlq	xmm6, 0x1a
	paddq	xmm6, [rsp+0xc8]
	pand	xmm0, [ed25519$packedmask25]
	pand	xmm4, [ed25519$packedmask25]
	movaps	xmm8, xmm10
	movaps	xmm10, xmm6
	pand	xmm2, [ed25519$packedmask26]
	movaps	xmm12, xmm8
	psrlq	xmm10, 0x19
	pmuludq	xmm10, xmm13
	paddq	xmm1, xmm10
	movaps	xmm11, xmm1
	pand	xmm1, [ed25519$packedmask26]
	movaps	xmm10, xmm3
	psrlq	xmm11, 0x1a
	paddq	xmm5, xmm11
	pand	xmm3, [ed25519$packedmask26]
	psrlq	xmm10, 0x1a
	paddq	xmm0, xmm10
	movaps	xmm10, xmm7
	punpckhdq xmm7, xmm9
	movaps	xmm11, xmm1
	punpckhdq xmm1, xmm5
	punpckldq xmm10, xmm9
	punpckldq xmm11, xmm5
	movaps	xmm5, xmm1
	pand	xmm6, [ed25519$packedmask25]
	movaps	xmm14, xmm11
	punpcklqdq xmm5, xmm7
	movaps	xmm11, xmm3
	punpckhdq xmm3, xmm0
	punpcklqdq xmm14, xmm10
	movaps	xmm10, xmm2
	punpckldq xmm11, xmm0
	punpckhdq xmm2, xmm4
	movaps	xmm7, xmm5
	movaps	xmm5, xmm3
	punpckldq xmm10, xmm4
	movaps	xmm15, xmm11
	punpcklqdq xmm5, xmm2
	movaps	[rsp+0xa8], xmm7
	punpcklqdq xmm15, xmm10
	movaps	xmm1, xmm5
	movaps	xmm5, xmm8
	movaps	[rsp+0x48], xmm14
	movaps	xmm0, xmm7
	punpckhdq xmm5, xmm6
	movaps	[rsp+0x58], xmm15
	paddd	xmm0, [rsp+0x48]
	movaps	xmm2, xmm0
	movaps	xmm0, xmm1
	punpckldq xmm12, xmm6
	movaps	[rsp+0xb8], xmm1
	paddd	xmm0, [rsp+0x58]
	movaps	xmm1, xmm0
	movaps	xmm0, xmm5
	movaps	[rdi+0x30], xmm2
	paddd	xmm0, xmm12
	movaps	[rdi+0x40], xmm1
	movaps	[rdi+0x50], xmm0
	movaps	[rsp+0xc8], xmm5
	movaps	[rsp+0x68], xmm12
	movaps	xmm15, [rsi+0x60]
	movaps	xmm1, [rsi+0x90]
	movaps	xmm4, xmm15
	movaps	xmm5, [rsi+0x70]
	punpckhqdq xmm15, xmm1
	punpcklqdq xmm4, xmm1
	movaps	xmm11, [rsi+0x80]
	movaps	xmm9, xmm5
	movaps	xmm3, xmm15
	punpcklqdq xmm11, [rsi+0xb0]
	movaps	xmm6, xmm4
	movaps	xmm0, [rsi+0xa0]
	psrlq	xmm3, 0x20
	movaps	xmm14, xmm3
	psrlq	xmm6, 0x20
	movaps	xmm12, xmm6
	movaps	xmm1, [rdx+0x60]
	punpcklqdq xmm9, xmm0
	punpckhqdq xmm5, xmm0
	movaps	xmm10, xmm1
	movaps	xmm0, [rdx+0x90]
	movaps	xmm3, xmm11
	movaps	xmm2, xmm9
	punpckhqdq xmm1, xmm0
	punpcklqdq xmm10, xmm0
	movaps	xmm7, [rdx+0x70]
	psrlq	xmm3, 0x20
	movaps	xmm6, xmm5
	psrlq	xmm2, 0x20
	movaps	[rsp-0x48], xmm5
	movaps	xmm5, xmm10
	psrlq	xmm6, 0x20
	movaps	[rsp+0x78], xmm3
	movaps	xmm3, xmm10
	movaps	xmm10, xmm1
	movaps	[rsp-0x58], xmm2
	psrlq	xmm3, 0x20
	psrlq	xmm10, 0x20
	movaps	xmm2, xmm10
	movaps	[rsp-0x28], xmm6
	movaps	xmm10, xmm7
	movaps	xmm6, [rdx+0xa0]
	punpcklqdq xmm10, xmm6
	punpckhqdq xmm7, xmm6
	movaps	xmm0, xmm10
	psrlq	xmm10, 0x20
	movaps	[rsp-0x78], xmm10
	movaps	xmm6, xmm7
	movaps	[rsp-0x68], xmm7
	psrlq	xmm6, 0x20
	movaps	[rsp-0x38], xmm6
	movaps	xmm6, xmm12
	pmuludq	xmm6, xmm5
	movaps	xmm10, [rdx+0x80]
	punpcklqdq xmm10, [rdx+0xb0]
	movaps	xmm8, xmm10
	movaps	[rsp-0x18], xmm10
	psrlq	xmm8, 0x20
	movaps	xmm10, xmm4
	movaps	[rsp-0x8], xmm8
	movaps	xmm8, xmm4
	pmuludq	xmm10, xmm5
	movaps	[rsp+0x8], xmm10
	pmuludq	xmm8, xmm3
	paddq	xmm6, xmm8
	movaps	xmm8, xmm12
	movaps	[rsp+0x18], xmm6
	pslld	xmm8, 0x1
	movaps	xmm6, xmm8
	movaps	xmm8, xmm15
	movaps	xmm7, xmm6
	pmuludq	xmm8, xmm5
	pmuludq	xmm7, xmm3
	paddq	xmm7, xmm8
	movaps	xmm8, xmm4
	pmuludq	xmm8, xmm1
	paddq	xmm7, xmm8
	movaps	xmm8, xmm14
	movaps	[rsp+0x28], xmm7
	pmuludq	xmm8, xmm5
	movaps	xmm7, xmm8
	movaps	xmm8, xmm15
	pmuludq	xmm8, xmm3
	paddq	xmm8, xmm7
	movaps	xmm7, xmm12
	pmuludq	xmm7, xmm1
	paddq	xmm7, xmm8
	movaps	xmm8, xmm4
	movaps	xmm10, xmm7
	pmuludq	xmm8, xmm2
	paddq	xmm10, xmm8
	movaps	xmm8, xmm14
	movaps	[rsp+0x38], xmm10
	movaps	xmm10, xmm9
	pslld	xmm8, 0x1
	movaps	xmm7, xmm8
	pmuludq	xmm8, xmm3
	pmuludq	xmm10, xmm5
	paddq	xmm8, xmm10
	movaps	xmm10, xmm15
	pmuludq	xmm10, xmm1
	paddq	xmm10, xmm8
	movaps	xmm8, xmm6
	pmuludq	xmm8, xmm2
	paddq	xmm8, xmm10
	movaps	xmm10, xmm4
	pmuludq	xmm10, xmm0
	paddq	xmm8, xmm10
	movaps	xmm10, xmm9
	movaps	[rsp+0xd8], xmm8
	pmuludq	xmm10, xmm3
	movaps	xmm8, [rsp-0x58]
	pmuludq	xmm8, xmm5
	paddq	xmm10, xmm8
	movaps	xmm8, xmm14
	pmuludq	xmm8, xmm1
	paddq	xmm8, xmm10
	movaps	xmm10, xmm15
	pmuludq	xmm10, xmm2
	paddq	xmm10, xmm8
	movaps	xmm8, xmm12
	pmuludq	xmm8, xmm0
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp-0x78]
	pmuludq	xmm10, xmm4
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp-0x48]
	movaps	[rsp+0xe8], xmm8
	pmuludq	xmm10, xmm5
	movaps	xmm8, [rsp-0x58]
	pslld	xmm8, 0x1
	movaps	[rsp+0x88], xmm8
	pmuludq	xmm8, xmm3
	paddq	xmm8, xmm10
	movaps	xmm10, xmm9
	pmuludq	xmm10, xmm1
	paddq	xmm10, xmm8
	movaps	xmm8, xmm7
	pmuludq	xmm7, [rsp-0x78]
	pmuludq	xmm8, xmm2
	paddq	xmm8, xmm10
	movaps	xmm10, xmm15
	pmuludq	xmm10, xmm0
	paddq	xmm10, xmm8
	movaps	xmm8, [rsp-0x78]
	pmuludq	xmm8, xmm6
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp-0x68]
	pmuludq	xmm10, xmm4
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp-0x48]
	movaps	[rsp+0xf8], xmm8
	pmuludq	xmm10, xmm3
	movaps	xmm8, [rsp-0x28]
	pmuludq	xmm8, xmm5
	paddq	xmm10, xmm8
	movaps	xmm8, [rsp-0x58]
	pmuludq	xmm8, xmm1
	paddq	xmm8, xmm10
	movaps	xmm10, xmm9
	pmuludq	xmm10, xmm2
	paddq	xmm10, xmm8
	movaps	xmm8, xmm14
	pmuludq	xmm8, xmm0
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp-0x78]
	pmuludq	xmm10, xmm15
	paddq	xmm10, xmm8
	movaps	xmm8, [rsp-0x68]
	pmuludq	xmm8, xmm12
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp-0x38]
	pmuludq	xmm10, xmm4
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp-0x28]
	movaps	[rsp+0x108], xmm8
	pslld	xmm10, 0x1
	pmuludq	xmm10, xmm3
	movaps	xmm8, xmm11
	pmuludq	xmm8, xmm5
	paddq	xmm10, xmm8
	pmuludq	xmm5, [rsp+0x78]
	movaps	xmm8, [rsp-0x48]
	pmuludq	xmm8, xmm1
	paddq	xmm8, xmm10
	movaps	xmm10, [rsp+0x88]
	pmuludq	xmm10, xmm2
	paddq	xmm10, xmm8
	movaps	xmm8, xmm9
	pmuludq	xmm8, xmm0
	paddq	xmm8, xmm10
	paddq	xmm7, xmm8
	movaps	xmm8, [rsp-0x68]
	pmuludq	xmm8, xmm15
	paddq	xmm8, xmm7
	movaps	xmm7, [rsp-0x38]
	pmuludq	xmm6, xmm7
	paddq	xmm6, xmm8
	movaps	xmm8, [rsp-0x18]
	movaps	xmm10, xmm8
	pmuludq	xmm10, xmm4
	paddq	xmm10, xmm6
	movaps	xmm6, xmm11
	pmuludq	xmm4, [rsp-0x8]
	pmuludq	xmm11, xmm13
	pmuludq	xmm6, xmm3
	paddq	xmm6, xmm5
	movaps	xmm5, [rsp-0x28]
	pmuludq	xmm5, xmm1
	paddq	xmm5, xmm6
	movaps	xmm6, [rsp-0x48]
	pmuludq	xmm6, xmm2
	paddq	xmm6, xmm5
	movaps	xmm5, [rsp-0x58]
	pmuludq	xmm5, xmm0
	paddq	xmm5, xmm6
	movaps	xmm6, [rsp-0x78]
	pmuludq	xmm6, xmm9
	paddq	xmm6, xmm5
	movaps	xmm5, [rsp-0x68]
	pmuludq	xmm9, xmm13
	pmuludq	xmm5, xmm14
	paddq	xmm5, xmm6
	movaps	xmm6, xmm7
	pmuludq	xmm14, xmm13
	pmuludq	xmm6, xmm15
	paddq	xmm6, xmm5
	movaps	xmm5, xmm8
	pmuludq	xmm15, xmm13
	pmuludq	xmm5, xmm12
	paddq	xmm5, xmm6
	paddq	xmm5, xmm4
	movaps	xmm4, xmm14
	pmuludq	xmm12, xmm13
	pslld	xmm12, 0x1
	movaps	[rsp+0x118], xmm5
	pslld	xmm4, 0x1
	movaps	[rsp+0x88], xmm4
	pmuludq	xmm12, [rsp-0x8]
	movaps	xmm4, [rsp-0x58]
	movaps	xmm6, [rsp-0x48]
	pmuludq	xmm4, xmm13
	pmuludq	xmm6, xmm13
	movaps	xmm8, [rsp-0x28]
	movaps	xmm5, xmm6
	movaps	xmm6, xmm4
	movaps	[rsp+0x98], xmm4
	pmuludq	xmm8, xmm13
	movaps	xmm4, xmm11
	pslld	xmm6, 0x1
	movaps	[rsp-0x58], xmm6
	movaps	xmm6, xmm8
	pslld	xmm6, 0x1
	movaps	[rsp-0x48], xmm6
	movaps	xmm11, [rsp+0x78]
	pmuludq	xmm11, xmm13
	movaps	xmm7, xmm11
	pslld	xmm11, 0x1
	movaps	xmm6, xmm11
	movaps	xmm11, [rsp-0x18]
	pmuludq	xmm11, xmm15
	paddq	xmm11, xmm12
	movaps	xmm12, [rsp+0x88]
	pmuludq	xmm15, [rsp-0x8]
	pmuludq	xmm3, xmm6
	pmuludq	xmm12, [rsp-0x38]
	paddq	xmm12, xmm11
	movaps	xmm11, [rsp-0x68]
	pmuludq	xmm11, xmm9
	paddq	xmm11, xmm12
	movaps	xmm12, [rsp-0x58]
	pmuludq	xmm12, [rsp-0x78]
	paddq	xmm12, xmm11
	movaps	xmm11, xmm5
	pmuludq	xmm11, xmm0
	paddq	xmm11, xmm12
	movaps	xmm12, [rsp-0x48]
	pmuludq	xmm12, xmm2
	paddq	xmm12, xmm11
	movaps	xmm11, xmm4
	pmuludq	xmm11, xmm1
	paddq	xmm11, xmm12
	movaps	xmm12, [rsp-0x18]
	paddq	xmm3, xmm11
	paddq	xmm3, [rsp+0x8]
	pmuludq	xmm1, xmm7
	pmuludq	xmm14, xmm12
	paddq	xmm14, xmm15
	movaps	xmm15, [rsp-0x38]
	movaps	[rsp+0x8], xmm3
	movaps	xmm3, xmm15
	pmuludq	xmm3, xmm9
	paddq	xmm3, xmm14
	movaps	xmm11, [rsp+0x98]
	movaps	xmm14, [rsp-0x68]
	pmuludq	xmm11, xmm14
	paddq	xmm11, xmm3
	movaps	xmm3, [rsp-0x78]
	pmuludq	xmm3, xmm5
	paddq	xmm3, xmm11
	movaps	xmm11, xmm8
	pmuludq	xmm11, xmm0
	paddq	xmm11, xmm3
	movaps	xmm3, xmm4
	pmuludq	xmm3, xmm2
	paddq	xmm3, xmm11
	paddq	xmm1, xmm3
	movaps	xmm3, [rsp+0x18]
	pmuludq	xmm2, xmm6
	movaps	xmm11, [rsp-0x8]
	paddq	xmm3, xmm1
	movaps	xmm1, xmm12
	movaps	[rsp+0x18], xmm3
	pmuludq	xmm1, xmm9
	pmuludq	xmm9, xmm11
	movaps	xmm3, [rsp+0x88]
	pmuludq	xmm3, xmm11
	paddq	xmm1, xmm3
	movaps	xmm3, [rsp-0x58]
	pmuludq	xmm3, xmm15
	paddq	xmm3, xmm1
	movaps	xmm1, xmm14
	pmuludq	xmm1, xmm5
	paddq	xmm1, xmm3
	movaps	xmm3, [rsp-0x48]
	pmuludq	xmm3, [rsp-0x78]
	paddq	xmm3, xmm1
	movaps	xmm1, xmm4
	pmuludq	xmm1, xmm0
	paddq	xmm1, xmm3
	paddq	xmm2, xmm1
	paddq	xmm2, [rsp+0x28]
	movaps	[rsp+0x28], xmm2
	pmuludq	xmm0, xmm7
	movaps	xmm3, xmm15
	movaps	xmm2, [rsp+0x98]
	pmuludq	xmm2, xmm12
	paddq	xmm2, xmm9
	movaps	xmm9, xmm15
	movaps	xmm15, xmm12
	pmuludq	xmm9, xmm5
	movaps	xmm1, xmm9
	movaps	xmm9, [rsp-0x78]
	paddq	xmm1, xmm2
	movaps	xmm2, xmm14
	pmuludq	xmm9, xmm4
	pmuludq	xmm2, xmm8
	paddq	xmm2, xmm1
	movaps	xmm1, xmm9
	movaps	xmm9, [rsp+0x38]
	pmuludq	xmm8, xmm15
	paddq	xmm1, xmm2
	paddq	xmm0, xmm1
	paddq	xmm9, xmm0
	movaps	[rsp+0x38], xmm9
	movaps	xmm9, xmm11
	movaps	xmm2, [rsp-0x58]
	pmuludq	xmm2, xmm11
	movaps	xmm11, xmm12
	movaps	xmm12, [rsp-0x48]
	pmuludq	xmm11, xmm5
	movaps	xmm0, xmm11
	pmuludq	xmm5, xmm9
	movaps	xmm11, xmm12
	paddq	xmm8, xmm5
	movaps	xmm5, xmm3
	paddq	xmm0, xmm2
	movaps	xmm2, xmm14
	pmuludq	xmm11, xmm3
	movaps	xmm1, xmm11
	movaps	xmm11, xmm14
	movaps	xmm14, xmm15
	paddq	xmm1, xmm0
	pmuludq	xmm11, xmm4
	movaps	xmm0, xmm11
	movaps	xmm11, [rsp-0x78]
	paddq	xmm0, xmm1
	pmuludq	xmm11, xmm6
	movaps	xmm1, xmm11
	paddq	xmm1, xmm0
	movaps	xmm0, xmm3
	paddq	xmm1, [rsp+0xd8]
	movaps	xmm11, xmm1
	movaps	xmm3, xmm9
	pmuludq	xmm0, xmm4
	paddq	xmm0, xmm8
	movaps	xmm8, xmm2
	pmuludq	xmm8, xmm7
	movaps	xmm1, xmm8
	pmuludq	xmm7, xmm14
	movaps	xmm8, xmm12
	paddq	xmm1, xmm0
	paddq	xmm1, [rsp+0xe8]
	movaps	xmm15, xmm1
	pmuludq	xmm8, xmm9
	movaps	xmm9, xmm14
	pmuludq	xmm9, xmm4
	pmuludq	xmm4, xmm3
	paddq	xmm7, xmm4
	movaps	xmm4, [rsp+0x108]
	movaps	xmm0, xmm9
	movaps	xmm9, xmm5
	paddq	xmm4, xmm7
	movaps	xmm7, [rsp+0x8]
	pmuludq	xmm9, xmm6
	movaps	xmm1, xmm9
	paddq	xmm0, xmm8
	movaps	xmm2, xmm7
	pand	xmm7, [ed25519$packedmask26]
	pmuludq	xmm6, xmm3
	paddq	xmm1, xmm0
	paddq	xmm1, [rsp+0xf8]
	movaps	xmm9, xmm1
	movaps	xmm1, xmm11
	movaps	xmm8, xmm4
	psrlq	xmm2, 0x1a
	paddq	xmm2, [rsp+0x18]
	movaps	xmm4, xmm2
	paddq	xmm10, xmm6
	psrlq	xmm1, 0x1a
	paddq	xmm1, xmm15
	movaps	xmm3, [ed25519$packedmask26]
	movaps	xmm0, xmm7
	movaps	xmm7, xmm1
	psrlq	xmm4, 0x19
	movaps	xmm1, xmm2
	paddq	xmm4, [rsp+0x28]
	movaps	xmm2, xmm7
	pand	xmm7, [ed25519$packedmask25]
	movaps	xmm6, xmm4
	psrlq	xmm2, 0x19
	paddq	xmm2, xmm9
	pand	xmm3, xmm11
	psrlq	xmm6, 0x1a
	paddq	xmm6, [rsp+0x38]
	pand	xmm1, [ed25519$packedmask25]
	movaps	xmm5, xmm7
	movaps	xmm7, xmm2
	movaps	xmm2, xmm4
	movaps	xmm4, xmm7
	pand	xmm2, [ed25519$packedmask26]
	psrlq	xmm4, 0x1a
	paddq	xmm4, xmm8
	movaps	xmm9, xmm4
	psrlq	xmm4, 0x19
	paddq	xmm10, xmm4
	movaps	xmm4, xmm10
	pand	xmm10, [ed25519$packedmask26]
	movaps	xmm8, xmm6
	psrlq	xmm4, 0x1a
	paddq	xmm4, [rsp+0x118]
	psrlq	xmm8, 0x19
	paddq	xmm3, xmm8
	pand	xmm6, [ed25519$packedmask25]
	pand	xmm7, [ed25519$packedmask26]
	movaps	xmm8, xmm10
	movaps	xmm10, xmm4
	pand	xmm9, [ed25519$packedmask25]
	psrlq	xmm10, 0x19
	pmuludq	xmm10, xmm13
	paddq	xmm0, xmm10
	movaps	xmm11, xmm0
	movaps	xmm10, [ed25519$packedmask26]
	psrlq	xmm11, 0x1a
	movaps	xmm12, xmm11
	movaps	xmm11, xmm3
	pand	xmm10, xmm0
	psrlq	xmm11, 0x1a
	paddq	xmm5, xmm11
	movaps	xmm11, xmm2
	paddq	xmm1, xmm12
	pand	xmm3, [ed25519$packedmask26]
	punpckldq xmm11, xmm6
	pand	xmm4, [ed25519$packedmask25]
	movaps	xmm0, xmm11
	movaps	xmm11, xmm10
	punpckhdq xmm2, xmm6
	movaps	xmm6, [ed25519$sse2_bot32bitmask]
	punpckldq xmm11, xmm1
	punpckhdq xmm10, xmm1
	movaps	xmm12, xmm11
	movaps	xmm11, xmm7
	punpckhdq xmm7, xmm9
	punpcklqdq xmm12, xmm0
	punpckldq xmm11, xmm9
	punpcklqdq xmm10, xmm2
	movaps	xmm2, [ed25519$sse2_bot32bitmask]
	paddd	xmm12, xmm12
	movaps	xmm0, xmm11
	movaps	xmm11, xmm3
	punpckhdq xmm3, xmm5
	punpckldq xmm11, xmm5
	pxor	xmm5, xmm5
	punpcklqdq xmm3, xmm7
	punpcklqdq xmm11, xmm0
	movaps	xmm0, xmm8
	punpckhdq xmm8, xmm4
	punpckldq xmm0, xmm4
	movaps	xmm4, xmm12
	paddd	xmm11, xmm11
	punpckhqdq xmm12, xmm11
	punpcklqdq xmm4, xmm11
	movaps	xmm9, xmm5
	paddd	xmm0, xmm0
	punpcklqdq xmm9, xmm0
	pand	xmm6, xmm4
	psrlq	xmm4, 0x20
	movaps	xmm1, xmm9
	movaps	xmm7, xmm6
	movaps	xmm6, [ed25519$sse2_bot32bitmask]
	pand	xmm2, xmm9
	psrlq	xmm1, 0x20
	pand	xmm6, xmm12
	movaps	xmm9, xmm7
	psrlq	xmm12, 0x20
	pand	xmm7, [ed25519$packedmask26]
	psrlq	xmm9, 0x1a
	paddq	xmm4, xmm9
	movaps	xmm9, xmm4
	movaps	xmm11, xmm6
	pand	xmm6, [ed25519$packedmask26]
	psrlq	xmm9, 0x19
	psrlq	xmm11, 0x1a
	paddq	xmm12, xmm11
	movaps	xmm11, xmm12
	pand	xmm4, [ed25519$packedmask25]
	psrlq	xmm11, 0x19
	paddq	xmm2, xmm11
	movaps	xmm0, xmm11
	paddq	xmm6, xmm9
	movaps	xmm9, xmm2
	pand	xmm12, [ed25519$packedmask25]
	pslldq	xmm0, 0x8
	psrlq	xmm9, 0x1a
	paddq	xmm1, xmm9
	movaps	xmm9, xmm1
	pand	xmm2, [ed25519$packedmask26]
	psrlq	xmm9, 0x19
	pmuludq	xmm9, xmm13
	movaps	xmm13, xmm6
	punpckhqdq xmm9, xmm0
	pand	xmm6, [ed25519$packedmask26]
	psrlq	xmm13, 0x1a
	paddq	xmm12, xmm13
	paddq	xmm7, xmm9
	movaps	xmm9, xmm7
	pand	xmm7, [ed25519$packedmask26]
	psrlq	xmm9, 0x1a
	paddq	xmm4, xmm9
	pand	xmm1, [ed25519$packedmask25]
	movaps	xmm13, xmm6
	punpckhdq xmm6, xmm12
	movaps	xmm9, xmm7
	punpckldq xmm13, xmm12
	punpckhdq xmm7, xmm4
	punpckldq xmm9, xmm4
	punpckhdq xmm2, xmm1
	punpcklqdq xmm7, xmm6
	punpcklqdq xmm9, xmm13
	movaps	[rdi+0x90], xmm9
	movaps	[rdi+0xa0], xmm7
	movaps	[rdi+0x60], xmm9
	movaps	[rdi+0x70], xmm7
	movaps	[rdi+0xb0], xmm2
	movaps	[rdi+0x80], xmm2
	movaps	xmm6, [rax+0x10]
	movaps	xmm2, [rax]
	paddd	xmm6, xmm3
	movaps	xmm1, xmm6
	movaps	xmm6, [rax+0x20]
	paddd	xmm2, xmm10
	movaps	[rax+0x10], xmm1
	paddd	xmm6, xmm8
	movaps	[rax], xmm2
	movaps	[rax+0x20], xmm6
	movzx	eax, r9b
	lea	rax, [rax+rax*2+0x6]
	movaps	xmm2, [rsp+0xa8]
	shl	rax, 0x4
	add	rax, rdi
	movaps	xmm0, [rax]
	movaps	xmm6, xmm2
	movaps	xmm1, [rsp+0xb8]
	punpckldq xmm6, xmm0
	punpckhdq xmm2, xmm0
	movaps	xmm4, xmm1
	movaps	xmm0, [rax+0x10]
	paddd	xmm6, [ed25519$packed32packed2p0]
	movaps	xmm14, [rsp+0x48]
	punpckldq xmm4, xmm0
	punpckhdq xmm1, xmm0
	movaps	xmm0, [rsp+0xc8]
	movaps	xmm11, xmm14
	movaps	xmm15, [rsp+0x58]
	movaps	xmm13, xmm14
	punpckldq xmm0, [rax+0x20]
	movaps	xmm7, [rsp+0x68]
	movaps	xmm9, xmm15
	punpckldq xmm11, xmm10
	punpckhdq xmm13, xmm10
	movaps	xmm10, xmm15
	punpckldq xmm7, xmm8
	punpckhdq xmm9, xmm3
	psubd	xmm6, xmm11
	movaps	xmm8, xmm6
	punpckldq xmm10, xmm3
	movaps	xmm3, [ed25519$packed32packed2p1]
	paddd	xmm2, xmm3
	paddd	xmm0, xmm3
	psubd	xmm2, xmm13
	psubd	xmm0, xmm7
	movaps	xmm7, xmm2
	paddd	xmm4, xmm3
	paddd	xmm1, xmm3
	psubd	xmm4, xmm10
	psubd	xmm1, xmm9
	punpcklqdq xmm8, xmm4
	punpcklqdq xmm7, xmm1
	punpckhqdq xmm6, xmm4
	punpckhqdq xmm2, xmm1
	movaps	xmm4, xmm8
	movaps	xmm1, [ed25519$packedmask26262626]
	movaps	xmm3, xmm7
	psrld	xmm4, 0x1a
	paddd	xmm4, xmm6
	pand	xmm7, xmm1
	psrld	xmm3, 0x1a
	paddd	xmm3, xmm2
	movaps	xmm6, xmm3
	pand	xmm8, xmm1
	movaps	xmm1, xmm4
	psrld	xmm6, 0x19
	movaps	xmm2, xmm6
	pslldq	xmm6, 0x8
	movaps	xmm9, xmm7
	movaps	xmm7, [ed25519$packedmask25252525]
	psrld	xmm1, 0x19
	psrldq	xmm2, 0x8
	paddd	xmm0, xmm2
	movaps	xmm2, xmm8
	pand	xmm4, xmm7
	paddd	xmm1, xmm9
	pand	xmm3, xmm7
	paddd	xmm2, xmm6
	movaps	xmm7, xmm2
	movaps	xmm6, xmm1
	punpcklqdq xmm7, xmm4
	punpcklqdq xmm6, xmm3
	punpckhqdq xmm2, xmm4
	pshufd	xmm4, xmm7, 0xd8
	punpckhqdq xmm1, xmm3
	pshufd	xmm3, xmm6, 0xd8
	movaps	xmm6, xmm4
	pshufd	xmm2, xmm2, 0xd8
	pshufd	xmm1, xmm1, 0xd8
	punpcklqdq xmm6, xmm3
	pshufd	xmm0, xmm0, 0xd8
	punpckhqdq xmm4, xmm3
	movaps	[rdi], xmm6
	movaps	xmm6, xmm2
	punpckhqdq xmm2, xmm1
	punpcklqdq xmm6, xmm1
	movaps	[rdi+0x10], xmm6
	movaps	xmm6, xmm0
	punpckhqdq xmm0, xmm5
	punpcklqdq xmm6, xmm5
	movaps	[rdi+0x20], xmm6
	movaps	[rax], xmm4
	movaps	[rax+0x10], xmm2
	movaps	[rax+0x20], xmm0
	add	rsp, 0x130
	ret

end if

if used ed25519$expand256_modm32 | defined include_everything
	; two arguments: rdi == destination, rsi == source
falign
ed25519$expand256_modm32:
	prolog	ed25519$expand256_modm32
	push	rbp rbx r12
	mov	r11, rdi
	mov	r10, [rsi]
	mov	r9, [rsi+0x18]
	push	r13 r14 r15
	sub	rsp, 0x78
	xor	edx, edx
	mov	eax, r10d
	mov	r8d, r10d
	mov	rcx, [rsi+0x8]
	mov	[rsp+0x8], rdx
	mov	[rsp+0x10], rdx
	mov	[rsp+0x18], rdx
	shr	eax, 0x10
	and	r8d, 0xff00
	mov	[rsp+0x20], rdx
	mov	[rsp+0x30], r10
	mov	[rsp+0x50], rdx
	mov	r14d, eax
	mov	eax, r10d
	mov	[rsp+0x58], rdx
	mov	[rsp+0x60], rdx
	mov	[rsp+0x68], rdx
	mov	edx, r9d
	shr	eax, 0x18
	movzx	r14d, r14b
	shr	edx, 0x18
	mov	r15d, eax
	mov	eax, ecx
	shl	r14, 0x10
	shr	eax, 0x10
	or	r8, r14
	mov	[rsp+0x38], rcx
	mov	r13d, eax
	mov	eax, ecx
	movzx	edx, dl
	shr	eax, 0x18
	mov	[rsp+0x48], r9
	mov	ebp, eax
	mov	rax, [rsi+0x10]
	movzx	esi, r10b
	or	r8, rsi
	movzx	esi, r15b
	movzx	ebp, bpl
	shl	rsi, 0x18
	shl	rbp, 0x18
	or	r8, rsi
	
	mov	rsi, 0xff00000000
	mov	edi, eax
	and	rsi, r10
	shr	edi, 0x18
	mov	ebx, eax
	or	r8, rsi

	mov	rsi, 0xff0000000000
	mov	r12d, edi
	and	rsi, r10
	mov	edi, r9d
	shr	ebx, 0x10
	or	r8, rsi

	mov	rsi, 0xff000000000000
	shr	edi, 0x10
	and	rsi, r10
	shr	r10, 0x38
	movzx	ebx, bl
	or	r8, rsi
	shl	r10, 0x38
	mov	rsi, rcx
	or	r8, r10
	movzx	r10d, r13b
	and	esi, 0xff00
	shl	r10, 0x10
	mov	[rsp+0x40], rax
	movzx	edi, dil
	or	rsi, r10
	movzx	r10d, cl
	or	rsi, r10

	mov	r10, 0xff00000000
	and	r10, rcx
	or	rsi, rbp
	or	rsi, r10

	mov	r10, 0xff0000000000
	and	r10, rcx
	shl	rbx, 0x10
	shl	rdi, 0x10
	or	rsi, r10

	mov	r10, 0xff000000000000
	shl	rdx, 0x18
	and	r10, rcx
	shr	rcx, 0x38
	or	rsi, r10
	shl	rcx, 0x38
	movzx	r10d, al
	or	rsi, rcx
	mov	rcx, rax
	and	ecx, 0xff00
	or	rcx, rbx
	or	rcx, r10
	movzx	r10d, r12b
	shl	r10, 0x18
	or	rcx, r10

	mov	r10, 0xff00000000
	and	r10, rax
	or	rcx, r10

	mov	r10, 0xff0000000000
	and	r10, rax
	or	rcx, r10

	mov	r10, 0xff000000000000
	and	r10, rax
	shr	rax, 0x38
	or	rcx, r10
	shl	rax, 0x38
	or	rcx, rax
	mov	rax, r9
	and	eax, 0xff00
	or	rax, rdi
	movzx	edi, r9b
	or	rax, rdi
	
	mov	rdi, 0xffffffffffffff
	or	rax, rdx

	mov	rdx, 0xff00000000
	and	rdx, r9
	or	rax, rdx

	mov	rdx, 0xff0000000000
	and	rdx, r9
	or	rax, rdx

	mov	rdx, 0xff000000000000
	and	rdx, r9
	or	rax, rdx

	mov	rdx, r8
	shr	r8, 0x38
	and	rdx, rdi
	shr	r9, 0x38
	mov	[r11], rdx

	mov	rdx, rsi
	shr	rsi, 0x30
	shl	rdx, 0x8
	shl	r9, 0x38
	or	rdx, r8
	or	rax, r9
	and	rdx, rdi
	mov	[r11+8], rdx

	mov	rdx, rcx
	shr	rcx, 0x28
	shl	rdx, 0x10
	or	rdx, rsi
	mov	rsi, rsp
	and	rdx, rdi
	mov	[r11+0x10], rdx

	mov	rdx, rax
	shl	rdx, 0x18
	or	rdx, rcx
	and	rdx, rdi
	mov	rdi, r11
	mov	[r11+0x18], rdx

	mov	rdx, rax
	shr	rax, 0x38
	shr	rdx, 0x20
	mov	[rsp], rax
	mov	[r11+0x20], rdx
	mov	rdx, r11
	call	ed25519$barrett_reduce256_modm

	add	rsp, 0x78
	pop	r15 r14 r13 r12 rbx rbp

	epilog

end if

if used ed25519$add256_modm | defined include_everything
	; three arguments: rdi == dest, rsi == x, rdx == y
falign
ed25519$add256_modm:
	prolog	ed25519$add256_modm
	mov	r8, 0xffffffffffffff
	mov	rax, [rsi]
	add	rax, [rdx]
	mov	rcx, rax
	shr	rax, 56
	add	rax, [rsi+8]
	add	rax, [rdx+8]
	and	rcx, r8
	mov	[rdi], rcx
	mov	rcx, rax
	shr	rax, 56
	add	rax, [rsi+16]
	add	rax, [rdx+16]
	and	rcx, r8
	mov	[rdi+8], rcx
	mov	rcx, rax
	shr	rax, 56
	add	rax, [rsi+24]
	add	rax, [rdx+24]
	mov	r9, [rdx+32]
	and	rcx, r8
	mov	[rdi+16], rcx
	and	r8, rax
	shr	rax, 56
	add	rax, [rsi+32]
	add	rax, r9
	mov	[rdi+24], r8
	mov	[rdi+32], rax
	call	ed25519$reduce256_modm
	epilog

end if


if used ed25519$contract256_modm | defined include_everything
	; two arguments: rdi == dest (32 bytes), rsi == in
falign
ed25519$contract256_modm:
	prolog	ed25519$contract256_modm
	mov	rdx, [rsi+8]
	mov	rax, rdx
	shr	rdx, 8
	shl	rax, 56
	or	rax, [rsi]
	mov	[rdi], rax

	mov	rcx, [rsi+16]
	mov	rax, rcx
	shr	rcx, 16
	shl	rax, 48
	or	rax, rdx
	mov	[rdi+8], rax

	mov	rdx, [rsi+24]
	mov	rax, rdx
	shl	rax, 40
	or	rax, rcx
	mov	[rdi+16], rax

	shr	rdx, 24
	mov	rax, [rsi+32]
	shl	rax, 32
	or	rax, rdx
	mov	[rdi+24], rax

	epilog

end if


if used ed25519$expand256_modm64 | defined include_everything
	; two arguments: rdi == destination, rsi == source
falign
ed25519$expand256_modm64:
	prolog	ed25519$expand256_modm64
	push	rbx r12
	sub	rsp,0x38
	movzx	r12d, byte [rsi+0x1]
	movzx	eax, byte [rsi+0x2]
	movzx	ebx, byte [rsi+0x9]
	movzx	r11d, byte [rsi+0x11]
	movzx	ecx, byte [rsi+0x19]
	movzx	edx, byte [rsi+0x22]
	movzx	r10d, byte [rsi+0x29]
	movzx	r9d, byte [rsi+0x31]
	shl	rax,0x10
	shl	r12,0x8
	movzx	r8d, byte [rsi+0x39]
	or	r12,rax
	movzx	eax, byte [rsi]
	shl	rbx,0x8
	shl	r11,0x8
	or	r12,rax
	movzx	eax, byte [rsi+0x3]
	shl	rax,0x18
	or	r12,rax
	movzx	eax, byte [rsi+0x4]
	shl	rax,0x20
	or	r12,rax
	movzx	eax, byte [rsi+0x5]
	shl	rax,0x28
	or	r12,rax
	movzx	eax, byte [rsi+0x6]
	shl	rax,0x30
	or	r12,rax
	movzx	eax, byte [rsi+0x7]
	shl	rax,0x38
	or	r12,rax
	movzx	eax, byte [rsi+0xa]
	shl	rax,0x10
	or	rbx,rax
	movzx	eax, byte [rsi+0x8]
	or	rbx,rax
	movzx	eax, byte [rsi+0xb]
	shl	rax,0x18
	or	rbx,rax
	movzx	eax, byte [rsi+0xc]
	shl	rax,0x20
	or	rbx,rax
	movzx	eax, byte [rsi+0xd]
	shl	rax,0x28
	or	rbx,rax
	movzx	eax, byte [rsi+0xe]
	shl	rax,0x30
	or	rbx,rax
	movzx	eax, byte [rsi+0xf]
	shl	rax,0x38
	or	rbx,rax
	movzx	eax, byte [rsi+0x12]
	shl	rax,0x10
	or	r11,rax
	movzx	eax, byte [rsi+0x10]
	or	r11,rax
	movzx	eax, byte [rsi+0x13]
	shl	rax,0x18
	shl	rcx,0x8
	shl	rdx,0x10
	or	r11,rax
	movzx	eax, byte [rsi+0x14]
	shl	rax,0x20
	or	r11,rax
	movzx	eax, byte [rsi+0x15]
	shl	rax,0x28
	or	r11,rax
	movzx	eax, byte [rsi+0x16]
	shl	rax,0x30
	or	r11,rax
	movzx	eax, byte [rsi+0x17]
	shl	rax,0x38
	or	r11,rax
	movzx	eax, byte [rsi+0x1a]
	shl	rax,0x10
	or	rcx,rax
	movzx	eax, byte [rsi+0x18]
	or	rcx,rax
	movzx	eax, byte [rsi+0x1b]
	shl	rax,0x18
	or	rcx,rax
	movzx	eax, byte [rsi+0x1c]
	shl	rax,0x20
	or	rcx,rax
	movzx	eax, byte [rsi+0x1d]
	shl	rax,0x28
	or	rcx,rax
	movzx	eax, byte [rsi+0x1e]
	shl	rax,0x30
	or	rcx,rax
	movzx	eax, byte [rsi+0x1f]
	shl	rax,0x38
	or	rcx,rax
	movzx	eax, byte [rsi+0x21]
	shl	rax,0x8
	or	rax,rdx
	movzx	edx, byte [rsi+0x20]
	or	rax,rdx
	movzx	edx, byte [rsi+0x23]
	shl	rdx,0x18
	or	rax,rdx
	movzx	edx, byte [rsi+0x24]
	shl	rdx,0x20
	or	rax,rdx
	movzx	edx, byte [rsi+0x25]
	shl	rdx,0x28
	or	rax,rdx
	movzx	edx, byte [rsi+0x26]
	shl	r10,0x8
	shl	r9,0x8
	shl	rdx,0x30
	or	rax,rdx
	movzx	edx, byte [rsi+0x27]
	shl	rdx,0x38
	or	rax,rdx
	movzx	edx, byte [rsi+0x2a]
	shl	rdx,0x10
	or	r10,rdx
	movzx	edx, byte [rsi+0x28]
	or	r10,rdx
	movzx	edx, byte [rsi+0x2b]
	shl	rdx,0x18
	or	r10,rdx
	movzx	edx, byte [rsi+0x2c]
	shl	rdx,0x20
	or	r10,rdx
	movzx	edx, byte [rsi+0x2d]
	shl	rdx,0x28
	or	r10,rdx
	movzx	edx, byte [rsi+0x2e]
	shl	rdx,0x30
	or	r10,rdx
	movzx	edx, byte [rsi+0x2f]
	shl	rdx,0x38
	or	r10,rdx
	movzx	edx, byte [rsi+0x32]
	shl	rdx,0x10
	or	r9,rdx
	movzx	edx, byte [rsi+0x30]
	or	r9,rdx
	movzx	edx, byte [rsi+0x33]
	shl	rdx,0x18
	or	r9,rdx
	movzx	edx, byte [rsi+0x34]
	shl	rdx,0x20
	or	r9,rdx
	movzx	edx, byte [rsi+0x35]
	shl	rdx,0x28
	or	r9,rdx
	movzx	edx, byte [rsi+0x36]
	shl	rdx,0x30
	or	r9,rdx
	movzx	edx, byte [rsi+0x37]
	shl	rdx,0x38
	or	r9,rdx
	movzx	edx, byte [rsi+0x3a]
	shl	r8,0x8
	shl	rdx,0x10
	or	r8,rdx
	movzx	edx, byte [rsi+0x38]
	or	r8,rdx
	movzx	edx, byte [rsi+0x3b]
	shl	rdx,0x18
	or	r8,rdx
	movzx	edx, byte [rsi+0x3c]
	shl	rdx,0x20
	or	r8,rdx
	movzx	edx, byte [rsi+0x3d]
	shl	rdx,0x28
	or	r8,rdx
	movzx	edx, byte [rsi+0x3e]
	shl	rdx,0x30
	or	r8,rdx
	movzx	edx, byte [rsi+0x3f]
	mov	rsi,0xffffffffffffff
	shl	rdx,0x38
	or	r8,rdx
	mov	rdx,r12
	shr	r12,0x38
	and	rdx,rsi
	mov	[rdi],rdx
	mov	rdx,rbx
	shr	rbx,0x30
	shl	rdx,0x8
	or	rdx,r12
	and	rdx,rsi
	mov	[rdi+0x8],rdx
	mov	rdx,r11
	shr	r11,0x28
	shl	rdx,0x10
	or	rdx,rbx
	and	rdx,rsi
	mov	[rdi+0x10],rdx
	mov	rdx,rcx
	shl	rdx,0x18
	or	rdx,r11
	mov	r11,rcx
	shr	rcx,0x38
	and	rdx,rsi
	shr	r11,0x20
	mov	[rdi+0x18],rdx
	mov	rdx,rax
	shl	rdx,0x20
	or	rdx,r11
	mov	r11,0xffffffffff
	and	rdx,r11
	mov	[rdi+0x20],rdx
	mov	rdx,rax
	shl	rdx,0x8
	or	rdx,rcx
	shr	rax,0x30
	and	rdx,rsi
	mov	[rsp],rdx
	mov	rdx,r10
	shr	r10,0x28
	shl	rdx,0x10
	or	rdx,rax
	mov	rax,r9
	shr	r9,0x20
	shl	rax,0x18
	and	rdx,rsi
	or	rax,r10
	mov	[rsp+0x8],rdx
	mov	rdx,rdi
	and	rax,rsi
	mov	[rsp+0x10],rax
	mov	rax,r8
	shr	r8,0x18
	shl	rax,0x20
	mov	[rsp+0x20],r8
	or	rax,r9
	and	rax,rsi
	mov	rsi,rsp
	mov	[rsp+0x18],rax
	call	ed25519$barrett_reduce256_modm
	add	rsp,0x38
	pop	r12 rbx
	epilog

end if

if used ed25519$barrett_reduce256_modm | defined include_everything
	; three arguments: rdi == r, rsi == q1, rdx == r1
falign
ed25519$barrett_reduce256_modm:
	prolog	ed25519$barrett_reduce256_modm
	push	rbp rbx r12
	mov	r8, 0xfffffffff
	mov	rbp, 0xffffffffffffff
	mov	rcx, [rsi]
	mov	r11, [rsi+0x8]
	mov	r12, [rsi+0x10]
	push	r13 r14 r15
	sub	rsp, 0x68
	mov	rbx, [rsi+0x18]
	mov	r13, [rsi+0x20]
	mov	[rsp], rcx
	mov	[rsp+0x50], rdi
	mov	[rsp+0x58], rdx
	mov	rdi, 0x9ce5a30a2c131b
	mov	rax, rbx
	mul	rdi
	mov	r14, rax
	mov	rax, rcx
	mov	r15, rdx
	mul	rbp
	mov	r9, rax
	mov	r10, rdx
	mov	rax, r12
	add	r9, r14

	mov	r14, 0xffffffffeb2106
	adc	r10, r15
	mov	r15, 0x215d086329a7ed
	mul	r15
	add	r9, rax
	mov	rcx, rdx
	mov	rax, rdi
	adc	r10, rcx
	mul	r13
	mov	[rsp+0x10], rax
	mov	rax, r11
	mov	[rsp+0x18], rdx
	mul	r14
	add	r9, rax
	mov	rax, [rsp]
	
	mov	rcx, rdx
	adc	r10, rcx
	xor	edi, edi
	shrd	r9, r10, 0x38
	mul	r8
	mov	rsi, r9
	mov	[rsp], rax

	mov	rax, [rsp+0x10]
	add	[rsp], rax
	mov	rax, r11
	mov	[rsp+0x8], rdx
	mov	rdx, [rsp+0x18]
	adc	[rsp+0x8], rdx

	mul	rbp
	add	[rsp], rax
	mov	rax, rbx
	adc	[rsp+0x8], rdx

	mul	r15
	add	[rsp], rax
	mov	rax, r12
	adc	[rsp+0x8], rdx

	mul	r14
	add	[rsp], rax
	mov	rax, r11
	adc	[rsp+0x8], rdx
	add	[rsp], rsi
	adc	[rsp+0x8], rdi

	xor	edi, edi
	mul	r8
	mov	r9, [rsp]
	mov	r10, [rsp+0x8]
	mov	[rsp+0x10], rax
	mov	rax, r15
	mov	[rsp+0x18], rdx

	mul	r13
	shrd	r9, r10, 0x38
	mov	rsi, r9
	mov	r9, rax
	mov	rax, rbx
	add	r9, [rsp+0x10]
	mov	r10, rdx
	adc	r10, [rsp+0x18]

	mul	r14
	add	r9, rax
	mov	rcx, rdx
	mov	rax, r12
	adc	r10, rcx

	mul	rbp
	mov	rcx, rdx
	add	r9, rax
	mov	rax, [rsp]
	adc	r10, rcx
	add	r9, rsi
	mov	r15, r9
	adc	r10, rdi

	mov	rcx, r9
	shr	rax, 0x28
	shl	r15, 0x10
	xor	edi, edi
	and	r15, rbp

	movzx	edx, ax
	mov	rax, r12
	or	r15, rdx
	mul	r8
	shrd	r9, r10, 0x38
	mov	rsi, r9
	mov	r11, rax
	mov	rax, r14
	mov	r12, rdx

	mul	r13
	mov	[rsp], rax
	mov	rax, rbx
	add	[rsp], r11
	mov	[rsp+0x8], rdx
	adc	[rsp+0x8], r12

	mul	rbp
	add	[rsp], rax
	mov	rax, rbx
	adc	[rsp+0x8], rdx
	add	[rsp], rsi
	adc	[rsp+0x8], rdi
	shr	rcx, 0x28
	xor	ebx, ebx

	mul	r8
	mov	r11, [rsp]
	movzx	ecx, cx
	mov	r12, [rsp+0x8]
	mov	rsi, r11
	mov	rdi, r11
	mov	r9, rax
	mov	rax, r11
	shl	rsi, 0x10
	and	rsi, rbp
	mov	r10, rdx
	shrd	rax, r12, 0x38
	or	rsi, rcx
	mov	rcx, rax
	mov	rax, r13

	mul	rbp
	add	rax, r9
	adc	rdx, r10
	add	rax, rcx
	adc	rdx, rbx
	mov	rcx, rax
	mov	r12, rax
	mov	r11, rax
	mov	rax, r13
	mov	rbx, rdx

	mul	r8
	shl	r11, 0x10
	shr	rdi, 0x28
	and	r11, rbp
	movzx	edi, di
	or	r11, rdi

	mov	rdi, 0x12631a5cf5d3ed
	mov	r9, rax 
	mov	rax, rcx
	mov	r10, rdx
	shrd	rax, rbx, 0x38
	xor	ebx, ebx
	add	r9, rax
	adc	r10, rbx
	mov	rax, r9
	mov	r8, r9

	shrd	r9, r10, 0x38
	shr	rax, 0x28
	shl	r8, 0x10
	shr	r12, 0x28
	mov	rbx, r9
	movzx	eax, ax
	and	r8, rbp
	shl	rbx, 0x10
	movzx	r12d, r12w

	mov	[rsp+0x28], rbx
	or	[rsp+0x28], rax
	mov	rax, r15
	mul	rdi
	or	r8, r12
	mov	r12d, 0x14de
	mov	[rsp+0x30], rax
	mov	rcx, rax
	mov	rax, rsi

	shrd	rcx, rdx, 0x38
	mov	[rsp+0x38], rdx
	mov	rbx, rdx
	mul	rdi
	mov	[rsp+0x10], rcx
	shr	rbx, 0x38
	mov	[rsp+0x18], rbx
	mov	r13, rax

	mov	rax, 0xf9dea2f79cd658
	mov	r14, rdx
	mul	r15
	add	[rsp+0x10], rax
	mov	rax, r11
	adc	[rsp+0x18], rdx
	add	[rsp+0x10], r13
	adc	[rsp+0x18], r14

	mul	rdi
	mov	rbx, [rsp+0x18]
	mov	[rsp], rax
	mov	rax, 0xf9dea2f79cd658
	mov	[rsp+0x8], rdx

	mul	rsi
	mov	rcx, [rsp+0x10]
	shrd	rcx, rbx, 0x38
	mov	r13, rax
	mov	rax, r15
	mov	r14, rdx

	mul	r12
	shr	rbx, 0x38
	add	r13, rax
	mov	rax, r8
	adc	r14, rdx
	add	r13, rcx
	adc	r14, rbx
	add	r13, [rsp]
	adc	r14, [rsp+0x8]

	mul	rdi
	mov	r9, r13
	shrd	r9, r14, 0x38
	mov	[rsp+0x40], rax
	mov	rax, 0xf9dea2f79cd658
	mov	[rsp+0x48], rdx

	mul	r11
	mov	r10, r14
	mov	rcx, r9
	shr	r10, 0x38
	mov	rbx, r10
	mov	[rsp], rax
	mov	rax, rsi
	mov	[rsp+0x8], rdx

	mul	r12
	add	[rsp], rax
	adc	[rsp+0x8], rdx
	mov	rax, [rsp+0x40]
	add	[rsp], rcx
	mov	rdx, [rsp+0x48]
	adc	[rsp+0x8], rbx
	add	[rsp], rax
	mov	rax, [rsp+0x28]
	adc	[rsp+0x8], rdx
	mov	rbx, [rsp]
	mov	rsi, [rsp+0x8]
	mov	r10, [rsp+0x58]

	mul	rdi
	mov	edi, 0x10000000
	shrd	rbx, rsi, 0x38
	mov	rcx, [rsp+0x30]
	mov	r9, rax
	mov	rax, r11

	mul	r12
	mov	r11, rax
	mov	rax, rdi

	mul	r15
	add	r11, rax
	mov	rax, 0xf9dea2f79cd658
	add	r11, r9

	mul	r8
	mov	rdx, [r10]
	add	r11, rax
	and	rcx, rbp
	mov	rax, [rsp+0x50]

	sub	rdx, rcx
	and	r13, rbp
	mov	rcx, rdx
	shr	rcx, 0x3f
	mov	r8, rcx
	shl	r8, 0x38
	add	rdx, r8
	mov	[rax], rdx
	mov	rdx, [r10+0x8]
	sub	rdx, rcx
	mov	rcx, [rsp+0x10]
	and	rcx, rbp
	sub	rdx, rcx
	mov	rcx, rdx

	shr	rcx, 0x3f
	mov	rdi, rcx
	shl	rdi, 0x38
	add	rdx, rdi
	mov	[rax+0x8], rdx
	mov	rdx, [r10+0x10]

	sub	rdx, rcx
	sub	rdx, r13
	mov	rcx, rdx
	shr	rcx, 0x3f
	mov	rdi, rcx
	shl	rdi, 0x38
	add	rdx, rdi
	mov	rdi, rax
	mov	[rax+0x10], rdx

	mov	rax, [rsp]
	mov	rdx, [r10+0x18]
	and	rax, rbp
	sub	rdx, rcx
	sub	rdx, rax
	mov	rcx, rdx
	shr	rcx, 0x3f
	mov	rax, rcx
	shl	rax, 0x38
	add	rdx, rax
	mov	[rdi+0x18], rdx

	mov	rax, [r10+0x20]
	mov	rdx, 0xffffffffff
	sub	rax, rcx
	add	r11, rbx
	mov	rbx, rdi
	and	r11, rdx
	sub	rax, r11
	mov	rdx, rax
	shr	rdx, 0x3f
	shl	rdx, 0x28
	add	rax, rdx
	mov	[rdi+0x20], rax

	call	ed25519$reduce256_modm
	add	rsp, 0x68
	mov	rdi, rbx
	pop	r15 r14 r13 r12 rbx rbp
	call	ed25519$reduce256_modm
	epilog

end if


if used ed25519$reduce256_modm | defined include_everything
	; single argument in rdi: r
falign
ed25519$reduce256_modm:
	prolog	ed25519$reduce256_modm
	push	rbp rbx r12
	mov	rsi, 0xff06215d086329a8
	mov	r10, [rdi]
	mov	r9, [rdi+0x10]
	push	r13 r14 r15
	mov	r14, 0xffed9ce5a30a2c13
	add	rsi, [rdi+0x8]
	mov	r8, [rdi+0x20]

	add	r14, r10
	lea	rcx, [r9-0x14de]
	mov	rbx, [rdi+0x18]
	mov	r15, r14
	shr	r15, 0x3f

	lea	rdx, [r8-0x10000000]
	sub	rsi, r15
	shl	r15, 0x38
	mov	r13, rsi
	add	r15, r14

	shr	r13, 0x3f
	xor	r15, r10
	sub	rcx, r13
	shl	r13, 0x38

	mov	r12, rcx
	shr	r12, 0x3f
	add	rsi, r13
	xor	rsi, [rdi+0x8]
	sub	rbx, r12
	shl	r12, 0x38
	mov	rbp, rbx
	add	rcx, r12
	shr	rbp, 0x3f

	xor	rcx, r9
	sub	rdx, rbp
	shl	rbp, 0x38
	add	rbx, rbp
	mov	r11, rdx
	xor	rbx, [rdi+0x18]

	shr	r11, 0x3f
	lea	rax, [r11-1]
	shl	r11, 0x20
	add	rdx, r11
	and	rbx, rax
	xor	rbx, [rdi+0x18]

	and	r15, rax
	and	rsi, rax
	and	rcx, rax
	xor	rsi, [rdi+0x8]

	xor	r15, r10
	xor	rcx, r9
	xor	rdx, r8
	and	rdx, rax
	mov	[rdi], r15

	mov	[rdi+0x10], rcx
	mov	[rdi+0x18], rbx

	xor	rdx, r8

	pop	r15 r14 r13
	mov	[rdi+0x8], rsi
	mov	[rdi+0x20], rdx

	pop	r12 rbx rbp
	epilog

end if


if used ed25519$mul256_modm | defined include_everything
	; three arguments: rdi == r, rsi == x, rdx == y
falign
ed25519$mul256_modm:
	prolog	ed25519$mul256_modm
	push	rbp rbx r12
	mov	rcx, rdx
	mov	rbx, 0xffffffffffffff
	push	r13 r14 r15
	sub	rsp, 0x98
	mov	r8, [rsi]
	mov	r14, [rcx+0x8]
	mov	[rsp+0x28], rdi
	mov	rdi, [rdx]
	mov	r15, [rsi+0x8]
	mov	rax, r8
	mul	rdi
	mov	r11, rax
	mov	r9, rax
	mov	rax, r8
	mov	r12, rdx
	and	r9, rbx
	mul	r14
	mov	[rsp+0x60], r9
	mov	r9, rax
	mov	rax, r11
	mov	r10, rdx
	shrd	rax, r12, 0x38
	xor	r12d, r12d
	mov	r11, rax
	mov	rax, r15
	mul	rdi
	add	rax, r9
	adc	rdx, r10
	add	rax, r11
	mov	r11, rax
	mov	r9, rax
	mov	rax, [rcx+0x10]
	adc	rdx, r12
	and	r9, rbx
	mov	r12, rdx
	mov	[rsp+0x68], r9
	mov	[rsp+0x18], rax
	mul	r8
	mov	r9, rax
	mov	r10, rdx
	mov	rax, r11
	mov	rdx, [rsi+0x10]
	shrd	rax, r12, 0x38
	xor	r12d, r12d
	mov	r11, rax
	mov	rax, rdx
	mov	[rsp+0x20], rdx
	mul	rdi
	mov	[rsp], rax
	mov	rax, r15
	add	[rsp], r9
	mov	[rsp+0x8], rdx
	adc	[rsp+0x8], r10
	mul	r14
	add	[rsp], rax
	mov	rax, r8
	adc	[rsp+0x8], rdx
	add	[rsp], r11
	adc	[rsp+0x8], r12
	mov	r13, [rcx+0x18]
	mov	r11, [rsp]
	mul	r13
	mov	r12, [rsp+0x8]
	mov	rbp, [rsi+0x18]
	mov	rcx, [rcx+0x20]
	mov	r9, r11
	and	r9, rbx
	mov	[rsp+0x70], r9
	mov	r9, rax
	mov	rax, r11
	shrd	rax, r12, 0x38
	mov	r10, rdx
	xor	r12d, r12d
	mov	r11, rax
	mov	rax, rbp
	mul	rdi
	mov	[rsp], rax
	mov	rax, [rsp+0x18]
	add	[rsp], r9
	mov	[rsp+0x8], rdx
	adc	[rsp+0x8], r10
	mul	r15
	add	[rsp], rax
	mov	rax, [rsp+0x20]
	adc	[rsp+0x8], rdx
	mul	r14
	add	[rsp], rax
	mov	rax, r8
	adc	[rsp+0x8], rdx
	add	[rsp], r11
	mov	r8, [rsi+0x20]
	mov	rsi, 0xffffffffff
	mov	r11, [rsp]
	adc	[rsp+0x8], r12
	mov	r9, r11
	mul	rcx
	mov	r12, [rsp+0x8]
	and	r9, rbx
	mov	[rsp+0x78], r9
	mov	r9, rax
	mov	rax, r11
	mov	r10, rdx
	shrd	rax, r12, 0x38
	xor	r12d, r12d
	mov	r11, rax
	mov	rax, rdi
	mul	r8
	mov	[rsp], rax
	add	[rsp], r9
	mov	rax, rbp
	mov	[rsp+0x8], rdx
	adc	[rsp+0x8], r10
	mul	r14
	add	[rsp], rax
	mov	rax, r15
	adc	[rsp+0x8], rdx
	mul	r13
	add	[rsp], rax
	adc	[rsp+0x8], rdx
	mov	rax, [rsp+0x20]
	mul	qword [rsp+0x18]
	add	[rsp], rax
	mov	rax, r14
	adc	[rsp+0x8], rdx
	add	[rsp], r11
	adc	[rsp+0x8], r12
	xor	edi, edi
	mul	r8
	mov	r11, [rsp]
	mov	r9, rax
	mov	r10, rdx
	mov	rax, [rsp]
	mov	rdx, [rsp+0x8]
	and	rsi, r11
	mov	[rsp+0x80], rsi
	shrd	rax, rdx, 0x38
	mov	rsi, rax
	mov	rax, r15
	mul	rcx
	mov	[rsp], rax
	mov	[rsp+0x8], rdx
	mov	r15, [rsp+0x20]
	mov	r14, [rsp+0x18]
	add	[rsp], r9
	adc	[rsp+0x8], r10
	mov	rax, r15
	mul	r13
	add	[rsp], rax
	mov	rax, r14
	adc	[rsp+0x8], rdx
	mul	rbp
	add	[rsp], rax
	mov	rax, r14
	adc	[rsp+0x8], rdx
	add	[rsp], rsi
	adc	[rsp+0x8], rdi
	shr	r11, 0x18
	xor	edi, edi
	mul	r8
	mov	r12, [rsp]
	mov	r11d, r11d
	mov	rsi, r12
	mov	r9, rax
	mov	r10, rdx
	mov	rax, [rsp]
	mov	rdx, [rsp+0x8]
	shl	rsi, 0x20
	and	rsi, rbx
	or	rsi, r11
	shrd	rax, rdx, 0x38
	mov	[rsp+0x30], rsi
	mov	rsi, rax
	mov	rax, r15
	mul	rcx
	mov	r14, rax
	mov	r15, rdx
	mov	rax, rbp
	add	r14, r9
	adc	r15, r10
	mul	r13
	add	r14, rax
	mov	rax, r13
	adc	r15, rdx
	add	r14, rsi
	adc	r15, rdi
	mov	rsi, r14
	shr	r12, 0x18
	mul	r8
	shl	rsi, 0x20
	mov	r12d, r12d
	and	rsi, rbx
	mov	r11, r14
	xor	edi, edi
	or	rsi, r12
	mov	[rsp+0x38], rsi
	mov	r9, rax
	mov	rax, r14
	mov	r10, rdx
	shrd	rax, r15, 0x38
	mov	rsi, rax
	mov	rax, rbp
	mul	rcx
	mov	r14, rax
	mov	r15, rdx
	mov	rax, r8
	add	r14, r9
	adc	r15, r10
	add	r14, rsi
	adc	r15, rdi
	mov	rsi, r14
	shr	r11, 0x18
	mul	rcx
	shl	rsi, 0x20
	mov	r11d, r11d
	and	rsi, rbx
	xor	edi, edi
	mov	rbp, r14
	or	rsi, r11
	mov	[rsp+0x40], rsi
	lea	rsi, [rsp+0x30]
	mov	r9, rax
	mov	rax, r14
	mov	r10, rdx
	shrd	rax, r15, 0x38
	add	r9, rax
	adc	r10, rdi
	mov	rcx, r9
	mov	rdx, r9
	shrd	rcx, r10, 0x38
	mov	rax, r9
	shr	rdx, 0x18
	mov	rdi, [rsp+0x28]
	mov	edx, edx
	shl	rax, 0x20
	shr	rbp, 0x18
	shl	rcx, 0x20
	and	rax, rbx
	mov	ebp, ebp
	or	rcx, rdx
	lea	rdx, [rsp+0x60]
	or	rax, rbp
	mov	[rsp+0x48], rax
	mov	[rsp+0x50], rcx
	call	ed25519$barrett_reduce256_modm
	add	rsp, 0x98
	pop	r15 r14 r13 r12 rbx rbp
	epilog
end if


if used ed25519$scalarmult | defined include_everything
	; two arguments: rdi == r, rsi == s
falign
ed25519$scalarmult:
	prolog	ed25519$scalarmult
	push	rbp rbx r12
	sub	rsp, 0x200
	mov	r8d, 14
	xor	r9d, r9d
	mov	r10d, 14
	mov	rax, rsp
	mov	rbx, rdi
	mov	r11d, 8
	and	rax, 0xf
	sub	rsp, rax
	mov	rdx, [rsi]
	mov	rdi, rsp
	mov	[rsp+0x190], rax
	mov	rax, rsp
calign
.contract256_window4_loop1:
	mov	ecx, edx
	add	rax, 1
	shr	rdx, 4
	and	ecx, 0xf
	mov	byte [rax-1], cl
	mov	rcx, rax
	sub	rcx, rdi
	cmp	r8, rcx
	ja	.contract256_window4_loop1
	add	r9, 1
	cmp	r9, 5
	je	.contract256_window4_signed
	cmp	r9, 4
	mov	r8, r10
	mov	rdx, [rsi+r9*8]
	cmove	r8, r11
	mov	rdi, rax
	jmp	.contract256_window4_loop1
calign
.contract256_window4_signed:
	movzx	edx, byte [rsp]
	lea	rdi, [rsp+0x3f]
	mov	rax, rsp
	xor	ecx, ecx
calign
.contract256_window4_signloop:
	lea	r8d, [rdx+rcx]
	add	rax, 1
	mov	edx, r8d
	and	r8d, 0xf
	mov	ecx, r8d
	sar	dl, 4
	add	dl, byte [rax]
	sar	cl, 3
	mov	esi, ecx
	shl	esi, 4
	sub	r8d, esi
	mov	byte [rax], dl
	mov	byte [rax-1], r8b
	cmp	rax, rdi
	jne	.contract256_window4_signloop

	movsx	edx, byte [rsp+1]
	lea	rdi, [rsp+0x40]
	xor	esi, esi
	add	byte [rsp+0x3f], cl
	call	.choose_niels

	pxor	xmm9, xmm9
	lea	rdi, [rbx+0x60]
	movaps	xmm12, [rsp+0x70]
	mov	edx, 0x30
	movaps	xmm4, [ed25519$packed2p0]
	movaps	xmm13, xmm9
	movaps	xmm11, [rsp+0x80]
	paddd	xmm4, xmm12
	psubd	xmm4, [rsp+0x40]
	movaps	xmm3, xmm4
	movaps	xmm0, [ed25519$packed2p1]
	paddd	xmm0, xmm11
	psubd	xmm0, [rsp+0x50]
	punpcklqdq xmm3, xmm0
	punpckhqdq xmm4, xmm0
	movaps	xmm10, [rsp+0x90]
	paddd	xmm11, [rsp+0x50]
	movaps	xmm1, [ed25519$packed2p2]
	movaps	xmm6, xmm3
	movaps	xmm5, xmm4
	psrlq	xmm3, 0x20
	movaps	xmm2, [ed25519$sse2_bot32bitmask]
	paddd	xmm1, xmm10
	psubd	xmm1, [rsp+0x60]
	punpcklqdq xmm13, xmm1
	psrlq	xmm4, 0x20
	paddd	xmm10, [rsp+0x60]
	pand	xmm6, xmm2
	movaps	xmm0, [ed25519$packedmask26]
	pand	xmm5, xmm2
	movaps	xmm14, xmm13
	movaps	xmm8, [ed25519$packednineteen]
	psrlq	xmm13, 0x20
	movdqa	xmm7, xmm6
	movdqa	xmm1, xmm5
	pand	xmm14, xmm2
	pand	xmm5, xmm0
	psrlq	xmm7, 0x1a
	paddq	xmm3, xmm7
	psrlq	xmm1, 0x1a
	movaps	xmm7, xmm3
	paddq	xmm4, xmm1
	movaps	xmm15, xmm4
	pand	xmm6, xmm0
	psrlq	xmm7, 0x19
	paddq	xmm5, xmm7
	movaps	xmm1, [ed25519$packedmask25]
	psrlq	xmm15, 0x19
	paddq	xmm14, xmm15
	movaps	xmm7, xmm14
	pslldq	xmm15, 0x8
	pand	xmm4, xmm1
	psrlq	xmm7, 0x1a
	paddq	xmm13, xmm7
	movaps	xmm7, xmm13
	pand	xmm3, xmm1
	psrlq	xmm7, 0x19
	pmuludq	xmm7, xmm8

	punpckhqdq xmm7, xmm15
	punpcklqdq xmm9, xmm10
	pand	xmm14, xmm0
	paddq	xmm6, xmm7
	movaps	xmm7, xmm5
	pand	xmm5, xmm0
	movaps	xmm15, xmm6
	pand	xmm6, xmm0
	psrlq	xmm7, 0x1a
	paddq	xmm4, xmm7
	movaps	xmm7, xmm5
	psrlq	xmm15, 0x1a

	punpckhdq xmm5, xmm4
	paddq	xmm3, xmm15
	pand	xmm13, xmm1
	punpckldq xmm7, xmm4
	movaps	xmm15, xmm6
	movaps	xmm4, [rsp+0x40]

	punpckhdq xmm6, xmm3
	punpckldq xmm15, xmm3
	paddd	xmm4, xmm12
	movaps	xmm3, xmm4
	punpckhqdq xmm4, xmm11
	punpcklqdq xmm6, xmm5
	punpcklqdq xmm3, xmm11

	movaps	xmm5, xmm4
	punpcklqdq xmm15, xmm7
	psrlq	xmm4, 0x20
	movaps	[rbx+0x10], xmm6

	movaps	xmm6, xmm3
	psrlq	xmm3, 0x20
	pand	xmm5, xmm2
	pand	xmm6, xmm2
	pand	xmm2, xmm9
	psrlq	xmm9, 0x20
	movaps	xmm7, xmm5
	pand	xmm5, xmm0
	movaps	xmm10, xmm6

	psrlq	xmm7, 0x1a
	paddq	xmm4, xmm7
	movaps	xmm7, xmm4
	psrlq	xmm10, 0x1a
	paddq	xmm3, xmm10
	movaps	xmm10, xmm3

	psrlq	xmm7, 0x19
	paddq	xmm2, xmm7
	pand	xmm6, xmm0
	psrlq	xmm10, 0x19
	paddq	xmm5, xmm10
	movaps	xmm10, xmm2

	pslldq	xmm7, 0x8
	pand	xmm4, xmm1
	psrlq	xmm10, 0x1a
	paddq	xmm9, xmm10
	movaps	xmm10, xmm9

	pand	xmm2, xmm0
	psrlq	xmm10, 0x19
	pmuludq	xmm8, xmm10
	punpckhqdq xmm8, xmm7
	movaps	xmm7, xmm5
	pand	xmm3, xmm1
	pand	xmm1, xmm9
	paddq	xmm6, xmm8
	movaps	xmm8, xmm6

	pand	xmm6, xmm0
	pand	xmm0, xmm5
	psrlq	xmm7, 0x1a
	paddq	xmm4, xmm7
	psrlq	xmm8, 0x1a
	paddq	xmm3, xmm8
	punpckhdq xmm14, xmm13
	
	movaps	xmm5, xmm6
	punpckhdq xmm6, xmm3
	movaps	xmm7, xmm0
	punpckldq xmm5, xmm3
	punpckldq xmm7, xmm4
	punpckhdq xmm0, xmm4
	punpckhdq xmm2, xmm1
	punpcklqdq xmm5, xmm7
	punpcklqdq xmm6, xmm0

	movaps	[rbx], xmm15
	movaps	[rbx+0x20], xmm14
	movaps	[rbx+0x30], xmm5
	movaps	[rbx+0x40], xmm6
	movaps	[rbx+0x50], xmm2

	; add_reduce done
	xor	esi, esi
	; edx is the right # of bytes already
	call	memset

	movaps	xmm0, [rsp+0xa0]
	lea	r12, [rsp+0x3]
	mov	dword [rbx+0x60], 2
	xor	ebp, ebp
	movaps	xmm1, [rsp+0xb0]
	movaps	xmm2, [rsp+0xc0]
	movaps	[rbx+0x90], xmm0
	movaps	[rbx+0xa0], xmm1
	movaps	[rbx+0xb0], xmm2
calign
.multaddloop1:
	lea	esi, [rbp+3]
	lea	rdi, [rsp+0x40]
	movsx	edx, byte [r12+rbp]
	shr	esi, 1
	add	rbp, 2
	call	.choose_niels
	lea	rsi, [rsp+0x40]
	mov	rdi, rbx
	call	.nielsadd2

	cmp	rbp, 0x3e
	jne	.multaddloop1
	xor	bpl, bpl
	lea	r12, [rsp+2]
	repeat 3
		lea	rdi, [rsp+0xd0]
		mov	rsi, rbx
		call	ed25519$double_p1p1
		lea	rsi, [rsp+0xd0]
		mov	rdi, rbx
		call	ed25519$p1p1_to_partial
	end repeat
	lea	rdi, [rsp+0xd0]
	mov	rsi, rbx
	call	ed25519$double_p1p1
	lea	rsi, [rsp+0xd0]
	mov	rdi, rbx
	call	ed25519$p1p1_to_full
	movsx	edx, byte [rsp]
	lea	rdi, [rsp+0x40]
	xor	esi, esi
	call	.choose_niels
	lea	rdi, [rsp+0xa0]
	mov	edx, .ge25519_ecd
	mov	rsi, rdi
	call	curve25519$mul

	lea	rsi, [rsp+0x40]
	mov	rdi, rbx
	call	.nielsadd2
calign
.lastloop:
	movsx	edx, byte [r12+rbp]
	lea	esi, [rbp+0x2]
	lea	rdi, [rsp+0x40]
	add	rbp, 2
	shr	esi, 1
	call	.choose_niels
	lea	rsi, [rsp+0x40]
	mov	rdi, rbx
	call	.nielsadd2
	cmp	rbp, 0x3e
	jne	.lastloop

	mov	rcx, [rsp+0x190]
	add	rsp, rcx
	add	rsp, 0x200
	pop	r12 rbx rbp
	epilog
align 16
.ge25519_ecd:
	dd	0x035978a3,0x00d37284,0x03156ebd,0x006a0a0e,0x0001c029,0x0179e898,0x03a03cbb,0x01ce7198,0x02e2b6ff,0x01480db3
	dq	0x0
	; /* multiples of the base point in packed {ysubx, xaddy, t2d} form */

align 16
.ge25519_niels_base_multiples:
	db	0x3e,0x91,0x40,0xd7,0x05,0x39,0x10,0x9d,0xb3,0xbe,0x40,0xd1,0x05,0x9f,0x39,0xfd,0x09,0x8a,0x8f,0x68,0x34,0x84,0xc1,0xa5,0x67,0x12,0xf8,0x98,0x92,0x2f,0xfd,0x44,0x85,0x3b,0x8c,0xf5,0xc6,0x93,0xbc,0x2f,0x19,0x0e,0x8c,0xfb,0xc6,0x2d,0x93,0xcf,0xc2,0x42,0x3d,0x64,0x98,0x48,0x0b,0x27,0x65,0xba,0xd4,0x33,0x3a,0x9d,0xcf,0x07,0x59,0xbb,0x6f,0x4b,0x67,0x15,0xbd,0xdb,0xea,0xa5,0xa2,0xee,0x00,0x3f,0xe1,0x41,0xfa,0xc6,0x57,0xc9,0x1c,0x9d,0xd4,0xcd,0xca,0xec,0x16,0xaf,0x1f,0xbe,0x0e,0x4f
	db	0xa8,0xd5,0xb4,0x42,0x60,0xa5,0x99,0x8a,0xf6,0xac,0x60,0x4e,0x0c,0x81,0x2b,0x8f,0xaa,0x37,0x6e,0xb1,0x6b,0x23,0x9e,0xe0,0x55,0x25,0xc9,0x69,0xa6,0x95,0xb5,0x6b,0xd7,0x71,0x3c,0x93,0xfc,0xe7,0x24,0x92,0xb5,0xf5,0x0f,0x7a,0x96,0x9d,0x46,0x9f,0x02,0x07,0xd6,0xe1,0x65,0x9a,0xa6,0x5a,0x2e,0x2e,0x7d,0xa8,0x3f,0x06,0x0c,0x59,0x02,0x68,0xd3,0xda,0xaa,0x7e,0x34,0x6e,0x05,0x48,0xee,0x83,0x93,0x59,0xf3,0xba,0x26,0x68,0x07,0xe6,0x10,0xbe,0xca,0x3b,0xb8,0xd1,0x5e,0x16,0x0a,0x4f,0x31,0x49
	db	0x65,0xd2,0xfc,0xa4,0xe8,0x1f,0x61,0x56,0x7d,0xba,0xc1,0xe5,0xfd,0x53,0xd3,0x3b,0xbd,0xd6,0x4b,0x21,0x1a,0xf3,0x31,0x81,0x62,0xda,0x5b,0x55,0x87,0x15,0xb9,0x2a,0x30,0x97,0xee,0x4c,0xa8,0xb0,0x25,0xaf,0x8a,0x4b,0x86,0xe8,0x30,0x84,0x5a,0x02,0x32,0x67,0x01,0x9f,0x02,0x50,0x1b,0xc1,0xf4,0xf8,0x80,0x9a,0x1b,0x4e,0x16,0x7a,0x34,0x48,0x67,0xf1,0xf4,0x11,0xf2,0x9b,0x95,0xf8,0x2d,0xf6,0x17,0x6b,0x4e,0xb8,0x4e,0x2a,0x72,0x5b,0x07,0x6f,0xde,0xd7,0x21,0x2a,0xbb,0x63,0xb9,0x04,0x9a,0x54
	db	0xbf,0x18,0x68,0x05,0x0a,0x05,0xfe,0x95,0xa9,0xfa,0x60,0x56,0x71,0x89,0x7e,0x32,0x73,0x50,0xa0,0x06,0xcd,0xe3,0xe8,0xc3,0x9a,0xa4,0x45,0x74,0x4c,0x3f,0x93,0x27,0x9f,0x09,0xfc,0x8e,0xb9,0x51,0x73,0x28,0x38,0x25,0xfd,0x7d,0xf4,0xc6,0x65,0x67,0x65,0x92,0x0a,0xfb,0x3d,0x8d,0x34,0xca,0x27,0x87,0xe5,0x21,0x03,0x91,0x0e,0x68,0xb0,0x26,0x14,0xe5,0xec,0x45,0x1e,0xbf,0x94,0x0f,0xba,0x6d,0x3d,0xc6,0x2b,0xe3,0xc0,0x52,0xf8,0x8c,0xd5,0x74,0x29,0xe4,0x18,0x4c,0xe6,0xb0,0xb1,0x79,0xf0,0x44
	db	0xba,0xd6,0x47,0xa4,0xc3,0x82,0x91,0x7f,0xb7,0x29,0x27,0x4b,0xd1,0x14,0x00,0xd5,0x87,0xa0,0x64,0xb8,0x1c,0xf1,0x3c,0xe3,0xf3,0x55,0x1b,0xeb,0x73,0x7e,0x4a,0x15,0x33,0xbb,0xa5,0x08,0x44,0xbc,0x12,0xa2,0x02,0xed,0x5e,0xc7,0xc3,0x48,0x50,0x8d,0x44,0xec,0xbf,0x5a,0x0c,0xeb,0x1b,0xdd,0xeb,0x06,0xe2,0x46,0xf1,0xcc,0x45,0x29,0xb3,0x03,0xd0,0xe7,0x79,0xa1,0x32,0xc8,0x7e,0x4d,0x12,0x00,0x0a,0x9d,0x72,0x5f,0xf3,0x8f,0x6d,0x0e,0xa1,0xd4,0xc1,0x62,0x98,0x7a,0xb2,0x38,0x59,0xac,0xb8,0x68
	db	0xa4,0x8c,0x7d,0x7b,0xb6,0x06,0x98,0x49,0x39,0x27,0xd2,0x27,0x84,0xe2,0x5b,0x57,0xb9,0x53,0x45,0x20,0xe7,0x5c,0x08,0xbb,0x84,0x78,0x41,0xae,0x41,0x4c,0xb6,0x38,0x31,0x71,0x15,0x77,0xeb,0xee,0x0c,0x3a,0x88,0xaf,0xc8,0x00,0x89,0x15,0x27,0x9b,0x36,0xa7,0x59,0xda,0x68,0xb6,0x65,0x80,0xbd,0x38,0xcc,0xa2,0xb6,0x7b,0xe5,0x51,0xa4,0xe3,0x9d,0x68,0x91,0xad,0x9d,0x8f,0x37,0x91,0xfb,0xf8,0x28,0x24,0x5f,0x17,0x88,0xb9,0xcf,0x9f,0x32,0xb5,0x0a,0x05,0x9f,0xc0,0x54,0x13,0xa2,0xdf,0x65,0x78
	db	0xb1,0x21,0x32,0xaa,0x9a,0x2c,0x6f,0xba,0xa7,0x23,0xba,0x3b,0x53,0x21,0xa0,0x6c,0x3a,0x2c,0x19,0x92,0x4f,0x76,0xea,0x9d,0xe0,0x17,0x53,0x2e,0x5d,0xdd,0x6e,0x1d,0xbf,0xa3,0x4e,0x94,0xd0,0x5c,0x1a,0x6b,0xd2,0xc0,0x9d,0xb3,0x3a,0x35,0x70,0x74,0x49,0x2e,0x54,0x28,0x82,0x52,0xb2,0x71,0x7e,0x92,0x3c,0x28,0x69,0xea,0x1b,0x46,0x36,0xda,0x0f,0xab,0xac,0x8a,0x7a,0x21,0xc8,0x49,0x35,0x3d,0x54,0xc6,0x28,0xa5,0x68,0x75,0xab,0x13,0x8b,0x5b,0xd0,0x37,0x37,0xbc,0x2c,0x3a,0x62,0xef,0x3c,0x23
	db	0xd9,0x34,0x92,0xf3,0xed,0x5d,0xa7,0xe2,0xf9,0x58,0xb5,0xe1,0x80,0x76,0x3d,0x96,0xfb,0x23,0x3c,0x6e,0xac,0x41,0x27,0x2c,0xc3,0x01,0x0e,0x32,0xa1,0x24,0x90,0x3a,0x8f,0x3e,0xdd,0x04,0x66,0x59,0xb7,0x59,0x2c,0x70,0x88,0xe2,0x77,0x03,0xb3,0x6c,0x23,0xc3,0xd9,0x5e,0x66,0x9c,0x33,0xb1,0x2f,0xe5,0xbc,0x61,0x60,0xe7,0x15,0x09,0x7e,0xa3,0x34,0xa8,0x35,0xe8,0x7d,0xdf,0xea,0x57,0x98,0x68,0xda,0x9c,0xe1,0x8b,0x26,0xb3,0x67,0x71,0x36,0x85,0x11,0x2c,0xc2,0xd5,0xef,0xdb,0xd9,0xb3,0x9e,0x58
	db	0x5e,0x51,0xaa,0x49,0x54,0x63,0x5b,0xed,0x3a,0x82,0xc6,0x0b,0x9f,0xc4,0x65,0xa8,0xc4,0xd1,0x42,0x5b,0xe9,0x1f,0x0c,0x85,0xb9,0x15,0xd3,0x03,0x6f,0x6d,0xd7,0x30,0x1d,0x9c,0x2f,0x63,0x0e,0xdd,0xcc,0x2e,0x15,0x31,0x89,0x76,0x96,0xb6,0xd0,0x51,0x58,0x7a,0x63,0xa8,0x6b,0xb7,0xdf,0x52,0x39,0xef,0x0e,0xa0,0x49,0x7d,0xd3,0x6d,0xc7,0xe4,0x06,0x21,0x17,0x44,0x44,0x6c,0x69,0x7f,0x8d,0x92,0x80,0xd6,0x53,0xfb,0x26,0x3f,0x4d,0x69,0xa4,0x9e,0x73,0xb4,0xb0,0x4b,0x86,0x2e,0x11,0x97,0xc6,0x10
	db	0xde,0x5f,0xbe,0x7d,0x27,0xc4,0x93,0x64,0xa2,0x7e,0xad,0x19,0xad,0x4f,0x5d,0x26,0x90,0x45,0x30,0x46,0xc8,0xdf,0x00,0x0e,0x09,0xfe,0x66,0xed,0xab,0x1c,0xe6,0x25,0x05,0xc8,0x58,0x83,0xa0,0x2a,0xa6,0x0c,0x47,0x42,0x20,0x7a,0xe3,0x4a,0x3d,0x6a,0xdc,0xed,0x11,0x3b,0xa6,0xd3,0x64,0x74,0xef,0x06,0x08,0x55,0xaf,0x9b,0xbf,0x03,0x04,0x66,0x58,0xcc,0x28,0xe1,0x13,0x3f,0x7e,0x74,0x59,0xb4,0xec,0x73,0x58,0x6f,0xf5,0x68,0x12,0xcc,0xed,0x3d,0xb6,0xa0,0x2c,0xe2,0x86,0x45,0x63,0x78,0x6d,0x56
	db	0x34,0x08,0xc1,0x9c,0x9f,0xa4,0x37,0x16,0x51,0xc4,0x9b,0xa8,0xd5,0x56,0x8e,0xbc,0xdb,0xd2,0x7f,0x7f,0x0f,0xec,0xb5,0x1c,0xd9,0x35,0xcc,0x5e,0xca,0x5b,0x97,0x33,0xd0,0x2f,0x5a,0xc6,0x85,0x42,0x05,0xa1,0xc3,0x67,0x16,0xf3,0x2a,0x11,0x64,0x6c,0x58,0xee,0x1a,0x73,0x40,0xe2,0x0a,0x68,0x2a,0xb2,0x93,0x47,0xf3,0xa5,0xfb,0x14,0xd4,0xf7,0x85,0x69,0x16,0x46,0xd7,0x3c,0x57,0x00,0xc8,0xc9,0x84,0x5e,0x3e,0x59,0x1e,0x13,0x61,0x7b,0xb6,0xf2,0xc3,0x2f,0x6c,0x52,0xfc,0x83,0xea,0x9c,0x82,0x14
	db	0xc2,0x95,0xdd,0x97,0x84,0x7b,0x43,0xff,0xa7,0xb5,0x4e,0xaa,0x30,0x4e,0x74,0x6c,0x8b,0xe8,0x85,0x3c,0x61,0x5d,0x0c,0x9e,0x73,0x81,0x75,0x5f,0x1e,0xc7,0xd9,0x2f,0xb8,0xec,0x71,0x4e,0x2f,0x0b,0xe7,0x21,0xe3,0x77,0xa4,0x40,0xb9,0xdd,0x56,0xe6,0x80,0x4f,0x1d,0xce,0xce,0x56,0x65,0xbf,0x7e,0x7b,0x5d,0x53,0xc4,0x3b,0xfc,0x05,0xdd,0xde,0xaf,0x52,0xae,0xb3,0xb8,0x24,0xcf,0x30,0x3b,0xed,0x8c,0x63,0x95,0x34,0x95,0x81,0xbe,0xa9,0x83,0xbc,0xa4,0x33,0x04,0x1f,0x65,0x5c,0x47,0x67,0x37,0x37
	db	0xd9,0xad,0xd1,0x40,0xfd,0x99,0xba,0x2f,0x27,0xd0,0xf4,0x96,0x6f,0x16,0x07,0xb3,0xae,0x3b,0xf0,0x15,0x52,0xf0,0x63,0x43,0x99,0xf9,0x18,0x3b,0x6c,0xa5,0xbe,0x1f,0x90,0x65,0x24,0x14,0xcb,0x95,0x40,0x63,0x35,0x55,0xc1,0x16,0x40,0x14,0x12,0xef,0x60,0xbc,0x10,0x89,0x0c,0x14,0x38,0x9e,0x8c,0x7c,0x90,0x30,0x57,0x90,0xf5,0x6b,0x8a,0x5b,0x41,0xe1,0xf1,0x78,0xa7,0x0f,0x7e,0xa7,0xc3,0xba,0xf7,0x9f,0x40,0x06,0x50,0x9a,0xa2,0x9a,0xb8,0xd7,0x52,0x6f,0x56,0x5a,0x63,0x7a,0xf6,0x1c,0x52,0x02
	db	0x94,0x52,0x9d,0x0a,0x0b,0xee,0x3f,0x51,0x66,0x5a,0xdf,0x0f,0x5c,0xe7,0x98,0x8f,0xce,0x07,0xe1,0xbf,0x88,0x86,0x61,0xd4,0xed,0x2c,0x38,0x71,0x7e,0x0a,0xa0,0x3f,0xe4,0x5e,0x2f,0x77,0x20,0x67,0x14,0xb1,0xce,0x9a,0x07,0x96,0xb1,0x94,0xf8,0xe8,0x4a,0x82,0xac,0x00,0x4d,0x22,0xf8,0x4a,0xc4,0x6c,0xcd,0xf7,0xd9,0x53,0x17,0x00,0x34,0xdb,0x3d,0x96,0x2d,0x23,0x69,0x3c,0x58,0x38,0x97,0xb4,0xda,0x87,0xde,0x1d,0x85,0xf2,0x91,0xa0,0xf9,0xd1,0xd7,0xaa,0xb6,0xed,0x48,0xa0,0x2f,0xfe,0xb5,0x12
	db	0x4d,0xe3,0xfc,0x96,0xc4,0xfb,0xf0,0x71,0xed,0x5b,0xf3,0xad,0x6b,0x82,0xb9,0x73,0x61,0xc5,0x28,0xff,0x61,0x72,0x04,0xd2,0x6f,0x20,0xb1,0x6f,0xf9,0x76,0x9b,0x74,0x92,0x1e,0x6f,0xad,0x26,0x7c,0x2b,0xdf,0x13,0x89,0x4b,0x50,0x23,0xd3,0x66,0x4b,0xc3,0x8b,0x1c,0x75,0xc0,0x9d,0x40,0x8c,0xb8,0xc7,0x96,0x07,0xc2,0x93,0x7e,0x6f,0x05,0xae,0xa6,0xae,0x04,0xf6,0x5a,0x1f,0x99,0x9c,0xe4,0xbe,0xf1,0x51,0x23,0xc1,0x66,0x6b,0xff,0xee,0xb5,0x08,0xa8,0x61,0x51,0x21,0xe0,0x01,0x0f,0xc1,0xce,0x0f
	db	0x44,0x1e,0xfe,0x49,0xa6,0x58,0x4d,0x64,0x7e,0x77,0xad,0x31,0xa2,0xae,0xfc,0x21,0xd2,0xd0,0x7f,0x88,0x5a,0x1c,0x44,0x02,0xf3,0x11,0xc5,0x83,0x71,0xaa,0x01,0x49,0x45,0x4e,0x24,0xc4,0x9d,0xd2,0xf2,0x3d,0x0a,0xde,0xd8,0x93,0x74,0x0e,0x02,0x2b,0x4d,0x21,0x0c,0x82,0x7e,0x06,0xc8,0x6c,0x0a,0xb9,0xea,0x6f,0x16,0x79,0x37,0x41,0xf0,0xf8,0x1a,0x8c,0x54,0xb7,0xb1,0x08,0xb4,0x99,0x62,0x24,0x7c,0x7a,0x0f,0xce,0x39,0xd9,0x06,0x1e,0xf9,0xb0,0x60,0xf7,0x13,0x12,0x6d,0x72,0x7b,0x88,0xbb,0x41
	db	0xbe,0x46,0x43,0x74,0x44,0x7d,0xe8,0x40,0x25,0x2b,0xb5,0x15,0xd4,0xda,0x48,0x1d,0x3e,0x60,0x3b,0xa1,0x18,0x8a,0x3a,0x7c,0xf7,0xbd,0xcd,0x2f,0xc1,0x28,0xb7,0x4e,0xae,0x91,0x66,0x7c,0x59,0x4c,0x23,0x7e,0xc8,0xb4,0x85,0x0a,0x3d,0x9d,0x88,0x64,0xe7,0xfa,0x4a,0x35,0x0c,0xc9,0xe2,0xda,0x1d,0x9e,0x6a,0x0c,0x07,0x1e,0x87,0x0a,0x89,0x89,0xbc,0x4b,0x99,0xb5,0x01,0x33,0x60,0x42,0xdd,0x5b,0x3a,0xae,0x6b,0x73,0x3c,0x9e,0xd5,0x19,0xe2,0xad,0x61,0x0d,0x64,0xd4,0x85,0x26,0x0f,0x30,0xe7,0x3e
	db	0xb7,0xd6,0x7d,0x9e,0xe4,0x55,0xd2,0xf5,0xac,0x1e,0x0b,0x61,0x5c,0x11,0x16,0x80,0xca,0x87,0xe1,0x92,0x5d,0x97,0x99,0x3c,0xc2,0x25,0x91,0x97,0x62,0x57,0x81,0x13,0x18,0x75,0x1e,0x84,0x47,0x79,0xfa,0x43,0xd7,0x46,0x9c,0x63,0x59,0xfa,0xc6,0xe5,0x74,0x2b,0x05,0xe3,0x1d,0x5e,0x06,0xa1,0x30,0x90,0xb8,0xcf,0xa2,0xc6,0x47,0x7d,0xe0,0xd6,0xf0,0x8e,0x14,0xd0,0xda,0x3f,0x3c,0x6f,0x54,0x91,0x9a,0x74,0x3e,0x9d,0x57,0x81,0xbb,0x26,0x10,0x62,0xec,0x71,0x80,0xec,0xc9,0x34,0x8d,0xf5,0x8c,0x14
	db	0x27,0xf0,0x34,0x79,0xf6,0x92,0xa4,0x46,0xa9,0x0a,0x84,0xf6,0xbe,0x84,0x99,0x46,0x54,0x18,0x61,0x89,0x2a,0xbc,0xa1,0x5c,0xd4,0xbb,0x5d,0xbd,0x1e,0xfa,0xf2,0x3f,0x6d,0x75,0xe4,0x9a,0x7d,0x2f,0x57,0xe2,0x7f,0x48,0xf3,0x88,0xbb,0x45,0xc3,0x56,0x8d,0xa8,0x60,0x69,0x6d,0x0b,0xd1,0x9f,0xb9,0xa1,0xae,0x4e,0xad,0xeb,0x8f,0x27,0x66,0x39,0x93,0x8c,0x1f,0x68,0xaa,0xb1,0x98,0x0c,0x29,0x20,0x9c,0x94,0x21,0x8c,0x52,0x3c,0x9d,0x21,0x91,0x52,0x11,0x39,0x7b,0x67,0x9c,0xfe,0x02,0xdd,0x04,0x41
	db	0x2a,0x42,0x24,0x11,0x5e,0xbf,0xb2,0x72,0xb5,0x3a,0xa3,0x98,0x33,0x0c,0xfa,0xa1,0x66,0xb6,0x52,0xfa,0x01,0x61,0xcb,0x94,0xd5,0x53,0xaf,0xaf,0x00,0x3b,0x86,0x2c,0xb8,0x6a,0x09,0xdb,0x06,0x4e,0x21,0x81,0x35,0x4f,0xe4,0x0c,0xc9,0xb6,0xa8,0x21,0xf5,0x2a,0x9e,0x40,0x2a,0xc1,0x24,0x65,0x81,0xa4,0xfc,0x8e,0xa4,0xb5,0x65,0x01,0x76,0x6a,0x84,0xa0,0x74,0xa4,0x90,0xf1,0xc0,0x7c,0x2f,0xcd,0x84,0xf9,0xef,0x12,0x8f,0x2b,0xaa,0x58,0x06,0x29,0x5e,0x69,0xb8,0xc8,0xfe,0xbf,0xd9,0x67,0x1b,0x59
	db	0xfa,0x9b,0xb4,0x80,0x1c,0x0d,0x2f,0x31,0x8a,0xec,0xf3,0xab,0x5e,0x51,0x79,0x59,0x88,0x1c,0xf0,0x9e,0xc0,0x33,0x70,0x72,0xcb,0x7b,0x8f,0xca,0xc7,0x2e,0xe0,0x3d,0x5d,0xb5,0x18,0x9f,0x71,0xb3,0xb9,0x99,0x1e,0x64,0x8c,0xa1,0xfa,0xe5,0x65,0xe4,0xed,0x05,0x9f,0xc2,0x36,0x11,0x08,0x61,0x8b,0x12,0x30,0x70,0x86,0x4f,0x9b,0x48,0xef,0x92,0xeb,0x3a,0x2d,0x10,0x32,0xd2,0x61,0xa8,0x16,0x61,0xb4,0x53,0x62,0xe1,0x24,0xaa,0x0b,0x19,0xe7,0xab,0x7e,0x3d,0xbf,0xbe,0x6c,0x49,0xba,0xfb,0xf5,0x49
	db	0xd4,0xcf,0x5b,0x8a,0x10,0x9a,0x94,0x30,0xeb,0x73,0x64,0xbc,0x70,0xdd,0x40,0xdc,0x1c,0x0d,0x7c,0x30,0xc1,0x94,0xc2,0x92,0x74,0x6e,0xfa,0xcb,0x6d,0xa8,0x04,0x56,0x2e,0x57,0x9c,0x1e,0x8c,0x62,0x5d,0x15,0x41,0x47,0x88,0xc5,0xac,0x86,0x4d,0x8a,0xeb,0x63,0x57,0x51,0xf6,0x52,0xa3,0x91,0x5b,0x51,0x67,0x88,0xc2,0xa6,0xa1,0x06,0xb6,0x64,0x17,0x7c,0xd4,0xd1,0x88,0x72,0x51,0x8b,0x41,0xe0,0x40,0x11,0x54,0x72,0xd1,0xf6,0xac,0x18,0x60,0x1a,0x03,0x9f,0xc6,0x42,0x27,0xfe,0x89,0x9e,0x98,0x20
	db	0x7f,0xcc,0x2d,0x3a,0xfd,0x77,0x97,0x49,0x92,0xd8,0x4f,0xa5,0x2c,0x7c,0x85,0x32,0xa0,0xe3,0x07,0xd2,0x64,0xd8,0x79,0xa2,0x29,0x7e,0xa6,0x0c,0x1d,0xed,0x03,0x04,0x2e,0xec,0xea,0x85,0x8b,0x27,0x74,0x16,0xdf,0x2b,0xcb,0x7a,0x07,0xdc,0x21,0x56,0x5a,0xf4,0xcb,0x61,0x16,0x4c,0x0a,0x64,0xd3,0x95,0x05,0xf7,0x50,0x99,0x0b,0x73,0x52,0xc5,0x4e,0x87,0x35,0x2d,0x4b,0xc9,0x8d,0x6f,0x24,0x98,0xcf,0xc8,0xe6,0xc5,0xce,0x35,0xc0,0x16,0xfa,0x46,0xcb,0xf7,0xcc,0x3d,0x30,0x08,0x43,0x45,0xd7,0x5b
	db	0xc2,0x4c,0xb2,0x28,0x95,0xd1,0x9a,0x7f,0x81,0xc1,0x35,0x63,0x65,0x54,0x6b,0x7f,0x36,0x72,0xc0,0x4f,0x6e,0xb6,0xb8,0x66,0x83,0xad,0x80,0x73,0x00,0x78,0x3a,0x13,0x2a,0x79,0xe7,0x15,0x21,0x93,0xc4,0x85,0xc9,0xdd,0xcd,0xbd,0xa2,0x89,0x4c,0xc6,0x62,0xd7,0xa3,0xad,0xa8,0x3d,0x1e,0x9d,0x2c,0xf8,0x67,0x30,0x12,0xdb,0xb7,0x5b,0xbe,0x62,0xca,0xc6,0x67,0xf4,0x61,0x09,0xee,0x52,0x19,0x21,0xd6,0x21,0xec,0x04,0x70,0x47,0xd5,0x9b,0x77,0x60,0x23,0x18,0xd2,0xe0,0xf0,0x58,0x6d,0xca,0x0d,0x74
	db	0x4e,0xce,0xcf,0x52,0x07,0xee,0x48,0xdf,0xb7,0x08,0xec,0x06,0xf3,0xfa,0xff,0xc3,0xc4,0x59,0x54,0xb9,0x2a,0x0b,0x71,0x05,0x8d,0xa3,0x3e,0x96,0xfa,0x25,0x1d,0x16,0x3c,0x43,0x78,0x04,0x57,0x8c,0x1a,0x23,0x9d,0x43,0x81,0xc2,0x0e,0x27,0xb5,0xb7,0x9f,0x07,0xd9,0xe3,0xea,0x99,0xaa,0xdb,0xd9,0x03,0x2b,0x6c,0x25,0xf5,0x03,0x2c,0x7d,0xa4,0x53,0x7b,0x75,0x18,0x0f,0x79,0x79,0x58,0x0c,0xcf,0x30,0x01,0x7b,0x30,0xf9,0xf7,0x7e,0x25,0x77,0x3d,0x90,0x31,0xaf,0xbb,0x96,0xbd,0xbd,0x68,0x94,0x69
	db	0xcf,0xfe,0xda,0xf4,0x46,0x2f,0x1f,0xbd,0xf7,0xd6,0x7f,0xa4,0x14,0x01,0xef,0x7c,0x7f,0xb3,0x47,0x4a,0xda,0xfd,0x1f,0xd3,0x85,0x57,0x90,0x73,0xa4,0x19,0x52,0x52,0x48,0x19,0xa9,0x6a,0xe6,0x3d,0xdd,0xd8,0xcc,0xd2,0xc0,0x2f,0xc2,0x64,0x50,0x48,0x2f,0xea,0xfd,0x34,0x66,0x24,0x48,0x9b,0x3a,0x2e,0x4a,0x6c,0x4e,0x1c,0x3e,0x29,0xe1,0x12,0x51,0x92,0x4b,0x13,0x6e,0x37,0xa0,0x5d,0xa1,0xdc,0xb5,0x78,0x37,0x70,0x11,0x31,0x1c,0x46,0xaf,0x89,0x45,0xb0,0x23,0x28,0x03,0x7f,0x44,0x5c,0x60,0x5b
	db	0x89,0x7c,0xc4,0x20,0x59,0x80,0x65,0xb9,0xcc,0x8f,0x3b,0x92,0x0c,0x10,0xf0,0xe7,0x77,0xef,0xe2,0x02,0x65,0x25,0x01,0x00,0xee,0xb3,0xae,0xa8,0xce,0x6d,0xa7,0x24,0x4c,0xf0,0xe7,0xf0,0xc6,0xfe,0xe9,0x3b,0x62,0x49,0xe3,0x75,0x9e,0x57,0x6a,0x86,0x1a,0xe6,0x1d,0x1e,0x16,0xef,0x42,0x55,0xd5,0xbd,0x5a,0xcc,0xf4,0xfe,0x12,0x2f,0x40,0xc7,0xc0,0xdf,0xb2,0x22,0x45,0x0a,0x07,0xa4,0xc9,0x40,0x7f,0x6e,0xd0,0x10,0x68,0xf6,0xcf,0x78,0x41,0x14,0xcf,0xc6,0x90,0x37,0xa4,0x18,0x25,0x7b,0x60,0x5e
	db	0x18,0x18,0xdf,0x6c,0x8f,0x1d,0xb3,0x58,0xa2,0x58,0x62,0xc3,0x4f,0xa7,0xcf,0x35,0x6e,0x1d,0xe6,0x66,0x4f,0xff,0xb3,0xe1,0xf7,0xd5,0xcd,0x6c,0xab,0xac,0x67,0x50,0x14,0xcf,0x96,0xa5,0x1c,0x43,0x2c,0xa0,0x00,0xe4,0xd3,0xae,0x40,0x2d,0xc4,0xe3,0xdb,0x26,0x0f,0x2e,0x80,0x26,0x45,0xd2,0x68,0x70,0x45,0x9e,0x13,0x33,0x1f,0x20,0x51,0x9d,0x03,0x08,0x6b,0x7f,0x52,0xfd,0x06,0x00,0x7c,0x01,0x64,0x49,0xb1,0x18,0xa8,0xa4,0x25,0x2e,0xb0,0x0e,0x22,0xd5,0x75,0x03,0x46,0x62,0x88,0xba,0x7c,0x39
	db	0xb2,0x59,0x59,0xf0,0x93,0x30,0xc1,0x30,0x76,0x79,0xa9,0xe9,0x8d,0xa1,0x3a,0xe2,0x26,0x5e,0x1d,0x72,0x91,0xd4,0x2f,0x22,0x3a,0x6c,0x6e,0x76,0x20,0xd3,0x39,0x23,0xe7,0x79,0x13,0xc8,0xfb,0xc3,0x15,0x78,0xf1,0x2a,0xe1,0xdd,0x20,0x94,0x61,0xa6,0xd5,0xfd,0xa8,0x85,0xf8,0xc0,0xa9,0xff,0x52,0xc2,0xe1,0xc1,0x22,0x40,0x1b,0x77,0xa7,0x2f,0x3a,0x51,0x86,0xd9,0x7d,0xd8,0x08,0xcf,0xd4,0xf9,0x71,0x9b,0xac,0xf5,0xb3,0x83,0xa2,0x1e,0x1b,0xc3,0x6b,0xd0,0x76,0x1a,0x97,0x19,0x92,0x18,0x1a,0x33
	db	0xc6,0x80,0x4f,0xfb,0x45,0x6f,0x16,0xf5,0xcf,0x75,0xc7,0x61,0xde,0xc7,0x36,0x9c,0x1c,0xd9,0x41,0x90,0x1b,0xe8,0xd4,0xe3,0x21,0xfe,0xbd,0x83,0x6b,0x7c,0x16,0x31,0xaf,0x72,0x75,0x9d,0x3a,0x2f,0x51,0x26,0x9e,0x4a,0x07,0x68,0x88,0xe2,0xcb,0x5b,0xc4,0xf7,0x80,0x11,0xc1,0xc1,0xed,0x84,0x7b,0xa6,0x49,0xf6,0x9f,0x61,0xc9,0x1a,0x68,0x10,0x4b,0x52,0x42,0x38,0x2b,0xf2,0x87,0xe9,0x9c,0xee,0x3b,0x34,0x68,0x50,0xc8,0x50,0x62,0x4a,0x84,0x71,0x9d,0xfc,0x11,0xb1,0x08,0x1f,0x34,0x36,0x24,0x61
	db	0x8d,0x89,0x4e,0x87,0xdb,0x41,0x9d,0xd9,0x20,0xdc,0x07,0x6c,0xf1,0xa5,0xfe,0x09,0xbc,0x9b,0x0f,0xd0,0x67,0x2c,0x3d,0x79,0x40,0xff,0x5e,0x9e,0x30,0xe2,0xeb,0x46,0x38,0x26,0x2d,0x1a,0xe3,0x49,0x63,0x8b,0x35,0xfd,0xd3,0x9b,0x00,0xb7,0xdf,0x9d,0xa4,0x6b,0xa0,0xa3,0xb8,0xf1,0x8b,0x7f,0x45,0x04,0xd9,0x78,0x31,0xaa,0x22,0x15,0x38,0x49,0x61,0x69,0x53,0x2f,0x38,0x2c,0x10,0x6d,0x2d,0xb7,0x9a,0x40,0xfe,0xda,0x27,0xf2,0x46,0xb6,0x91,0x33,0xc8,0xe8,0x6c,0x30,0x24,0x05,0xf5,0x70,0xfe,0x45
	db	0x8c,0x0b,0x0c,0x96,0xa6,0x75,0x48,0xda,0x20,0x2f,0x0e,0xef,0x76,0xd0,0x68,0x5b,0xd4,0x8f,0x0b,0x3d,0xcf,0x51,0xfb,0x07,0xd4,0x92,0xe3,0xa0,0x23,0x16,0x8d,0x42,0x91,0x14,0x95,0xc8,0x20,0x49,0xf2,0x62,0xa2,0x0c,0x63,0x3f,0xc8,0x07,0xf0,0x05,0xb8,0xd4,0xc9,0xf5,0xd2,0x45,0xbb,0x6f,0x45,0x22,0x7a,0xb5,0x6d,0x9f,0x61,0x16,0xfd,0x08,0xa3,0x01,0x44,0x4a,0x4f,0x08,0xac,0xca,0xa5,0x76,0xc3,0x19,0x22,0xa8,0x7d,0xbc,0xd1,0x43,0x46,0xde,0xb8,0xde,0xc6,0x38,0xbd,0x60,0x2d,0x59,0x81,0x1d
	db	0x5f,0xac,0x0d,0xa6,0x56,0x87,0x36,0x61,0x57,0xdc,0xab,0xeb,0x6a,0x2f,0xe0,0x17,0x7d,0x0f,0xce,0x4c,0x2d,0x3f,0x19,0x7f,0xf0,0xdc,0xec,0x89,0x77,0x4a,0x23,0x20,0xe8,0xc5,0x85,0x7b,0x9f,0xb6,0x65,0x87,0xb2,0xba,0x68,0xd1,0x8b,0x67,0xf0,0x6f,0x9b,0x0f,0x33,0x1d,0x7c,0xe7,0x70,0x3a,0x7c,0x8e,0xaf,0xb0,0x51,0x6d,0x5f,0x3a,0x52,0xb2,0x78,0x71,0xb6,0x0d,0xd2,0x76,0x60,0xd1,0x1e,0xd5,0xf9,0x34,0x1c,0x07,0x70,0x11,0xe4,0xb3,0x20,0x4a,0x2a,0xf6,0x66,0xe3,0xff,0x3c,0x35,0x82,0xd6,0x7c
	db	0xb6,0xfa,0x87,0xd8,0x5b,0xa4,0xe1,0x0b,0x6e,0x3b,0x40,0xba,0x32,0x6a,0x84,0x2a,0x00,0x60,0x6e,0xe9,0x12,0x10,0x92,0xd9,0x43,0x09,0xdc,0x3b,0x86,0xc8,0x38,0x28,0xf3,0xf4,0xac,0x68,0x60,0xcd,0x65,0xa6,0xd3,0xe3,0xd7,0x3c,0x18,0x2d,0xd9,0x42,0xd9,0x25,0x60,0x33,0x9d,0x38,0x59,0x57,0xff,0xd8,0x2c,0x2b,0x3b,0x25,0xf0,0x3e,0x30,0x50,0x46,0x4a,0xcf,0xb0,0x6b,0xd1,0xab,0x77,0xc5,0x15,0x41,0x6b,0x49,0xfa,0x9d,0x41,0xab,0xf4,0x8a,0xae,0xcf,0x82,0x12,0x28,0xa8,0x06,0xa6,0xb8,0xdc,0x21
	db	0xc8,0x9f,0x9d,0x8c,0x46,0x04,0x60,0x5c,0xcb,0xa3,0x2a,0xd4,0x6e,0x09,0x40,0x25,0x9c,0x2f,0xee,0x12,0x4c,0x4d,0x5b,0x12,0xab,0x1d,0xa3,0x94,0x81,0xd0,0xc3,0x0b,0xba,0x31,0x77,0xbe,0xfa,0x00,0x8d,0x9a,0x89,0x18,0x9e,0x62,0x7e,0x60,0x03,0x82,0x7f,0xd9,0xf3,0x43,0x37,0x02,0xcc,0xb2,0x8b,0x67,0x6f,0x6c,0xbf,0x0d,0x84,0x5d,0x8b,0xe1,0x9f,0x30,0x0d,0x38,0x6e,0x70,0xc7,0x65,0xe1,0xb9,0xa6,0x2d,0xb0,0x6e,0xab,0x20,0xae,0x7d,0x99,0xba,0xbb,0x57,0xdd,0x96,0xc1,0x2a,0x23,0x76,0x42,0x3a
	db	0xfa,0x84,0x70,0x8a,0x2c,0x43,0x42,0x4b,0x45,0xe5,0xb9,0xdf,0xe3,0x19,0x8a,0x89,0x5d,0xe4,0x58,0x9c,0x21,0x00,0x9f,0xbe,0xd1,0xeb,0x6d,0xa1,0xce,0x77,0xf1,0x1f,0xcb,0x7e,0x44,0xdb,0x72,0xc1,0xf8,0x3b,0xbd,0x2d,0x28,0xc6,0x1f,0xc4,0xcf,0x5f,0xfe,0x15,0xaa,0x75,0xc0,0xff,0xac,0x80,0xf9,0xa9,0xe1,0x24,0xe8,0xc9,0x70,0x07,0xfd,0xb5,0xb5,0x45,0x9a,0xd9,0x61,0xcf,0x24,0x79,0x3a,0x1b,0xe9,0x84,0x09,0x86,0x89,0x3e,0x3e,0x30,0x19,0x09,0x30,0xe7,0x1e,0x0b,0x50,0x41,0xfd,0x64,0xf2,0x39
	db	0x9c,0xe2,0xe7,0xdb,0x17,0x34,0xad,0xa7,0x9c,0x13,0x9c,0x2b,0x6a,0x37,0x94,0xbd,0xa9,0x7b,0x59,0x93,0x8e,0x1b,0xe9,0xa0,0x40,0x98,0x88,0x68,0x34,0xd7,0x12,0x17,0xe1,0x7b,0x09,0xfe,0xab,0x4a,0x9b,0xd1,0x29,0x19,0xe0,0xdf,0xe1,0xfc,0x6d,0xa4,0xff,0xf1,0xa6,0x2c,0x94,0x08,0xc9,0xc3,0x4e,0xf1,0x35,0x2c,0x27,0x21,0xc6,0x65,0xdd,0x93,0x31,0xce,0xf8,0x89,0x2b,0xe7,0xbb,0xc0,0x25,0xa1,0x56,0x33,0x10,0x4d,0x83,0xfe,0x1c,0x2e,0x3d,0xa9,0x19,0x04,0x72,0xe2,0x9c,0xb1,0x0a,0x80,0xf9,0x22
	db	0xcb,0xf8,0x9e,0x3e,0x8a,0x36,0x5a,0x60,0x15,0x47,0x50,0xa5,0x22,0xc0,0xe9,0xe3,0x8f,0x24,0x24,0x5f,0xb0,0x48,0x3d,0x55,0xe5,0x26,0x76,0x64,0xcd,0x16,0xf4,0x13,0xac,0xfd,0x6e,0x9a,0xdd,0x9f,0x02,0x42,0x41,0x49,0xa5,0x34,0xbe,0xce,0x12,0xb9,0x7b,0xf3,0xbd,0x87,0xb9,0x64,0x0f,0x64,0xb4,0xca,0x98,0x85,0xd3,0xa4,0x71,0x41,0x8c,0x4c,0xc9,0x99,0xaa,0x58,0x27,0xfa,0x07,0xb8,0x00,0xb0,0x6f,0x6f,0x00,0x23,0x92,0x53,0xda,0xad,0xdd,0x91,0xd2,0xfb,0xab,0xd1,0x4b,0x57,0xfa,0x14,0x82,0x50
	db	0x4b,0xfe,0xd6,0x3e,0x15,0x69,0x02,0xc2,0xc4,0x77,0x1d,0x51,0x39,0x67,0x5a,0xa6,0x94,0xaf,0x14,0x2c,0x46,0x26,0xde,0xcb,0x4b,0xa7,0xab,0x6f,0xec,0x60,0xf9,0x22,0xd6,0x03,0xd0,0x53,0xbb,0x15,0x1a,0x46,0x65,0xc9,0xf3,0xbc,0x88,0x28,0x10,0xb2,0x5a,0x3a,0x68,0x6c,0x75,0x76,0xc5,0x27,0x47,0xb4,0x6c,0xc8,0xa4,0x58,0x77,0x3a,0x76,0x50,0xae,0x93,0xf6,0x11,0x81,0x54,0xa6,0x54,0xfd,0x1d,0xdf,0x21,0xae,0x1d,0x65,0x5e,0x11,0xf3,0x90,0x8c,0x24,0x12,0x94,0xf4,0xe7,0x8d,0x5f,0xd1,0x9f,0x5d
	db	0x7f,0x72,0x63,0x6d,0xd3,0x08,0x14,0x03,0x33,0xb5,0xc7,0xd7,0xef,0x9a,0x37,0x6a,0x4b,0xe2,0xae,0xcc,0xc5,0x8f,0xe1,0xa9,0xd3,0xbe,0x8f,0x4f,0x91,0x35,0x2f,0x33,0x1e,0x52,0xd7,0xee,0x2a,0x4d,0x24,0x3f,0x15,0x96,0x2e,0x43,0x28,0x90,0x3a,0x8e,0xd4,0x16,0x9c,0x2e,0x77,0xba,0x64,0xe1,0xd8,0x98,0xeb,0x47,0xfa,0x87,0xc1,0x3b,0x0c,0xc2,0x86,0xea,0x15,0x01,0x47,0x6d,0x25,0xd1,0x46,0x6c,0xcb,0xb7,0x8a,0x99,0x88,0x01,0x66,0x3a,0xb5,0x32,0x78,0xd7,0x03,0xba,0x6f,0x90,0xce,0x81,0x0d,0x45
	db	0x75,0x52,0x20,0xa6,0xa1,0xb6,0x7b,0x6e,0x83,0x8e,0x3c,0x41,0xd7,0x21,0x4f,0xaa,0xb2,0x5c,0x8f,0xe8,0x55,0xd1,0x56,0x6f,0xe1,0x5b,0x34,0xa6,0x4b,0x5d,0xe2,0x2d,0x3f,0x74,0xae,0x1c,0x96,0xd8,0x74,0xd0,0xed,0x63,0x1c,0xee,0xf5,0x18,0x6d,0xf8,0x29,0xed,0xf4,0xe7,0x5b,0xc5,0xbd,0x97,0x08,0xb1,0x3a,0x66,0x79,0xd2,0xba,0x4c,0xcd,0x1f,0xd7,0xa0,0x24,0x90,0xd1,0x80,0xf8,0x8a,0x28,0xfb,0x0a,0xc2,0x25,0xc5,0x19,0x64,0x3a,0x5f,0x4b,0x97,0xa3,0xb1,0x33,0x72,0x00,0xe2,0xef,0xbc,0x7f,0x7d
	db	0x01,0x28,0x6b,0x26,0x6a,0x1e,0xef,0xfa,0x16,0x9f,0x73,0xd5,0xc4,0x68,0x6c,0x86,0x2c,0x76,0x03,0x1b,0xbc,0x2f,0x8a,0xf6,0x8d,0x5a,0xb7,0x87,0x5e,0x43,0x75,0x59,0x94,0x90,0xc2,0xf3,0xc5,0x5d,0x7c,0xcd,0xab,0x05,0x91,0x2a,0x9a,0xa2,0x81,0xc7,0x58,0x30,0x1c,0x42,0x36,0x1d,0xc6,0x80,0xd7,0xd4,0xd8,0xdc,0x96,0xd1,0x9c,0x4f,0x68,0x37,0x7b,0x6a,0xd8,0x97,0x92,0x19,0x63,0x7a,0xd1,0x1a,0x24,0x58,0xd0,0xd0,0x17,0x0c,0x1c,0x5c,0xad,0x9c,0x02,0xba,0x07,0x03,0x7a,0x38,0x84,0xd0,0xcd,0x7c
	db	0x17,0x04,0x26,0x6d,0x2c,0x42,0xa6,0xdc,0xbd,0x40,0x82,0x94,0x50,0x3d,0x15,0xae,0x77,0xc6,0x68,0xfb,0xb4,0xc1,0xc0,0xa9,0x53,0xcf,0xd0,0x61,0xed,0xd0,0x8b,0x42,0x93,0xcc,0x60,0x67,0x18,0x84,0x0c,0x9b,0x99,0x2a,0xb3,0x1a,0x7a,0x00,0xae,0xcd,0x18,0xda,0x0b,0x62,0x86,0xec,0x8d,0xa8,0x44,0xca,0x90,0x81,0x84,0xca,0x93,0x35,0xa7,0x9a,0x84,0x5e,0x9a,0x18,0x13,0x92,0xcd,0xfa,0xd8,0x65,0x35,0xc3,0xd8,0xd4,0xd1,0xbb,0xfd,0x53,0x5b,0x54,0x52,0x8c,0xe6,0x63,0x2d,0xda,0x08,0x83,0x39,0x27
	db	0x13,0xd4,0x5e,0x43,0x28,0x8d,0xc3,0x42,0xc9,0xcc,0x78,0x32,0x60,0xf3,0x50,0xbd,0xef,0x03,0xda,0x79,0x1a,0xab,0x07,0xbb,0x55,0x33,0x8c,0xbe,0xae,0x97,0x95,0x26,0x53,0x24,0x70,0x0a,0x4c,0x0e,0xa1,0xb9,0xde,0x1b,0x7d,0xd5,0x66,0x58,0xa2,0x0f,0xf7,0xda,0x27,0xcd,0xb5,0xd9,0xb9,0xff,0xfd,0x33,0x2c,0x49,0x45,0x29,0x2c,0x57,0xbe,0x30,0xcd,0xd6,0x45,0xc7,0x7f,0xc7,0xfb,0xae,0xba,0xe3,0xd3,0xe8,0xdf,0xe4,0x0c,0xda,0x5d,0xaa,0x30,0x88,0x2c,0xa2,0x80,0xca,0x5b,0xc0,0x98,0x54,0x98,0x7f
	db	0x17,0xe1,0x0b,0x9f,0x88,0xce,0x49,0x38,0x88,0xa2,0x54,0x7b,0x1b,0xad,0x05,0x80,0x1c,0x92,0xfc,0x23,0x9f,0xc3,0xa3,0x3d,0x04,0xf3,0x31,0x0a,0x47,0xec,0xc2,0x76,0x63,0x63,0xbf,0x0f,0x52,0x15,0x56,0xd3,0xa6,0xfb,0x4d,0xcf,0x45,0x5a,0x04,0x08,0xc2,0xa0,0x3f,0x87,0xbc,0x4f,0xc2,0xee,0xe7,0x12,0x9b,0xd6,0x3c,0x65,0xf2,0x30,0x85,0x0c,0xc1,0xaa,0x38,0xc9,0x08,0x8a,0xcb,0x6b,0x27,0xdb,0x60,0x9b,0x17,0x46,0x70,0xac,0x6f,0x0e,0x1e,0xc0,0x20,0xa9,0xda,0x73,0x64,0x59,0xf1,0x73,0x12,0x2f
	db	0x11,0x1e,0xe0,0x8a,0x7c,0xfc,0x39,0x47,0x9f,0xab,0x6a,0x4a,0x90,0x74,0x52,0xfd,0x2e,0x8f,0x72,0x87,0x82,0x8a,0xd9,0x41,0xf2,0x69,0x5b,0xd8,0x2a,0x57,0x9e,0x5d,0xc0,0x0b,0xa7,0x55,0xd7,0x8b,0x48,0x30,0xe7,0x42,0xd4,0xf1,0xa4,0xb5,0xd6,0x06,0x62,0x61,0x59,0xbc,0x9e,0xa6,0xd1,0xea,0x84,0xf7,0xc5,0xed,0x97,0x19,0xac,0x38,0x3b,0xb1,0x51,0xa7,0x17,0xb5,0x66,0x06,0x8c,0x85,0x9b,0x7e,0x86,0x06,0x7d,0x74,0x49,0xde,0x4d,0x45,0x11,0xc0,0xac,0xac,0x9c,0xe6,0xe9,0xbf,0x9c,0xcd,0xdf,0x22
	db	0xd9,0x0c,0x0d,0xc3,0xe0,0xd2,0xdb,0x8d,0x33,0x43,0xbb,0xac,0x5f,0x66,0x8e,0xad,0x1f,0x96,0x2a,0x32,0x8c,0x25,0x6b,0x8f,0xc7,0xc1,0x48,0x54,0xc0,0x16,0x29,0x6b,0xa1,0xe0,0x3b,0x10,0xb4,0x59,0xec,0x56,0x69,0xf9,0x59,0xd2,0xec,0xba,0xe3,0x2e,0x32,0xcd,0xf5,0x13,0x94,0xb2,0x7c,0x79,0x72,0xe4,0xcd,0x24,0x78,0x87,0xe9,0x0f,0x3b,0x91,0xba,0x0a,0xd1,0x34,0xdb,0x7e,0x0e,0xac,0x6d,0x2e,0x82,0xcd,0xa3,0x4e,0x15,0xf8,0x78,0x65,0xff,0x3d,0x08,0x66,0x17,0x0a,0xf0,0x7f,0x30,0x3f,0x30,0x4c
	db	0x85,0x8c,0xb2,0x17,0xd6,0x3b,0x0a,0xd3,0xea,0x3b,0x77,0x39,0xb7,0x77,0xd3,0xc5,0xbf,0x5c,0x6a,0x1e,0x8c,0xe7,0xc6,0xc6,0xc4,0xb7,0x2a,0x8b,0xf7,0xb8,0x61,0x0d,0x00,0x45,0xd9,0x0d,0x58,0x03,0xfc,0x29,0x93,0xec,0xbb,0x6f,0xa4,0x7a,0xd2,0xec,0xf8,0xa7,0xe2,0xc2,0x5f,0x15,0x0a,0x13,0xd5,0xa1,0x06,0xb7,0x1a,0x15,0x6b,0x41,0xb0,0x36,0xc1,0xe9,0xef,0xd7,0xa8,0x56,0x20,0x4b,0xe4,0x58,0xcd,0xe5,0x07,0xbd,0xab,0xe0,0x57,0x1b,0xda,0x2f,0xe6,0xaf,0xd2,0xe8,0x77,0x42,0xf7,0x2a,0x1a,0x19
	db	0x31,0x14,0x3c,0xc5,0x4b,0xf7,0x16,0xce,0xde,0xed,0x72,0x20,0xce,0x25,0x97,0x2b,0xe7,0x3e,0xb2,0xb5,0x6f,0xc3,0xb9,0xb8,0x08,0xc9,0x5c,0x0b,0x45,0x0e,0x2e,0x7e,0xfb,0x0e,0x46,0x4f,0x43,0x2b,0xe6,0x9f,0xd6,0x07,0x36,0xa6,0xd4,0x03,0xd3,0xde,0x24,0xda,0xa0,0xb7,0x0e,0x21,0x52,0xf0,0x93,0x5b,0x54,0x00,0xbe,0x7d,0x7e,0x23,0x30,0xb4,0x01,0x67,0xed,0x75,0x35,0x01,0x10,0xfd,0x0b,0x9f,0xe6,0x94,0x10,0x23,0x22,0x7f,0xe4,0x83,0x15,0x0f,0x32,0x75,0xe3,0x55,0x11,0xb1,0x99,0xa6,0xaf,0x71
	db	0x1d,0xb6,0x53,0x39,0x9b,0x6f,0xce,0x65,0xe6,0x41,0xa1,0xaf,0xea,0x39,0x58,0xc6,0xfe,0x59,0xf7,0xa9,0xfd,0x5f,0x43,0x0f,0x8e,0xc2,0xb1,0xc2,0xe9,0x42,0x11,0x02,0xd6,0x50,0x3b,0x47,0x1c,0x3c,0x42,0xea,0x10,0xef,0x38,0x3b,0x1f,0x7a,0xe8,0x51,0x95,0xbe,0xc9,0xb2,0x5f,0xbf,0x84,0x9b,0x1c,0x9a,0xf8,0x78,0xbc,0x1f,0x73,0x00,0x80,0x18,0xf8,0x48,0x18,0xc7,0x30,0xe4,0x19,0xc1,0xce,0x5e,0x22,0x0c,0x96,0xbf,0xe3,0x15,0xba,0x6b,0x83,0xe0,0xda,0xb6,0x08,0x58,0xe1,0x47,0x33,0x6f,0x4d,0x4c
	db	0xc9,0x1f,0x7d,0xc1,0xcf,0xec,0xf7,0x18,0x14,0x3c,0x40,0x51,0xa6,0xf5,0x75,0x6c,0xdf,0x0c,0xee,0xf7,0x2b,0x71,0xde,0xdb,0x22,0x7a,0xe4,0xa7,0xaa,0xdd,0x3f,0x19,0x70,0x19,0x8f,0x98,0xfc,0xdd,0x0c,0x2f,0x1b,0xf5,0xb9,0xb0,0x27,0x62,0x91,0x6b,0xbe,0x76,0x91,0x77,0xc4,0xb6,0xc7,0x6e,0xa8,0x9f,0x8f,0xa8,0x00,0x95,0xbf,0x38,0x6f,0x87,0xe8,0x37,0x3c,0xc9,0xd2,0x1f,0x2c,0x46,0xd1,0x18,0x5a,0x1e,0xf6,0xa2,0x76,0x12,0x24,0x39,0x82,0xf5,0x80,0x50,0x69,0x49,0x0d,0xbf,0x9e,0xb9,0x6f,0x6a
	db	0xeb,0x55,0x08,0x56,0xbb,0xc1,0x46,0x6a,0x9d,0xf0,0x93,0xf8,0x38,0xbb,0x16,0x24,0xc1,0xac,0x71,0x8f,0x37,0x11,0x1d,0xd7,0xea,0x96,0x18,0xa3,0x14,0x69,0xf7,0x75,0xc6,0x23,0xe4,0xb6,0xb5,0x22,0xb1,0xee,0x8e,0xff,0x86,0xf2,0x10,0x70,0x9d,0x93,0x8c,0x5d,0xcf,0x1d,0x83,0x2a,0xa9,0x90,0x10,0xeb,0xc5,0x42,0x9f,0xda,0x6f,0x13,0xd1,0xbd,0x05,0xa3,0xb1,0xdf,0x4c,0xf9,0x08,0x2c,0xf8,0x9f,0x9d,0x4b,0x36,0x0f,0x8a,0x58,0xbb,0xc3,0xa5,0xd8,0x87,0x2a,0xba,0xdc,0xe8,0x0b,0x51,0x83,0x21,0x02
	db	0x14,0x2d,0xad,0x5e,0x38,0x66,0xf7,0x4a,0x30,0x58,0x7c,0xca,0x80,0xd8,0x8e,0xa0,0x3d,0x1e,0x21,0x10,0xe6,0xa6,0x13,0x0d,0x03,0x6c,0x80,0x7b,0xe1,0x1c,0x07,0x6a,0x7f,0x7a,0x30,0x43,0x01,0x71,0x5a,0x9d,0x5f,0xa4,0x7d,0xc4,0x9e,0xde,0x63,0xb0,0xd3,0x7a,0x92,0xbe,0x52,0xfe,0xbb,0x22,0x6c,0x42,0x40,0xfd,0x41,0xc4,0x87,0x13,0xf8,0x8a,0x97,0x87,0xd1,0xc3,0xd3,0xb5,0x13,0x44,0x0e,0x7f,0x3d,0x5a,0x2b,0x72,0xa0,0x7c,0x47,0xbb,0x48,0x48,0x7b,0x0d,0x92,0xdc,0x1e,0xaf,0x6a,0xb2,0x71,0x31
	db	0xa8,0x4c,0x56,0x97,0x90,0x31,0x2f,0xa9,0x19,0xe1,0x75,0x22,0x4c,0xb8,0x7b,0xff,0x50,0x51,0x87,0xa4,0x37,0xfe,0x55,0x4f,0x5a,0x83,0xf0,0x3c,0x87,0xd4,0x1f,0x22,0xd1,0x47,0x8a,0xb2,0xd8,0xb7,0x0d,0xa6,0xf1,0xa4,0x70,0x17,0xd6,0x14,0xbf,0xa6,0x58,0xbd,0xdd,0x53,0x93,0xf8,0xa1,0xd4,0xe9,0x43,0x42,0x34,0x63,0x4a,0x51,0x6c,0x41,0x63,0x15,0x3a,0x4f,0x20,0x22,0x23,0x2d,0x03,0x0a,0xba,0xe9,0xe0,0x73,0xfb,0x0e,0x03,0x0f,0x41,0x4c,0xdd,0xe0,0xfc,0xaa,0x4a,0x92,0xfb,0x96,0xa5,0xda,0x48
	db	0xc7,0x9c,0xa5,0x5c,0x66,0x8e,0xca,0x6e,0xa0,0xac,0x38,0x2e,0x4b,0x25,0x47,0xa8,0xce,0x17,0x1e,0xd2,0x08,0xc7,0xaf,0x31,0xf7,0x4a,0xd8,0xca,0xfc,0xd6,0x6d,0x67,0x93,0x97,0x4c,0xc8,0x5d,0x1d,0xf6,0x14,0x06,0x82,0x41,0xef,0xe3,0xf9,0x41,0x99,0xac,0x77,0x62,0x34,0x8f,0xb8,0xf5,0xcd,0xa9,0x79,0x8a,0x0e,0xfa,0x37,0xc8,0x58,0x58,0x90,0xfc,0x96,0x85,0x68,0xf9,0x0c,0x1b,0xa0,0x56,0x7b,0xf3,0xbb,0xdc,0x1d,0x6a,0xd6,0x35,0x49,0x7d,0xe7,0xc2,0xdc,0x0a,0x7f,0xa5,0xc6,0xf2,0x73,0x4f,0x1c
	db	0xbb,0xa0,0x5f,0x30,0xbd,0x4f,0x7a,0x0e,0xad,0x63,0xc6,0x54,0xe0,0x4c,0x9d,0x82,0x48,0x38,0xe3,0x2f,0x83,0xc3,0x21,0xf4,0x42,0x4c,0xf6,0x1b,0x0d,0xc8,0x5a,0x79,0x84,0x34,0x7c,0xfc,0x6e,0x70,0x6e,0xb3,0x61,0xcf,0xc1,0xc3,0xb4,0xc9,0xdf,0x73,0xe5,0xc7,0x1c,0x78,0xc9,0x79,0x1d,0xeb,0x5c,0x67,0xaf,0x7d,0xdb,0x9a,0x45,0x70,0xb3,0x2b,0xb4,0x91,0x49,0xdb,0x91,0x1b,0xca,0xdc,0x02,0x4b,0x23,0x96,0x26,0x57,0xdc,0x78,0x8c,0x1f,0xe5,0x9e,0xdf,0x9f,0xd3,0x1f,0xe2,0x8c,0x84,0x62,0xe1,0x5f
	db	0x1a,0x96,0x94,0xe1,0x4f,0x21,0x59,0x4e,0x4f,0xcd,0x71,0x0d,0xc7,0x7d,0xbe,0x49,0x2d,0xf2,0x50,0x3b,0xd2,0xcf,0x00,0x93,0x32,0x72,0x91,0xfc,0x46,0xd4,0x89,0x47,0x08,0xb2,0x7c,0x5d,0x2d,0x85,0x79,0x28,0xe7,0xf2,0x7d,0x68,0x70,0xdd,0xde,0xb8,0x91,0x78,0x68,0x21,0xab,0xff,0x0b,0xdc,0x35,0xaa,0x7d,0x67,0x43,0xc0,0x44,0x2b,0x8e,0xb7,0x4e,0x07,0xab,0x87,0x1c,0x1a,0x67,0xf4,0xda,0x99,0x8e,0xd1,0xc6,0xfa,0x67,0x90,0x4f,0x48,0xcd,0xbb,0xac,0x3e,0xe4,0xa4,0xb9,0x2b,0xef,0x2e,0xc5,0x60
	db	0xf1,0x8b,0xfd,0x3b,0xbc,0x89,0x5d,0x0b,0x1a,0x55,0xf3,0xc9,0x37,0x92,0x6b,0xb0,0xf5,0x28,0x30,0xd5,0xb0,0x16,0x4c,0x0e,0xab,0xca,0xcf,0x2c,0x31,0x9c,0xbc,0x10,0x11,0x6d,0xae,0x7c,0xc2,0xc5,0x2b,0x70,0xab,0x8c,0xa4,0x54,0x9b,0x69,0xc7,0x44,0xb2,0x2e,0x49,0xba,0x56,0x40,0xbc,0xef,0x6d,0x67,0xb6,0xd9,0x48,0x72,0xd7,0x70,0x5b,0xa0,0xc2,0x3e,0x4b,0xe8,0x8a,0xaa,0xe0,0x81,0x17,0xed,0xf4,0x9e,0x69,0x98,0xd1,0x85,0x8e,0x70,0xe4,0x13,0x45,0x79,0x13,0xf4,0x76,0xa9,0xd3,0x5b,0x75,0x63
	db	0x53,0x08,0xd1,0x2a,0x3e,0xa0,0x5f,0xb5,0x69,0x35,0xe6,0x9e,0x90,0x75,0x6f,0x35,0x90,0xb8,0x69,0xbe,0xfd,0xf1,0xf9,0x9f,0x84,0x6f,0xc1,0x8b,0xc4,0xc1,0x8c,0x0d,0xb7,0xac,0xf1,0x97,0x18,0x10,0xc7,0x3d,0xd8,0xbb,0x65,0xc1,0x5e,0x7d,0xda,0x5d,0x0f,0x02,0xa1,0x0f,0x9c,0x5b,0x8e,0x50,0x56,0x2a,0xc5,0x37,0x17,0x75,0x63,0x27,0xa9,0x19,0xb4,0x6e,0xd3,0x02,0x94,0x02,0xa5,0x60,0xb4,0x77,0x7e,0x4e,0xb4,0xf0,0x56,0x49,0x3c,0xd4,0x30,0x62,0xa8,0xcf,0xe7,0x66,0xd1,0x7a,0x8a,0xdd,0xc2,0x70
	db	0x0e,0xec,0x6f,0x9f,0x50,0x94,0x61,0x65,0x8d,0x51,0xc6,0x46,0xa9,0x7e,0x2e,0xee,0x5c,0x9b,0xe0,0x67,0xf3,0xc1,0x33,0x97,0x95,0x84,0x94,0x63,0x63,0xac,0x0f,0x2e,0x13,0x7e,0xed,0xb8,0x7d,0x96,0xd4,0x91,0x7a,0x81,0x76,0xd7,0x0a,0x2f,0x25,0x74,0x64,0x25,0x85,0x0d,0xe0,0x82,0x09,0xe4,0xe5,0x3c,0xa5,0x16,0x38,0x61,0xb8,0x32,0x64,0xcd,0x48,0xe4,0xbe,0xf7,0xe7,0x79,0xd0,0x86,0x78,0x08,0x67,0x3a,0xc8,0x6a,0x2e,0xdb,0xe4,0xa0,0xd9,0xd4,0x9f,0xf8,0x41,0x4f,0x5a,0x73,0x5c,0x21,0x79,0x41
	db	0x2a,0xed,0xdc,0xd7,0xe7,0x94,0x70,0x8c,0x70,0x9c,0xd3,0x47,0xc3,0x8a,0xfb,0x97,0x02,0xd9,0x06,0xa9,0x33,0xe0,0x3b,0xe1,0x76,0x9d,0xd9,0x0c,0xa3,0x44,0x03,0x70,0x34,0xcd,0x6b,0x28,0xb9,0x33,0xae,0xe4,0xdc,0xd6,0x9d,0x55,0xb6,0x7e,0xef,0xb7,0x1f,0x8e,0xd3,0xb3,0x1f,0x14,0x8b,0x27,0x86,0xc2,0x41,0x22,0x66,0x85,0xfa,0x31,0xf4,0x22,0x36,0x2e,0x42,0x6c,0x82,0xaf,0x2d,0x50,0x33,0x98,0x87,0x29,0x20,0xc1,0x23,0x91,0x38,0x2b,0xe1,0xb7,0xc1,0x9b,0x89,0x24,0x95,0xa9,0x12,0x23,0xbb,0x24
	db	0xc3,0x67,0xde,0x32,0x17,0xed,0xa8,0xb1,0x48,0x49,0x1b,0x46,0x18,0x94,0xb4,0x3c,0xd2,0xbc,0xcf,0x76,0x43,0x43,0xbd,0x8e,0x08,0x80,0x18,0x1e,0x87,0x3e,0xee,0x0f,0x6b,0x5c,0xf8,0xf5,0x2a,0x0c,0xf8,0x41,0x94,0x67,0xfa,0x04,0xc3,0x84,0x72,0x68,0xad,0x1b,0xba,0xa3,0x99,0xdf,0x45,0x89,0x16,0x5d,0xeb,0xff,0xf9,0x2a,0x1d,0x0d,0xdf,0x1e,0x62,0x32,0xa1,0x8a,0xda,0xa9,0x79,0x65,0x22,0x59,0xa1,0x22,0xb8,0x30,0x93,0xc1,0x9a,0xa7,0x7b,0x19,0x04,0x40,0x76,0x1d,0x53,0x18,0x97,0xd7,0xac,0x16
	db	0x3d,0x1d,0x9b,0x2d,0xaf,0x72,0xdf,0x72,0x5a,0x24,0x32,0xa4,0x36,0x2a,0x46,0x63,0x37,0x96,0xb3,0x16,0x79,0xa0,0xce,0x3e,0x09,0x23,0x30,0xb9,0xf6,0x0e,0x3e,0x12,0xad,0xb6,0x87,0x78,0xc5,0xc6,0x59,0xc9,0xba,0xfe,0x90,0x5f,0xad,0x9e,0xe1,0x94,0x04,0xf5,0x42,0xa3,0x62,0x4e,0xe2,0x16,0x00,0x17,0x16,0x18,0x4b,0xd3,0x4e,0x16,0x9a,0xe6,0x2f,0x19,0x4c,0xd9,0x7e,0x48,0x13,0x15,0x91,0x3a,0xea,0x2c,0xae,0x61,0x27,0xde,0xa4,0xb9,0xd3,0xf6,0x7b,0x87,0xeb,0xf3,0x73,0x10,0xc6,0x0f,0xda,0x78
	db	0x6a,0xc6,0x2b,0xe5,0x28,0x5d,0xf1,0x5b,0x8e,0x1a,0xf0,0x70,0x18,0xe3,0x47,0x2c,0xdd,0x8b,0xc2,0x06,0xbc,0xaf,0x19,0x24,0x3a,0x17,0x6b,0x25,0xeb,0xde,0x25,0x2d,0x94,0x3a,0x0c,0x68,0xf1,0x80,0x9f,0xa2,0xe6,0xe7,0xe9,0x1a,0x15,0x7e,0xf7,0x71,0x73,0x79,0x01,0x48,0x58,0xf1,0x00,0x11,0xdd,0x8d,0xb3,0x16,0xb3,0xa4,0x4a,0x05,0xb8,0x7c,0x26,0x19,0x8d,0x46,0xc8,0xdf,0xaf,0x4d,0xe5,0x66,0x9c,0x78,0x28,0x0b,0x17,0xec,0x6e,0x66,0x2a,0x1d,0xeb,0x2a,0x60,0xa7,0x7d,0xab,0xa6,0x10,0x46,0x13
	db	0xfe,0xb0,0xf6,0x8d,0xc7,0x8e,0x13,0x51,0x1b,0xf5,0x75,0xe5,0x89,0xda,0x97,0x53,0xb9,0xf1,0x7a,0x71,0x1d,0x7a,0x20,0x09,0x50,0xd6,0x20,0x2b,0xba,0xfd,0x02,0x21,0x15,0xf5,0xd1,0x77,0xe7,0x65,0x2a,0xcd,0xf1,0x60,0xaa,0x8f,0x87,0x91,0x89,0x54,0xe5,0x06,0xbc,0xda,0xbc,0x3b,0xb7,0xb1,0xfb,0xc9,0x7c,0xa9,0xcb,0x78,0x48,0x65,0xa1,0xe6,0x5c,0x05,0x05,0xe4,0x9e,0x96,0x29,0xad,0x51,0x12,0x68,0xa7,0xbc,0x36,0x15,0xa4,0x7d,0xaa,0x17,0xf5,0x1a,0x3a,0xba,0xb2,0xec,0x29,0xdb,0x25,0xd7,0x0a
	db	0x57,0x24,0x4e,0x83,0xb1,0x67,0x42,0xdc,0xc5,0x1b,0xce,0x70,0xb5,0x44,0x75,0xb6,0xd7,0x5e,0xd1,0xf7,0x0b,0x7a,0xf0,0x1a,0x50,0x36,0xa0,0x71,0xfb,0xcf,0xef,0x4a,0x85,0x6f,0x05,0x9b,0x0c,0xbc,0xc7,0xfe,0xd7,0xff,0xf5,0xe7,0x68,0x52,0x7d,0x53,0xfa,0xae,0x12,0x43,0x62,0xc6,0xaf,0x77,0xd9,0x9f,0x39,0x02,0x53,0x5f,0x67,0x4f,0x1e,0x17,0x15,0x04,0x36,0x36,0x2d,0xc3,0x3b,0x48,0x98,0x89,0x11,0xef,0x2b,0xcd,0x10,0x51,0x94,0xd0,0xad,0x6e,0x0a,0x87,0x61,0x65,0xa8,0xa2,0x72,0xbb,0xcc,0x0b
	db	0xc8,0xa9,0xb1,0xea,0x2f,0x96,0x5e,0x18,0xcd,0x7d,0x14,0x65,0x35,0xe6,0xe7,0x86,0xf2,0x6d,0x5b,0xbb,0x31,0xe0,0x92,0xb0,0x3e,0xb7,0xd6,0x59,0xab,0xf0,0x24,0x40,0x96,0x12,0xfe,0x50,0x4c,0x5e,0x6d,0x18,0x7e,0x9f,0xe8,0xfe,0x82,0x7b,0x39,0xe0,0xb0,0x31,0x70,0x50,0xc5,0xf6,0xc7,0x3b,0xc2,0x37,0x8f,0x10,0x69,0xfd,0x78,0x66,0xc2,0x63,0x68,0x63,0x31,0xfa,0x86,0x15,0xf2,0x33,0x2d,0x57,0x48,0x8c,0xf6,0x07,0xfc,0xae,0x9e,0x78,0x9f,0xcc,0x73,0x4f,0x01,0x47,0xad,0x8e,0x10,0xe2,0x42,0x2d
	db	0x9b,0xd2,0xdf,0x94,0x15,0x13,0xf5,0x97,0x6a,0x4c,0x3f,0x31,0x5d,0x98,0x55,0x61,0x10,0x50,0x45,0x08,0x07,0x3f,0xa1,0xeb,0x22,0xd3,0xd2,0xb8,0x08,0x26,0x6b,0x67,0x93,0x75,0x53,0x0f,0x0d,0x7b,0x71,0x21,0x4c,0x06,0x1e,0x13,0x0b,0x69,0x4e,0x91,0x9f,0xe0,0x2a,0x75,0xae,0x87,0xb6,0x1b,0x6e,0x3c,0x42,0x9b,0xa7,0xf3,0x0b,0x42,0x47,0x2b,0x5b,0x1c,0x65,0xba,0x38,0x81,0x80,0x1b,0x1b,0x31,0xec,0xb6,0x71,0x86,0xb0,0x35,0x31,0xbc,0xb1,0x0c,0xff,0x7b,0xe0,0xf1,0x0c,0x9c,0xfa,0x2f,0x5d,0x74
	db	0xbd,0xc8,0xc9,0x2b,0x1e,0x5a,0x52,0xbf,0x81,0x9d,0x47,0x26,0x08,0x26,0x5b,0xea,0xdb,0x55,0x01,0xdf,0x0e,0xc7,0x11,0xd5,0xd0,0xf5,0x0c,0x96,0xeb,0x3c,0xe2,0x1a,0x6a,0x4e,0xd3,0x21,0x57,0xdf,0x36,0x60,0xd0,0xb3,0x7b,0x99,0x27,0x88,0xdb,0xb1,0xfa,0x6a,0x75,0xc8,0xc3,0x09,0xc2,0xd3,0x39,0xc8,0x1d,0x4c,0xe5,0x5b,0xe1,0x06,0x4a,0x99,0x32,0x19,0x87,0x5d,0x72,0x5b,0xb0,0xda,0xb1,0xce,0xb5,0x1c,0x35,0x32,0x05,0xca,0xb7,0xda,0x49,0x15,0xc4,0x7d,0xf7,0xc1,0x8e,0x27,0x61,0xd8,0xde,0x58
	db	0x5c,0xc5,0x66,0xf2,0x93,0x37,0x17,0xd8,0x49,0x4e,0x45,0xcc,0xc5,0x76,0xc9,0xc8,0xa8,0xc3,0x26,0xbc,0xf8,0x82,0xe3,0x5c,0xf9,0xf6,0x85,0x54,0xe8,0x9d,0xf3,0x2f,0xa8,0xc9,0xc2,0xb6,0xa8,0x5b,0xfb,0x2d,0x8c,0x59,0x2c,0xf5,0x8e,0xef,0xee,0x48,0x73,0x15,0x2d,0xf1,0x07,0x91,0x80,0x33,0xd8,0x5b,0x1d,0x53,0x6b,0x69,0xba,0x08,0x7a,0xc5,0xef,0xc3,0xee,0x3e,0xed,0x77,0x11,0x48,0xff,0xd4,0x17,0x55,0xe0,0x04,0xcb,0x71,0xa6,0xf1,0x3f,0x7a,0x3d,0xea,0x54,0xfe,0x7c,0x94,0xb4,0x33,0x06,0x12
	db	0x42,0x00,0x61,0x91,0x78,0x98,0x94,0x0b,0xe8,0xfa,0xeb,0xec,0x3c,0xb1,0xe7,0x4e,0xc0,0xa4,0xf0,0x94,0x95,0x73,0xbe,0x70,0x85,0x91,0xd5,0xb4,0x99,0x0a,0xd3,0x35,0x0a,0x10,0x12,0x49,0x47,0x31,0xbd,0x82,0x06,0xbe,0x6f,0x7e,0x6d,0x7b,0x23,0xde,0xc6,0x79,0xea,0x11,0x19,0x76,0x1e,0xe1,0xde,0x3b,0x39,0xcb,0xe3,0x3b,0x43,0x07,0xf4,0x97,0xe9,0x5c,0xc0,0x44,0x79,0xff,0xa3,0x51,0x5c,0xb0,0xe4,0x3d,0x5d,0x57,0x7c,0x84,0x76,0x5a,0xfd,0x81,0x33,0x58,0x9f,0xda,0xf6,0x7a,0xde,0x3e,0x87,0x2d
	db	0x09,0x34,0x37,0x43,0x64,0x31,0x7a,0x15,0xd9,0x81,0xaa,0xf4,0xee,0xb7,0xb8,0xfa,0x06,0x48,0xa6,0xf5,0xe6,0xfe,0x93,0xb0,0xb6,0xa7,0x7f,0x70,0x54,0x36,0x77,0x2e,0x81,0xf9,0x5d,0x4e,0xe1,0x02,0x62,0xaa,0xf5,0xe1,0x15,0x50,0x17,0x59,0x0d,0xa2,0x6c,0x1d,0xe2,0xba,0xd3,0x75,0xa2,0x18,0x53,0x02,0x60,0x01,0x8a,0x61,0x43,0x05,0xc1,0x23,0x4c,0x97,0xf4,0xbd,0xea,0x0d,0x93,0x46,0xce,0x9d,0x25,0x0a,0x6f,0xaa,0x2c,0xba,0x9a,0xa2,0xb8,0x2c,0x20,0x04,0x0d,0x96,0x07,0x2d,0x36,0x43,0x14,0x4b
	db	0x7a,0x1f,0x6e,0xb6,0xc7,0xb7,0xc4,0xcc,0x7e,0x2f,0x0c,0xf5,0x25,0x7e,0x15,0x44,0x1c,0xaf,0x3e,0x71,0xfc,0x6d,0xf0,0x3e,0xf7,0x63,0xda,0x52,0x67,0x44,0x2f,0x58,0xcb,0x9c,0x52,0x1c,0xe9,0x54,0x7c,0x96,0xfb,0x35,0xc6,0x64,0x92,0x26,0xf6,0x30,0x65,0x19,0x12,0x78,0xf4,0xaf,0x47,0x27,0x5c,0x6f,0xf6,0xea,0x18,0x84,0x03,0x17,0xe4,0x4c,0x32,0x20,0xd3,0x7b,0x31,0xc6,0xc4,0x8b,0x48,0xa4,0xe8,0x42,0x10,0xa8,0x64,0x13,0x5a,0x4e,0x8b,0xf1,0x1e,0xb2,0xc9,0x8d,0xa2,0xcd,0x4b,0x1c,0x2a,0x0c
	db	0x47,0x04,0x1f,0x6f,0xd0,0xc7,0x4d,0xd2,0x59,0xc0,0x87,0xdb,0x3e,0x9e,0x26,0xb2,0x8f,0xd2,0xb2,0xfb,0x72,0x02,0x5b,0xd1,0x77,0x48,0xf6,0xc6,0xd1,0x8b,0x55,0x7c,0x45,0x69,0xbd,0x69,0x48,0x81,0xc4,0xed,0x22,0x8d,0x1c,0xbe,0x7d,0x90,0x6d,0x0d,0xab,0xc5,0x5c,0xd5,0x12,0xd2,0x3b,0xc6,0x83,0xdc,0x14,0xa3,0x30,0x9b,0x6a,0x5a,0x3d,0x46,0x96,0xd3,0x24,0x15,0xec,0xd0,0xf0,0x24,0x5a,0xc3,0x8a,0x62,0xbb,0x12,0xa4,0x5f,0xbc,0x1c,0x79,0x3a,0x0c,0xa5,0xc3,0xaf,0xfb,0x0a,0xca,0xa5,0x04,0x04
	db	0xd6,0x43,0xa7,0x0a,0x07,0x40,0x1f,0x8c,0xe8,0x5e,0x26,0x5b,0xcb,0xd0,0xba,0xcc,0xde,0xd2,0x8f,0x66,0x6b,0x04,0x4b,0x57,0x33,0x96,0xdd,0xca,0xfd,0x5b,0x39,0x46,0xd1,0x6f,0x41,0x2a,0x1b,0x9e,0xbc,0x62,0x8b,0x59,0x50,0xe3,0x28,0xf7,0xc6,0xb5,0x67,0x69,0x5d,0x3d,0xd8,0x3f,0x34,0x04,0x98,0xee,0xf8,0xe7,0x16,0x75,0x52,0x39,0x9c,0x9a,0x5d,0x1a,0x2d,0xdb,0x7f,0x11,0x2a,0x5c,0x00,0xd1,0xbc,0x45,0x77,0x9c,0xea,0x6f,0xd5,0x54,0xf1,0xbe,0xd4,0xef,0x16,0xd0,0x22,0xe8,0x29,0x9a,0x57,0x76
	db	0x17,0x2a,0xc0,0x49,0x7e,0x8e,0xb6,0x45,0x7f,0xa3,0xa9,0xbc,0xa2,0x51,0xcd,0x23,0x1b,0x4c,0x22,0xec,0x11,0x5f,0xd6,0x3e,0xb1,0xbd,0x05,0x9e,0xdc,0x84,0xa3,0x43,0xf2,0x34,0xb4,0x52,0x13,0xb5,0x3c,0x33,0xe1,0x80,0xde,0x93,0x49,0x28,0x32,0xd8,0xce,0x35,0x0d,0x75,0x87,0x28,0x51,0xb5,0xc1,0x77,0x27,0x2a,0xbb,0x14,0xc5,0x02,0x45,0xb6,0xf1,0x8b,0xda,0xd5,0x4b,0x68,0x53,0x4b,0xb5,0xf6,0x7e,0xd3,0x8b,0xfb,0x53,0xd2,0xb0,0xa9,0xd7,0x16,0x39,0x31,0x59,0x80,0x54,0x61,0x09,0x92,0x60,0x11
	db	0xaa,0xcf,0xda,0x29,0x69,0x16,0x4d,0xb4,0x8f,0x59,0x13,0x84,0x4c,0x9f,0x52,0xda,0x59,0x55,0x3d,0x45,0xca,0x63,0xef,0xe9,0x0b,0x8e,0x69,0xc5,0x5b,0x12,0x1e,0x35,0xcd,0x4d,0x9b,0x36,0x16,0x56,0x38,0x7a,0x63,0x35,0x5c,0x65,0xa7,0x2c,0xc0,0x75,0x21,0x80,0xf1,0xd4,0xf9,0x1b,0xc2,0x7d,0x42,0xe0,0xe6,0x91,0x74,0x7d,0x63,0x2f,0xbe,0x7b,0xf6,0x1a,0x46,0x9b,0xb4,0xd4,0x61,0x89,0xab,0xc8,0x7a,0x03,0x03,0xd6,0xfb,0x99,0xa6,0xf9,0x9f,0xe1,0xde,0x71,0x9a,0x2a,0xce,0xe7,0x06,0x2d,0x18,0x7f
	db	0xec,0x68,0x01,0xab,0x64,0x8e,0x7c,0x7a,0x43,0xc5,0xed,0x15,0x55,0x4a,0x5a,0xcb,0xda,0x0e,0xcd,0x47,0xd3,0x19,0x55,0x09,0xb0,0x93,0x3e,0x34,0x8c,0xac,0xd4,0x67,0x22,0x75,0x21,0x8e,0x72,0x4b,0x45,0x09,0xd8,0xb8,0x84,0xd4,0xf4,0xe8,0x58,0xaa,0x3c,0x90,0x46,0x7f,0x4d,0x25,0x58,0xd3,0x17,0x52,0x1c,0x24,0x43,0xc0,0xac,0x44,0x77,0x57,0x7a,0x4f,0xbb,0x6b,0x7d,0x1c,0xe1,0x13,0x83,0x91,0xd4,0xfe,0x35,0x8b,0x84,0x46,0x6b,0xc9,0xc6,0xa1,0xdc,0x4a,0xbd,0x71,0xad,0x12,0x83,0x1c,0x6d,0x55
	db	0x82,0x39,0x8d,0x0c,0xe3,0x40,0xef,0x17,0x34,0xfa,0xa3,0x15,0x3e,0x07,0xf7,0x31,0x6e,0x64,0x73,0x07,0xcb,0xf3,0x21,0x4f,0xff,0x4e,0x82,0x1d,0x6d,0x6c,0x6c,0x74,0x21,0xe8,0x1b,0xb1,0x56,0x67,0xf0,0x81,0xdd,0xf3,0xa3,0x10,0x23,0xf8,0xaf,0x0f,0x5d,0x46,0x99,0x6a,0x55,0xd0,0xb2,0xf8,0x05,0x7f,0x8c,0xcc,0x38,0xbe,0x7a,0x09,0xa4,0x2d,0xa5,0x7e,0x87,0xc9,0x49,0x0c,0x43,0x1d,0xdc,0x9b,0x55,0x69,0x43,0x4c,0xd2,0xeb,0xcc,0xf7,0x09,0x38,0x2c,0x02,0xbd,0x84,0xee,0x4b,0xa3,0x14,0x7e,0x57
	db	0x0a,0x3b,0xa7,0x61,0xac,0x68,0xe2,0xf0,0xf5,0xa5,0x91,0x37,0x10,0xfa,0xfa,0xf2,0xe9,0x00,0x6d,0x6b,0x82,0x3e,0xe1,0xc1,0x42,0x8f,0xd7,0x6f,0xe9,0x7e,0xfa,0x60,0x2b,0xd7,0x4d,0xbd,0xbe,0xce,0xfe,0x94,0x11,0x22,0x0f,0x06,0xda,0x4f,0x6a,0xf4,0xff,0xd1,0xc8,0xc0,0x77,0x59,0x4a,0x12,0x95,0x92,0x00,0xfb,0xb8,0x04,0x53,0x70,0xc6,0x6e,0x29,0x4d,0x35,0x1d,0x3d,0xb6,0xd8,0x31,0xad,0x5f,0x3e,0x05,0xc3,0xf3,0xec,0x42,0xbd,0xb4,0x8c,0x95,0x0b,0x67,0xfd,0x53,0x63,0xa1,0x0c,0x8e,0x39,0x21
	db	0xf3,0x33,0x2b,0x38,0x8a,0x05,0xf5,0x89,0xb4,0xc0,0x48,0xad,0x0b,0xba,0xe2,0x5a,0x6e,0xb3,0x3d,0xa5,0x03,0xb5,0x93,0x8f,0xe6,0x32,0xa2,0x95,0x9d,0xed,0xa3,0x5a,0x01,0x56,0xb7,0xb4,0xf9,0xaa,0x98,0x27,0x72,0xad,0x8d,0x5c,0x13,0x72,0xac,0x5e,0x23,0xa0,0xb7,0x61,0x61,0xaa,0xce,0xd2,0x4e,0x7d,0x8f,0xe9,0x84,0xb2,0xbf,0x1b,0x61,0x65,0xd9,0xc7,0xe9,0x77,0x67,0x65,0x36,0x80,0xc7,0x72,0x54,0x12,0x2b,0xcb,0xee,0x6e,0x50,0xd9,0x99,0x32,0x05,0x65,0xcc,0x57,0x89,0x5e,0x4e,0xe1,0x07,0x4a
	db	0x99,0xf9,0x0d,0x98,0xcb,0x12,0xe4,0x4e,0x71,0xc7,0x6e,0x3c,0x6f,0xd7,0x15,0xa3,0xfd,0x77,0x5c,0x92,0xde,0xed,0xa5,0xbb,0x02,0x34,0x31,0x1d,0x39,0xac,0x0b,0x3f,0x9b,0xa4,0x77,0xc4,0xcd,0x58,0x0b,0x24,0x17,0xf0,0x47,0x64,0xde,0xda,0x38,0xfd,0xad,0x6a,0xc8,0xa7,0x32,0x8d,0x92,0x19,0x81,0xa0,0xaf,0x84,0xed,0x7a,0xaf,0x50,0xe5,0x5b,0xf6,0x15,0x01,0xde,0x4f,0x6e,0xb2,0x09,0x61,0x21,0x21,0x26,0x98,0x29,0xd9,0xd6,0xad,0x0b,0x81,0x05,0x02,0x78,0x06,0xd0,0xeb,0xba,0x16,0xa3,0x21,0x19
	db	0xfc,0x70,0xb8,0xdf,0x7e,0x2f,0x42,0x89,0xbd,0xb3,0x76,0x4f,0xeb,0x6b,0x29,0x2c,0xf7,0x4d,0xc2,0x36,0xd4,0xf1,0x38,0x07,0xb0,0xae,0x73,0xe2,0x41,0xdf,0x58,0x64,0x8b,0xc1,0xf3,0xd9,0x9a,0xad,0x5a,0xd7,0x9c,0xc1,0xb1,0x60,0xef,0x0e,0x6a,0x56,0xd9,0x0e,0x5c,0x25,0xac,0x0b,0x9a,0x3e,0xf5,0xc7,0x62,0xa0,0xec,0x9d,0x04,0x7b,0x83,0x44,0x44,0x35,0x7a,0xe3,0xcb,0xdc,0x93,0xbe,0xed,0x0f,0x33,0x79,0x88,0x75,0x87,0xdd,0xc5,0x12,0xc3,0x04,0x60,0x78,0x64,0x0e,0x95,0xc2,0xcb,0xdc,0x93,0x60
	db	0x6d,0x70,0xe0,0x85,0x85,0x9a,0xf3,0x1f,0x33,0x39,0xe7,0xb3,0xd8,0xa5,0xd0,0x36,0x3b,0x45,0x8f,0x71,0xe1,0xf2,0xb9,0x43,0x7c,0xa9,0x27,0x48,0x08,0xea,0xd1,0x57,0x4b,0x03,0x84,0x60,0xbe,0xee,0xde,0x6b,0x54,0xb8,0x0f,0x78,0xb6,0xc2,0x99,0x31,0x95,0x06,0x2d,0xb6,0xab,0x76,0x33,0x97,0x90,0x7d,0x64,0x8b,0xc9,0x80,0x31,0x6e,0x71,0xb0,0x28,0xa1,0xe7,0xb6,0x7a,0xee,0xaa,0x8b,0xa8,0x93,0x6d,0x59,0xc1,0xa4,0x30,0x61,0x21,0xb2,0x82,0xde,0xb4,0xf7,0x18,0xbd,0x97,0xdd,0x9d,0x99,0x3e,0x36
	db	0xc4,0x1f,0xee,0x35,0xc1,0x43,0xa8,0x96,0xcf,0xc8,0xe4,0x08,0x55,0xb3,0x6e,0x97,0x30,0xd3,0x8c,0xb5,0x01,0x68,0x2f,0xb4,0x2b,0x05,0x3a,0x69,0x78,0x9b,0xee,0x48,0xc6,0xae,0x4b,0xe2,0xdc,0x48,0x18,0x2f,0x60,0xaf,0xbc,0xba,0x55,0x72,0x9b,0x76,0x31,0xe9,0xef,0x3c,0x6e,0x3c,0xcb,0x90,0x55,0xb3,0xf9,0xc6,0x9b,0x97,0x1f,0x23,0xc6,0xf3,0x2a,0xcc,0x4b,0xde,0x31,0x5c,0x1f,0x8d,0x20,0xfe,0x30,0xb0,0x4b,0xb0,0x66,0xb4,0x4f,0xc1,0x09,0x70,0x8d,0xb7,0x13,0x24,0x79,0x08,0x9b,0xfa,0x9b,0x07
	db	0xf4,0x0d,0x30,0xda,0x51,0x3a,0x90,0xe3,0xb0,0x5a,0xa9,0x3d,0x23,0x64,0x39,0x84,0x80,0x64,0x35,0x0b,0x2d,0xf1,0x3c,0xed,0x94,0x71,0x81,0x84,0xf6,0x77,0x8c,0x03,0x45,0x42,0xd5,0xa2,0x80,0xed,0xc9,0xf3,0x52,0x39,0xf6,0x77,0x78,0x8b,0xa0,0x0a,0x75,0x54,0x08,0xd1,0x63,0xac,0x6d,0xd7,0x6b,0x63,0x70,0x94,0x15,0xfb,0xf4,0x1e,0xec,0x7b,0x16,0x5b,0xe6,0x5e,0x4e,0x85,0xc2,0xcd,0xd0,0x96,0x42,0x0a,0x59,0x59,0x99,0x21,0x10,0x98,0x34,0xdf,0xb2,0x72,0x56,0xff,0x0b,0x4a,0x2a,0xe9,0x5e,0x57
	db	0xcf,0x2f,0x18,0x8a,0x90,0x80,0xc0,0xd4,0xbd,0x9d,0x48,0x99,0xc2,0x70,0xe1,0x30,0xde,0x33,0xf7,0x52,0x57,0xbd,0xba,0x05,0x00,0xfd,0xd3,0x2c,0x11,0xe7,0xd4,0x43,0x01,0xd8,0xa4,0x0a,0x45,0xbc,0x46,0x5d,0xd8,0xb9,0x33,0xa5,0x27,0x12,0xaf,0xc3,0xc2,0x06,0x89,0x2b,0x26,0x3b,0x9e,0x38,0x1b,0x58,0x2f,0x38,0x7e,0x1e,0x0a,0x20,0xc5,0x3a,0xf9,0xea,0x67,0xb9,0x8d,0x51,0xc0,0x52,0x66,0x05,0x9b,0x98,0xbc,0x71,0xf5,0x97,0x71,0x56,0xd9,0x85,0x2b,0xfe,0x38,0x4e,0x1e,0x65,0x52,0xca,0x0e,0x05
	db	0x9c,0x0c,0x3f,0x45,0xde,0x1a,0x43,0xc3,0x9b,0x3b,0x70,0xff,0x5e,0x04,0xf5,0xe9,0x3d,0x7b,0x84,0xed,0xc9,0x7a,0xd9,0xfc,0xc6,0xf4,0x58,0x1c,0xc2,0xe6,0x0e,0x4b,0xea,0x68,0xe6,0x60,0x76,0x39,0xac,0x97,0x97,0xb4,0x3a,0x15,0xfe,0xbb,0x19,0x9b,0x9f,0xa7,0xec,0x34,0xb5,0x79,0xb1,0x4c,0x57,0xae,0x31,0xa1,0x9f,0xc0,0x51,0x61,0x96,0x5d,0xf0,0xfd,0x0d,0x5c,0xf5,0x3a,0x7a,0xee,0xb4,0x2a,0xe0,0x2e,0x26,0xdd,0x09,0x17,0x17,0x12,0x87,0xbb,0xb2,0x11,0x0b,0x03,0x0f,0x80,0xfa,0x24,0xef,0x1f
	db	0x96,0x31,0xa7,0x1a,0xfb,0x53,0xd6,0x37,0x18,0x64,0xd7,0x3f,0x30,0x95,0x94,0x0f,0xb2,0x17,0x3a,0xfb,0x09,0x0b,0x20,0xad,0x3e,0x61,0xc8,0x2f,0x29,0x49,0x4d,0x54,0x86,0x6b,0x97,0x30,0xf5,0xaf,0xd2,0x22,0x04,0x46,0xd2,0xc2,0x06,0xb8,0x90,0x8d,0xe5,0xba,0xe5,0x4d,0x6c,0x89,0xa1,0xdc,0x17,0x0c,0x34,0xc8,0xe6,0x5f,0x00,0x28,0x88,0x86,0x52,0x34,0x9f,0xba,0xef,0x6a,0xa1,0x7d,0x10,0x25,0x94,0xff,0x1b,0x5c,0x36,0x4b,0xd9,0x66,0xcd,0xbb,0x5b,0xf7,0xfa,0x6d,0x31,0x0f,0x93,0x72,0xe4,0x72
	db	0x4f,0x08,0x81,0x97,0x8c,0x20,0x95,0x26,0xe1,0x0e,0x45,0x23,0x0b,0x2a,0x50,0xb1,0x02,0xde,0xef,0x03,0xa6,0xae,0x9d,0xfd,0x4c,0xa3,0x33,0x27,0x8c,0x2e,0x9d,0x5a,0x27,0x76,0x2a,0xd3,0x35,0xf6,0xf3,0x07,0xf0,0x66,0x65,0x5f,0x86,0x4d,0xaa,0x7a,0x50,0x44,0xd0,0x28,0x97,0xe7,0x85,0x3c,0x38,0x64,0xe0,0x0f,0x00,0x7f,0xee,0x1f,0xe5,0xf7,0xdb,0x03,0xda,0x05,0x53,0x76,0xbd,0xcd,0x34,0x14,0x49,0xf2,0xda,0xa4,0xec,0x88,0x4a,0xd2,0xcd,0xd5,0x4a,0x7b,0x43,0x05,0x04,0xee,0x51,0x40,0xf9,0x00
	db	0xb2,0x30,0xd3,0xc3,0x23,0x6b,0x35,0x8d,0x06,0x1b,0x47,0xb0,0x9b,0x8b,0x1c,0xf2,0x3c,0xb8,0x42,0x6e,0x6c,0x31,0x6c,0xb3,0x0d,0xb1,0xea,0x8b,0x7e,0x9c,0xd7,0x07,0x53,0x97,0xaf,0x07,0xbb,0x93,0xef,0xd7,0xa7,0x66,0xb7,0x3d,0xcf,0xd0,0x3e,0x58,0xc5,0x1e,0x0b,0x6e,0xbf,0x98,0x69,0xce,0x52,0x04,0xd4,0x5d,0xd2,0xff,0xb7,0x47,0x12,0xdd,0x08,0xbc,0x9c,0xfb,0xfb,0x87,0x9b,0xc2,0xee,0xe1,0x3a,0x6b,0x06,0x8a,0xbf,0xc1,0x1f,0xdb,0x2b,0x24,0x57,0x0d,0xb6,0x4b,0xa6,0x5e,0xa3,0x20,0x35,0x1c
	db	0x4a,0xa3,0xcb,0xbc,0xa6,0x53,0xd2,0x80,0x9b,0x21,0x38,0x38,0xa1,0xc3,0x61,0x3e,0x96,0xe3,0x82,0x98,0x01,0xb6,0xc3,0x90,0x6f,0xe6,0x0e,0x5d,0x77,0x05,0x3d,0x1c,0x59,0xc0,0x6b,0x21,0x40,0x6f,0xa8,0xcd,0x7e,0xd8,0xbc,0x12,0x1d,0x23,0xbb,0x1f,0x90,0x09,0xc7,0x17,0x9e,0x6a,0x95,0xb4,0x55,0x2e,0xd1,0x66,0x3b,0x0c,0x75,0x38,0x1a,0xe5,0x22,0x94,0x40,0xf1,0x2e,0x69,0x71,0xf6,0x5d,0x2b,0x3c,0xc7,0xc0,0xcb,0x29,0xe0,0x4c,0x74,0xe7,0x4f,0x01,0x21,0x7c,0x48,0x30,0xd3,0xc7,0xe2,0x21,0x06
	db	0x8d,0x83,0x59,0x82,0xcc,0x60,0x98,0xaf,0xdc,0x9a,0x9f,0xc6,0xc1,0x48,0xea,0x90,0x30,0x1e,0x58,0x65,0x37,0x48,0x26,0x65,0xbc,0xa5