pax_global_header00006660000000000000000000000064150047222240014510gustar00rootroot0000000000000052 comment=5e679c9823a6e10c206356b97a2b31996d20e69a tinyssh-20250501/000077500000000000000000000000001500472222400134515ustar00rootroot00000000000000tinyssh-20250501/.clang-format000066400000000000000000000110321500472222400160210ustar00rootroot00000000000000# 20211227 # based on LLVM # AllowShortBlocksOnASingleLine: Always # AllowShortLoopsOnASingleLine: true # AllowShortIfStatementsOnASingleLine: WithoutElse # IndentWidth: 4 # TabWidth: 4 # SortIncludes: false # BreakBeforeBraces: Custom # BeforeElse: true # ColumnLimit: 80 # SpaceAfterCStyleCast: true # IndentCaseLabels: true --- Language: Cpp # BasedOnStyle: LLVM AccessModifierOffset: -2 AlignAfterOpenBracket: Align AlignConsecutiveMacros: false AlignConsecutiveAssignments: false AlignConsecutiveBitFields: false AlignConsecutiveDeclarations: false AlignEscapedNewlines: Right AlignOperands: Align AlignTrailingComments: true AllowAllArgumentsOnNextLine: true AllowAllConstructorInitializersOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: true AllowShortEnumsOnASingleLine: true AllowShortBlocksOnASingleLine: Always AllowShortCaseLabelsOnASingleLine: false AllowShortFunctionsOnASingleLine: All AllowShortLambdasOnASingleLine: All AllowShortIfStatementsOnASingleLine: WithoutElse AllowShortLoopsOnASingleLine: true AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: false AlwaysBreakTemplateDeclarations: MultiLine BinPackArguments: true BinPackParameters: true BraceWrapping: AfterCaseLabel: false AfterClass: false AfterControlStatement: Never AfterEnum: false AfterFunction: false AfterNamespace: false AfterObjCDeclaration: false AfterStruct: false AfterUnion: false AfterExternBlock: false BeforeCatch: false BeforeElse: true BeforeLambdaBody: false BeforeWhile: false IndentBraces: false SplitEmptyFunction: true SplitEmptyRecord: true SplitEmptyNamespace: true BreakBeforeBinaryOperators: None BreakBeforeBraces: Custom BreakBeforeInheritanceComma: false BreakInheritanceList: BeforeColon BreakBeforeTernaryOperators: true BreakConstructorInitializersBeforeComma: false BreakConstructorInitializers: BeforeColon BreakAfterJavaFieldAnnotations: false BreakStringLiterals: true ColumnLimit: 80 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 4 Cpp11BracedListStyle: true DeriveLineEnding: true DerivePointerAlignment: false DisableFormat: false ExperimentalAutoDetectBinPacking: false FixNamespaceComments: true ForEachMacros: - foreach - Q_FOREACH - BOOST_FOREACH IncludeBlocks: Preserve IncludeCategories: - Regex: '^"(llvm|llvm-c|clang|clang-c)/' Priority: 2 SortPriority: 0 - Regex: '^(<|"(gtest|gmock|isl|json)/)' Priority: 3 SortPriority: 0 - Regex: '.*' Priority: 1 SortPriority: 0 IncludeIsMainRegex: '(Test)?$' IncludeIsMainSourceRegex: '' IndentCaseLabels: true IndentCaseBlocks: false IndentGotoLabels: true IndentPPDirectives: None IndentExternBlock: AfterExternBlock IndentWidth: 4 IndentWrappedFunctionNames: false InsertTrailingCommas: None JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: true MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: None ObjCBinPackProtocolList: Auto ObjCBlockIndentWidth: 2 ObjCBreakBeforeNestedBlockParam: true ObjCSpaceAfterProperty: false ObjCSpaceBeforeProtocolList: true PenaltyBreakAssignment: 2 PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000 PenaltyBreakTemplateDeclaration: 10 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 60 PointerAlignment: Right ReflowComments: true SortIncludes: false SortUsingDeclarations: true SpaceAfterCStyleCast: true SpaceAfterLogicalNot: false SpaceAfterTemplateKeyword: true SpaceBeforeAssignmentOperators: true SpaceBeforeCpp11BracedList: false SpaceBeforeCtorInitializerColon: true SpaceBeforeInheritanceColon: true SpaceBeforeParens: ControlStatements SpaceBeforeRangeBasedForLoopColon: true SpaceInEmptyBlock: false SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 1 SpacesInAngles: false SpacesInConditionalStatement: false # XXX - should be false SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false SpacesInParentheses: false SpacesInSquareBrackets: false SpaceBeforeSquareBrackets: false Standard: Latest StatementMacros: - Q_UNUSED - QT_REQUIRE_VERSION TabWidth: 4 UseCRLF: false UseTab: Never WhitespaceSensitiveMacros: - STRINGIZE - PP_STRINGIZE - BOOST_PP_STRINGIZE ... tinyssh-20250501/.gitignore000066400000000000000000000000071500472222400154360ustar00rootroot00000000000000/build tinyssh-20250501/CHANGELOG.md000066400000000000000000000045541500472222400152720ustar00rootroot00000000000000### 20250501 - Fixed minor strict kex violation, thanks to Fabian Bäumer and Marcus Brinkmann for the bug report. - Updated cryptoint to version 20250414 - Added support for external lib1305 ### 20250201 - Relicensed under CC0-1.0 OR 0BSD OR MIT-0 OR MIT - Final reformatting using clang-format ### 20250126 (pre-relase) - Fixed more compiler warnings - More used cryptoint ### 20241201 (pre-relase) - Switched to [cryptoint](https://libntruprime.cr.yp.to/libntruprime-20241021/cryptoint.html) 20241003 - Switched to tests from [SUPERCOP](https://bench.cr.yp.to/supercop.html) for crypto primitives - Fixed various compiler warnings ### 20241111 (pre-relase) - Fixed implicit-function-declaration warning packet_put.c (tnx @lanodan) - Modification of the build system to a simple Makefile (old build system still in directory 'old') - Added support for external librandombytes, lib25519, libntruprime library - Dropped support for other NaCl-compatible external libraries - Temporary disabled unit tests. ### 20240101 - fixed channel_forkpty() race condition between close(slave) in parent process and login_tty(slave) in child process - fixed behavior when using terminal mode and stdin redirected to /dev/null 'ssh -tt -n' - added an 'strict-key' key exchange kex-strict-s-v00@openssh.com (Mitigates CVE-2023-48795 "Terrapin attack") ### 20230101 - LICENCE update from public-domain to CC0, public domain works differently depending on the country, to avoid it, set explicitly CC0 - fixed sysdep tests, tnx Johannes Nixdorf ### 20220801 - tinyssh/getln.c don't close fd in case of error - use null fields in utmpx calls for logout - do not reverse the argument order in LIBS - fill utmp(x)'s ut_addr_v6 field when it exists - updated crypto/crypto_onetimeauth_poly1305.c ### 20220311 - fixed build on big-endian platforms ### 20220305 (workaround release) - use PACKET_LIMIT/2 as incoming maximum packet size, it's workaround for packets with miscalculated packet_length ### 20220222 - add tinysshnoneauthd ### 20220101 - add tinysshnoneauthd - fixed return error message when second channel is requested - man/tinysshd-{make,print}key.1 -> man/tinysshd-{make,print}key.8 ### 20210601 - add tools/tinyssh-convert - fix log error messages - honor "max packet size" requested from the client ### 20210319 - removed sntrup4591761x25519-sha512@tinyssh.org - added sntrup761x25519-sha512@openssh.com tinyssh-20250501/LICENCE.md000066400000000000000000000015111500472222400150330ustar00rootroot00000000000000TinySSH is hereby placed into the public domain. SPDX-License-Identifier: CC0-1.0 OR 0BSD OR MIT-0 OR MIT - [CC0-1.0](https://spdx.org/licenses/CC0-1.0.html) - [0BSD](https://spdx.org/licenses/0BSD.html) - [MIT-0](https://spdx.org/licenses/MIT-0.html) - [MIT](https://spdx.org/licenses/MIT.html) Comment: "Public domain" works differently depending on the country, therefore LICENCE updated to CC0-1.0 OR 0BSD OR MIT-0 OR MIT. History: - initial release - public domain - 20230101 - CC0 - 20250201 - CC0-1.0 OR 0BSD OR MIT-0 OR MIT. Other: _crypto-test_*.inc: derived from djb work from supercop/lib25519/libntruprime/lib1305, license: LicenseRef-PD-hp OR CC0-1.0 OR 0BSD OR MIT-0 OR MIT cryptoint/*: copy of cryptoint library from D. J. Bernstein, see cryptoint/README.md, license: LicenseRef-PD-hp OR CC0-1.0 OR 0BSD OR MIT-0 OR MIT tinyssh-20250501/Makefile000066400000000000000000001465601500472222400151250ustar00rootroot00000000000000CC?=cc CFLAGS+=-W -Wall -Os -fPIC -fwrapv -Icryptoint LDFLAGS?= CPPFLAGS?= DESTDIR?= PREFIX?=/usr/local INSTALL?=install LINKS=tinysshd-makekey tinysshd-printkey tinysshnoneauthd BINARIES=tinysshd _tinysshd-printkex _tinysshd-speed _tinysshd-test-hello1 \ _tinysshd-test-hello2 _tinysshd-test-kex1 _tinysshd-test-kex2 \ _tinysshd-unauthenticated TESTCRYPTOBINARIES=test-crypto OBJLIB=blocking.o buf.o byte.o channel.o channel_drop.o channel_fork.o \ channel_forkpty.o channel_subsystem.o cleanup.o coe.o connectioninfo.o \ crypto_dh_x25519.o crypto_hash_sha256.o crypto_hash_sha512_lib25519.o \ crypto_hash_sha512_tinyssh.o crypto_kem_sntrup761_libntruprime.o \ crypto_kem_sntrup761_tinyssh.o crypto_kem_sntrup761x25519.o \ crypto_onetimeauth_poly1305_lib1305.o crypto_onetimeauth_poly1305_tinyssh.o \ crypto_scalarmult_curve25519.o crypto_sign_ed25519_lib25519.o \ crypto_sign_ed25519_tinyssh.o crypto_sort_uint32.o crypto_stream_chacha20.o \ crypto_verify_16.o crypto_verify_32.o die.o dropuidgid.o e.o env.o fe25519.o \ fe.o ge25519.o getln.o global.o int16_optblocker.o int32_optblocker.o \ int64_optblocker.o int8_optblocker.o iptostr.o load.o log.o loginshell.o \ logsys.o main_tinysshd.o main_tinysshd_makekey.o main_tinysshd_printkey.o \ newenv.o numtostr.o open.o packet_auth.o packet.o packet_channel_open.o \ packet_channel_recv.o packet_channel_request.o packet_channel_send.o \ packet_get.o packet_hello.o packet_kex.o packet_kexdh.o packetparser.o \ packet_put.o packet_recv.o packet_send.o packet_unimplemented.o porttostr.o \ randommod.o readall.o savesync.o sc25519.o ssh.o sshcrypto.o sshcrypto_cipher.o \ sshcrypto_cipher_chachapoly.o sshcrypto_kex.o sshcrypto_kex_curve25519.o \ sshcrypto_kex_sntrup761x25519.o sshcrypto_key.o sshcrypto_key_ed25519.o str.o \ stringparser.o subprocess_auth.o subprocess_sign.o trymlock.o \ uint16_optblocker.o uint32_optblocker.o uint64_optblocker.o uint8_optblocker.o \ writeall.o OBJALL=blocking.o buf.o byte.o channel.o channel_drop.o channel_fork.o \ channel_forkpty.o channel_subsystem.o cleanup.o coe.o connectioninfo.o \ crypto_dh_x25519.o crypto_hash_sha256.o crypto_hash_sha512_lib25519.o \ crypto_hash_sha512_tinyssh.o crypto_kem_sntrup761_libntruprime.o \ crypto_kem_sntrup761_tinyssh.o crypto_kem_sntrup761x25519.o \ crypto_onetimeauth_poly1305_lib1305.o crypto_onetimeauth_poly1305_tinyssh.o \ crypto_scalarmult_curve25519.o crypto_sign_ed25519_lib25519.o \ crypto_sign_ed25519_tinyssh.o crypto_sort_uint32.o crypto_stream_chacha20.o \ crypto_verify_16.o crypto_verify_32.o die.o dropuidgid.o e.o env.o fe25519.o \ fe.o ge25519.o getln.o global.o int16_optblocker.o int32_optblocker.o \ int64_optblocker.o int8_optblocker.o iptostr.o load.o log.o loginshell.o \ logsys.o main_tinysshd.o main_tinysshd_makekey.o main_tinysshd_printkey.o \ newenv.o numtostr.o open.o packet_auth.o packet.o packet_channel_open.o \ packet_channel_recv.o packet_channel_request.o packet_channel_send.o \ packet_get.o packet_hello.o packet_kex.o packet_kexdh.o packetparser.o \ packet_put.o packet_recv.o packet_send.o packet_unimplemented.o porttostr.o \ randombytes.o randommod.o readall.o savesync.o sc25519.o ssh.o sshcrypto.o \ sshcrypto_cipher.o sshcrypto_cipher_chachapoly.o sshcrypto_kex.o \ sshcrypto_kex_curve25519.o sshcrypto_kex_sntrup761x25519.o sshcrypto_key.o \ sshcrypto_key_ed25519.o str.o stringparser.o subprocess_auth.o \ subprocess_sign.o test-crypto.o tinysshd.o _tinysshd-printkex.o \ _tinysshd-speed.o _tinysshd-test-hello1.o _tinysshd-test-hello2.o \ _tinysshd-test-kex1.o _tinysshd-test-kex2.o _tinysshd-unauthenticated.o \ trymlock.o uint16_optblocker.o uint32_optblocker.o uint64_optblocker.o \ uint8_optblocker.o writeall.o AUTOHEADERS=haslib1305.h haslib25519.h haslibntruprime.h haslibrandombytes.h \ haslibutilh.h haslimits.h haslogintty.h hasmlock.h hasopenpty.h hasutilh.h \ hasutmpaddrv6.h hasutmp.h hasutmphost.h hasutmploginlogout.h hasutmplogwtmp.h \ hasutmpname.h hasutmppid.h hasutmptime.h hasutmptv.h hasutmptype.h \ hasutmpuser.h hasutmpxaddrv6.h hasutmpx.h hasutmpxsyslen.h hasutmpxupdwtmpx.h \ hasvalgrind.h TESTOUT=test-crypto-dh.out test-crypto-hash.out test-crypto-kem.out \ test-crypto-onetimeauth.out test-crypto-sign.out test-crypto-sort.out \ test-crypto-verify.out test-tinysshd-makekey.out test-tinysshd-printkey.out \ test-tinysshd.out test-tinysshnoneauthd.out all: $(AUTOHEADERS) $(BINARIES) $(LINKS) blocking.o: blocking.c blocking.h $(CC) $(CFLAGS) $(CPPFLAGS) -c blocking.c buf.o: buf.c byte.h str.h purge.h cleanup.h randombytes.h \ haslibrandombytes.h cryptoint/crypto_uint32.h bug.h global.h e.h log.h \ buf.h cryptoint/crypto_uint8.h $(CC) $(CFLAGS) $(CPPFLAGS) -c buf.c byte.o: byte.c cryptoint/crypto_int16.h byte.h $(CC) $(CFLAGS) $(CPPFLAGS) -c byte.c channel.o: channel.c byte.h bug.h global.h e.h log.h newenv.h purge.h \ cleanup.h connectioninfo.h iptostr.h porttostr.h buf.h \ cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h str.h logsys.h \ loginshell.h trymlock.h limit.h haslimits.h channel.h $(CC) $(CFLAGS) $(CPPFLAGS) -c channel.c channel_drop.o: channel_drop.c dropuidgid.h newenv.h channel.h \ cryptoint/crypto_uint32.h iptostr.h porttostr.h limit.h haslimits.h $(CC) $(CFLAGS) $(CPPFLAGS) -c channel_drop.c channel_fork.o: channel_fork.c blocking.h open.h channel.h \ cryptoint/crypto_uint32.h iptostr.h porttostr.h limit.h haslimits.h $(CC) $(CFLAGS) $(CPPFLAGS) -c channel_fork.c channel_forkpty.o: channel_forkpty.c hasopenpty.h haslogintty.h e.h coe.h \ blocking.h global.h channel.h cryptoint/crypto_uint32.h iptostr.h \ porttostr.h limit.h haslimits.h $(CC) $(CFLAGS) $(CPPFLAGS) -c channel_forkpty.c channel_subsystem.o: channel_subsystem.c str.h log.h e.h channel.h \ cryptoint/crypto_uint32.h iptostr.h porttostr.h limit.h haslimits.h $(CC) $(CFLAGS) $(CPPFLAGS) -c channel_subsystem.c cleanup.o: cleanup.c cleanup.h $(CC) $(CFLAGS) $(CPPFLAGS) -c cleanup.c coe.o: coe.c coe.h $(CC) $(CFLAGS) $(CPPFLAGS) -c coe.c connectioninfo.o: connectioninfo.c e.h byte.h iptostr.h porttostr.h env.h \ str.h connectioninfo.h $(CC) $(CFLAGS) $(CPPFLAGS) -c connectioninfo.c crypto_dh_x25519.o: crypto_dh_x25519.c crypto_dh_x25519.h haslib25519.h \ randombytes.h haslibrandombytes.h crypto_scalarmult_curve25519.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_dh_x25519.c crypto_hash_sha256.o: crypto_hash_sha256.c cryptoint/crypto_uint32.h \ cryptoint/crypto_uint64.h crypto_hash_sha256.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_hash_sha256.c crypto_hash_sha512_lib25519.o: crypto_hash_sha512_lib25519.c \ haslib25519.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_hash_sha512_lib25519.c crypto_hash_sha512_tinyssh.o: crypto_hash_sha512_tinyssh.c \ crypto_hash_sha512.h haslib25519.h cryptoint/crypto_uint64.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_hash_sha512_tinyssh.c crypto_kem_sntrup761_libntruprime.o: crypto_kem_sntrup761_libntruprime.c \ haslibntruprime.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_kem_sntrup761_libntruprime.c crypto_kem_sntrup761_tinyssh.o: crypto_kem_sntrup761_tinyssh.c \ crypto_kem_sntrup761.h haslibntruprime.h cryptoint/crypto_uint64.h \ cryptoint/crypto_uint32.h cryptoint/crypto_uint16.h \ cryptoint/crypto_int32.h cryptoint/crypto_int16.h \ cryptoint/crypto_int8.h randombytes.h haslibrandombytes.h \ crypto_verify_32.h crypto_sort_uint32.h crypto_hash_sha512.h \ haslib25519.h crypto_declassify.h hasvalgrind.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_kem_sntrup761_tinyssh.c crypto_kem_sntrup761x25519.o: crypto_kem_sntrup761x25519.c cleanup.h \ crypto_hash_sha512.h haslib25519.h crypto_dh_x25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_kem_sntrup761x25519.c crypto_onetimeauth_poly1305_lib1305.o: \ crypto_onetimeauth_poly1305_lib1305.c haslib1305.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_onetimeauth_poly1305_lib1305.c crypto_onetimeauth_poly1305_tinyssh.o: \ crypto_onetimeauth_poly1305_tinyssh.c crypto_onetimeauth_poly1305.h \ haslib1305.h cryptoint/crypto_int16.h cryptoint/crypto_uint32.h \ cryptoint/crypto_uint64.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_onetimeauth_poly1305_tinyssh.c crypto_scalarmult_curve25519.o: crypto_scalarmult_curve25519.c cleanup.h \ fe25519.h fe.h cryptoint/crypto_uint32.h cryptoint/crypto_uint64.h \ cryptoint/crypto_uint8.h crypto_scalarmult_curve25519.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_scalarmult_curve25519.c crypto_sign_ed25519_lib25519.o: crypto_sign_ed25519_lib25519.c \ haslib25519.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_sign_ed25519_lib25519.c crypto_sign_ed25519_tinyssh.o: crypto_sign_ed25519_tinyssh.c \ crypto_sign_ed25519.h haslib25519.h randombytes.h haslibrandombytes.h \ cleanup.h crypto_hash_sha512.h crypto_verify_32.h ge25519.h fe.h \ cryptoint/crypto_uint32.h cryptoint/crypto_uint64.h sc25519.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_sign_ed25519_tinyssh.c crypto_sort_uint32.o: crypto_sort_uint32.c cryptoint/crypto_uint32.h \ crypto_sort_uint32.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_sort_uint32.c crypto_stream_chacha20.o: crypto_stream_chacha20.c \ crypto_stream_chacha20.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_stream_chacha20.c crypto_verify_16.o: crypto_verify_16.c cryptoint/crypto_int16.h \ crypto_verify_16.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_verify_16.c crypto_verify_32.o: crypto_verify_32.c cryptoint/crypto_int16.h \ crypto_verify_32.h $(CC) $(CFLAGS) $(CPPFLAGS) -c crypto_verify_32.c die.o: die.c global.h log.h die.h $(CC) $(CFLAGS) $(CPPFLAGS) -c die.c dropuidgid.o: dropuidgid.c e.h dropuidgid.h $(CC) $(CFLAGS) $(CPPFLAGS) -c dropuidgid.c e.o: e.c e.h $(CC) $(CFLAGS) $(CPPFLAGS) -c e.c env.o: env.c str.h env.h $(CC) $(CFLAGS) $(CPPFLAGS) -c env.c fe25519.o: fe25519.c crypto_verify_32.h cleanup.h fe.h \ cryptoint/crypto_uint32.h cryptoint/crypto_uint64.h fe25519.h $(CC) $(CFLAGS) $(CPPFLAGS) -c fe25519.c fe.o: fe.c fe.h cryptoint/crypto_uint32.h cryptoint/crypto_uint64.h $(CC) $(CFLAGS) $(CPPFLAGS) -c fe.c ge25519.o: ge25519.c fe25519.h fe.h cryptoint/crypto_uint32.h \ cryptoint/crypto_uint64.h cleanup.h ge25519.h $(CC) $(CFLAGS) $(CPPFLAGS) -c ge25519.c getln.o: getln.c e.h getln.h $(CC) $(CFLAGS) $(CPPFLAGS) -c getln.c global.o: global.c newenv.h channel.h cryptoint/crypto_uint32.h iptostr.h \ porttostr.h limit.h haslimits.h packet.h buf.h cryptoint/crypto_uint8.h \ sshcrypto.h crypto.h cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h purge.h cleanup.h \ trymlock.h global.h $(CC) $(CFLAGS) $(CPPFLAGS) -c global.c int16_optblocker.o: int16_optblocker.c cryptoint/crypto_int16.h $(CC) $(CFLAGS) $(CPPFLAGS) -c int16_optblocker.c int32_optblocker.o: int32_optblocker.c cryptoint/crypto_int32.h $(CC) $(CFLAGS) $(CPPFLAGS) -c int32_optblocker.c int64_optblocker.o: int64_optblocker.c cryptoint/crypto_int64.h $(CC) $(CFLAGS) $(CPPFLAGS) -c int64_optblocker.c int8_optblocker.o: int8_optblocker.c cryptoint/crypto_int8.h $(CC) $(CFLAGS) $(CPPFLAGS) -c int8_optblocker.c iptostr.o: iptostr.c byte.h iptostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c iptostr.c load.o: load.c readall.h open.h e.h load.h $(CC) $(CFLAGS) $(CPPFLAGS) -c load.c log.o: log.c writeall.h randommod.h purge.h cleanup.h numtostr.h e.h \ log.h $(CC) $(CFLAGS) $(CPPFLAGS) -c log.c loginshell.o: loginshell.c e.h loginshell.h $(CC) $(CFLAGS) $(CPPFLAGS) -c loginshell.c logsys.o: logsys.c hasutilh.h hasutmpx.h hasutmpxupdwtmpx.h \ hasutmpxsyslen.h hasutmpxaddrv6.h hasutmp.h hasutmpname.h hasutmppid.h \ hasutmptime.h hasutmptv.h hasutmptype.h hasutmphost.h hasutmpuser.h \ hasutmplogwtmp.h hasutmploginlogout.h hasutmpaddrv6.h str.h byte.h \ logsys.h $(CC) $(CFLAGS) $(CPPFLAGS) -c logsys.c main_tinysshd.o: main_tinysshd.c blocking.h ssh.h purge.h cleanup.h \ open.h load.h e.h byte.h buf.h cryptoint/crypto_uint8.h \ cryptoint/crypto_uint32.h packet.h sshcrypto.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h limit.h haslimits.h \ channel.h iptostr.h porttostr.h log.h subprocess.h global.h \ connectioninfo.h die.h str.h main.h $(CC) $(CFLAGS) $(CPPFLAGS) -c main_tinysshd.c main_tinysshd_makekey.o: main_tinysshd_makekey.c savesync.h log.h \ sshcrypto.h buf.h cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h \ crypto.h cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h global.h die.h main.h $(CC) $(CFLAGS) $(CPPFLAGS) -c main_tinysshd_makekey.c main_tinysshd_printkey.o: main_tinysshd_printkey.c e.h load.h sshcrypto.h \ buf.h cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h global.h log.h writeall.h \ die.h main.h $(CC) $(CFLAGS) $(CPPFLAGS) -c main_tinysshd_printkey.c newenv.o: newenv.c e.h byte.h str.h purge.h cleanup.h bug.h global.h \ log.h env.h trymlock.h newenv.h $(CC) $(CFLAGS) $(CPPFLAGS) -c newenv.c numtostr.o: numtostr.c numtostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c numtostr.c open.o: open.c blocking.h open.h $(CC) $(CFLAGS) $(CPPFLAGS) -c open.c packet_auth.o: packet_auth.c buf.h cryptoint/crypto_uint8.h \ cryptoint/crypto_uint32.h ssh.h e.h str.h packetparser.h subprocess.h \ sshcrypto.h crypto.h cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h bug.h global.h log.h \ purge.h cleanup.h packet.h limit.h haslimits.h channel.h iptostr.h \ porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet_auth.c packet.o: packet.c purge.h cleanup.h trymlock.h packet.h buf.h \ cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h sshcrypto.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h limit.h haslimits.h \ channel.h iptostr.h porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet.c packet_channel_open.o: packet_channel_open.c buf.h \ cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h ssh.h e.h bug.h \ global.h log.h packetparser.h str.h packet.h sshcrypto.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h limit.h haslimits.h \ channel.h iptostr.h porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet_channel_open.c packet_channel_recv.o: packet_channel_recv.c bug.h global.h e.h log.h \ buf.h cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h channel.h \ iptostr.h porttostr.h limit.h haslimits.h ssh.h packetparser.h packet.h \ sshcrypto.h crypto.h cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet_channel_recv.c packet_channel_request.o: packet_channel_request.c buf.h \ cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h ssh.h e.h bug.h \ global.h log.h str.h packetparser.h packet.h sshcrypto.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h limit.h haslimits.h \ channel.h iptostr.h porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet_channel_request.c packet_channel_send.o: packet_channel_send.c bug.h global.h e.h log.h \ buf.h cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h channel.h \ iptostr.h porttostr.h limit.h haslimits.h ssh.h packet.h sshcrypto.h \ crypto.h cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet_channel_send.c packet_get.o: packet_get.c byte.h e.h bug.h global.h log.h \ cryptoint/crypto_uint32.h purge.h cleanup.h ssh.h sshcrypto.h buf.h \ cryptoint/crypto_uint8.h crypto.h cryptoint/crypto_int16.h \ cryptoint/crypto_int32.h cryptoint/crypto_int64.h \ cryptoint/crypto_int8.h cryptoint/crypto_uint16.h \ cryptoint/crypto_uint64.h crypto_verify_16.h crypto_verify_32.h \ haslibrandombytes.h randombytes.h crypto_hash_sha256.h \ crypto_hash_sha512.h haslib25519.h crypto_kem_sntrup761.h \ haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h numtostr.h packet.h \ limit.h haslimits.h channel.h iptostr.h porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet_get.c packet_hello.o: packet_hello.c buf.h cryptoint/crypto_uint8.h \ cryptoint/crypto_uint32.h byte.h writeall.h purge.h cleanup.h log.h \ str.h getln.h e.h packet.h sshcrypto.h crypto.h cryptoint/crypto_int16.h \ cryptoint/crypto_int32.h cryptoint/crypto_int64.h \ cryptoint/crypto_int8.h cryptoint/crypto_uint16.h \ cryptoint/crypto_uint64.h crypto_verify_16.h crypto_verify_32.h \ haslibrandombytes.h randombytes.h crypto_hash_sha256.h \ crypto_hash_sha512.h haslib25519.h crypto_kem_sntrup761.h \ haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h limit.h haslimits.h \ channel.h iptostr.h porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet_hello.c packet_kex.o: packet_kex.c buf.h cryptoint/crypto_uint8.h \ cryptoint/crypto_uint32.h ssh.h sshcrypto.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h packetparser.h bug.h \ global.h e.h log.h packet.h limit.h haslimits.h channel.h iptostr.h \ porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet_kex.c packet_kexdh.o: packet_kexdh.c buf.h cryptoint/crypto_uint8.h \ cryptoint/crypto_uint32.h ssh.h e.h byte.h sshcrypto.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h packetparser.h bug.h \ global.h log.h purge.h cleanup.h subprocess.h packet.h limit.h \ haslimits.h channel.h iptostr.h porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet_kexdh.c packetparser.o: packetparser.c e.h cryptoint/crypto_uint32.h bug.h \ global.h log.h byte.h packetparser.h cryptoint/crypto_uint8.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packetparser.c packet_put.o: packet_put.c cryptoint/crypto_uint32.h buf.h \ cryptoint/crypto_uint8.h bug.h global.h e.h log.h sshcrypto.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h ssh.h packet.h limit.h \ haslimits.h channel.h iptostr.h porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet_put.c packet_recv.o: packet_recv.c e.h buf.h cryptoint/crypto_uint8.h \ cryptoint/crypto_uint32.h purge.h cleanup.h packet.h sshcrypto.h \ crypto.h cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h limit.h haslimits.h \ channel.h iptostr.h porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet_recv.c packet_send.o: packet_send.c writeall.h e.h byte.h purge.h cleanup.h \ packet.h buf.h cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h \ sshcrypto.h crypto.h cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h limit.h haslimits.h \ channel.h iptostr.h porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet_send.c packet_unimplemented.o: packet_unimplemented.c buf.h \ cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h ssh.h log.h \ numtostr.h packet.h sshcrypto.h crypto.h cryptoint/crypto_int16.h \ cryptoint/crypto_int32.h cryptoint/crypto_int64.h \ cryptoint/crypto_int8.h cryptoint/crypto_uint16.h \ cryptoint/crypto_uint64.h crypto_verify_16.h crypto_verify_32.h \ haslibrandombytes.h randombytes.h crypto_hash_sha256.h \ crypto_hash_sha512.h haslib25519.h crypto_kem_sntrup761.h \ haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h limit.h haslimits.h \ channel.h iptostr.h porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c packet_unimplemented.c porttostr.o: porttostr.c cryptoint/crypto_uint16.h porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c porttostr.c randombytes.o: randombytes.c randombytes.h haslibrandombytes.h $(CC) $(CFLAGS) $(CPPFLAGS) -c randombytes.c randommod.o: randommod.c randombytes.h haslibrandombytes.h randommod.h $(CC) $(CFLAGS) $(CPPFLAGS) -c randommod.c readall.o: readall.c e.h readall.h $(CC) $(CFLAGS) $(CPPFLAGS) -c readall.c savesync.o: savesync.c open.h savesync.h writeall.h $(CC) $(CFLAGS) $(CPPFLAGS) -c savesync.c sc25519.o: sc25519.c cryptoint/crypto_int64.h cryptoint/crypto_uint32.h \ cryptoint/crypto_uint64.h cleanup.h sc25519.h $(CC) $(CFLAGS) $(CPPFLAGS) -c sc25519.c ssh.o: ssh.c ssh.h $(CC) $(CFLAGS) $(CPPFLAGS) -c ssh.c sshcrypto.o: sshcrypto.c purge.h cleanup.h bug.h global.h e.h log.h str.h \ sshcrypto.h buf.h cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h \ crypto.h cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h $(CC) $(CFLAGS) $(CPPFLAGS) -c sshcrypto.c sshcrypto_cipher.o: sshcrypto_cipher.c crypto.h cryptoint/crypto_int16.h \ cryptoint/crypto_int32.h cryptoint/crypto_int64.h \ cryptoint/crypto_int8.h cryptoint/crypto_uint16.h \ cryptoint/crypto_uint32.h cryptoint/crypto_uint64.h \ cryptoint/crypto_uint8.h crypto_verify_16.h crypto_verify_32.h \ haslibrandombytes.h randombytes.h crypto_hash_sha256.h \ crypto_hash_sha512.h haslib25519.h crypto_kem_sntrup761.h \ haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h stringparser.h e.h log.h \ bug.h global.h str.h byte.h packet.h buf.h sshcrypto.h limit.h \ haslimits.h channel.h iptostr.h porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c sshcrypto_cipher.c sshcrypto_cipher_chachapoly.o: sshcrypto_cipher_chachapoly.c \ cryptoint/crypto_uint32.h crypto_verify_16.h randommod.h e.h byte.h \ purge.h cleanup.h sshcrypto.h buf.h cryptoint/crypto_uint8.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_32.h \ haslibrandombytes.h randombytes.h crypto_hash_sha256.h \ crypto_hash_sha512.h haslib25519.h crypto_kem_sntrup761.h \ haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h bug.h global.h log.h \ packet.h limit.h haslimits.h channel.h iptostr.h porttostr.h $(CC) $(CFLAGS) $(CPPFLAGS) -c sshcrypto_cipher_chachapoly.c sshcrypto_kex.o: sshcrypto_kex.c crypto.h cryptoint/crypto_int16.h \ cryptoint/crypto_int32.h cryptoint/crypto_int64.h \ cryptoint/crypto_int8.h cryptoint/crypto_uint16.h \ cryptoint/crypto_uint32.h cryptoint/crypto_uint64.h \ cryptoint/crypto_uint8.h crypto_verify_16.h crypto_verify_32.h \ haslibrandombytes.h randombytes.h crypto_hash_sha256.h \ crypto_hash_sha512.h haslib25519.h crypto_kem_sntrup761.h \ haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h stringparser.h str.h \ byte.h e.h log.h bug.h global.h sshcrypto.h buf.h $(CC) $(CFLAGS) $(CPPFLAGS) -c sshcrypto_kex.c sshcrypto_kex_curve25519.o: sshcrypto_kex_curve25519.c buf.h \ cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h purge.h cleanup.h \ sshcrypto.h $(CC) $(CFLAGS) $(CPPFLAGS) -c sshcrypto_kex_curve25519.c sshcrypto_kex_sntrup761x25519.o: sshcrypto_kex_sntrup761x25519.c buf.h \ cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h sshcrypto.h $(CC) $(CFLAGS) $(CPPFLAGS) -c sshcrypto_kex_sntrup761x25519.c sshcrypto_key.o: sshcrypto_key.c crypto.h cryptoint/crypto_int16.h \ cryptoint/crypto_int32.h cryptoint/crypto_int64.h \ cryptoint/crypto_int8.h cryptoint/crypto_uint16.h \ cryptoint/crypto_uint32.h cryptoint/crypto_uint64.h \ cryptoint/crypto_uint8.h crypto_verify_16.h crypto_verify_32.h \ haslibrandombytes.h randombytes.h crypto_hash_sha256.h \ crypto_hash_sha512.h haslib25519.h crypto_kem_sntrup761.h \ haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h packetparser.h \ stringparser.h str.h byte.h e.h log.h bug.h global.h purge.h cleanup.h \ sshcrypto.h buf.h $(CC) $(CFLAGS) $(CPPFLAGS) -c sshcrypto_key.c sshcrypto_key_ed25519.o: sshcrypto_key_ed25519.c crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint32.h \ cryptoint/crypto_uint64.h cryptoint/crypto_uint8.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h packetparser.h buf.h \ byte.h str.h purge.h cleanup.h sshcrypto.h $(CC) $(CFLAGS) $(CPPFLAGS) -c sshcrypto_key_ed25519.c str.o: str.c str.h $(CC) $(CFLAGS) $(CPPFLAGS) -c str.c stringparser.o: stringparser.c byte.h e.h bug.h global.h log.h \ stringparser.h $(CC) $(CFLAGS) $(CPPFLAGS) -c stringparser.c subprocess_auth.o: subprocess_auth.c str.h open.h dropuidgid.h global.h \ e.h log.h sshcrypto.h buf.h cryptoint/crypto_uint8.h \ cryptoint/crypto_uint32.h crypto.h cryptoint/crypto_int16.h \ cryptoint/crypto_int32.h cryptoint/crypto_int64.h \ cryptoint/crypto_int8.h cryptoint/crypto_uint16.h \ cryptoint/crypto_uint64.h crypto_verify_16.h crypto_verify_32.h \ haslibrandombytes.h randombytes.h crypto_hash_sha256.h \ crypto_hash_sha512.h haslib25519.h crypto_kem_sntrup761.h \ haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h getln.h bug.h limit.h \ haslimits.h subprocess.h $(CC) $(CFLAGS) $(CPPFLAGS) -c subprocess_auth.c subprocess_sign.o: subprocess_sign.c load.h log.h open.h writeall.h \ purge.h cleanup.h global.h bug.h e.h readall.h blocking.h sshcrypto.h \ buf.h cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h subprocess.h $(CC) $(CFLAGS) $(CPPFLAGS) -c subprocess_sign.c test-crypto.o: test-crypto.c cryptoint/crypto_uint8.h \ cryptoint/crypto_uint32.h cryptoint/crypto_uint64.h crypto_declassify.h \ hasvalgrind.h crypto.h cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h crypto_verify_16.h crypto_verify_32.h \ haslibrandombytes.h randombytes.h crypto_hash_sha256.h \ crypto_hash_sha512.h haslib25519.h crypto_kem_sntrup761.h \ haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h _crypto-test_verify_16.inc \ _crypto-test_verify_32.inc _crypto-test_sort_uint32.inc \ _crypto-test_hash_sha256.inc _crypto-test_hash_sha512.inc \ _crypto-test_sign_ed25519.inc _crypto-test_kem_sntrup761.inc \ _crypto-test_dh_x25519.inc _crypto-test_onetimeauth_poly1305.inc $(CC) $(CFLAGS) $(CPPFLAGS) -c test-crypto.c tinysshd.o: tinysshd.c str.h main.h $(CC) $(CFLAGS) $(CPPFLAGS) -c tinysshd.c _tinysshd-printkex.o: _tinysshd-printkex.c log.h packet.h buf.h \ cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h sshcrypto.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h limit.h haslimits.h \ channel.h iptostr.h porttostr.h ssh.h bug.h global.h e.h packetparser.h $(CC) $(CFLAGS) $(CPPFLAGS) -c _tinysshd-printkex.c _tinysshd-speed.o: _tinysshd-speed.c crypto.h cryptoint/crypto_int16.h \ cryptoint/crypto_int32.h cryptoint/crypto_int64.h \ cryptoint/crypto_int8.h cryptoint/crypto_uint16.h \ cryptoint/crypto_uint32.h cryptoint/crypto_uint64.h \ cryptoint/crypto_uint8.h crypto_verify_16.h crypto_verify_32.h \ haslibrandombytes.h randombytes.h crypto_hash_sha256.h \ crypto_hash_sha512.h haslib25519.h crypto_kem_sntrup761.h \ haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h $(CC) $(CFLAGS) $(CPPFLAGS) -c _tinysshd-speed.c _tinysshd-test-hello1.o: _tinysshd-test-hello1.c $(CC) $(CFLAGS) $(CPPFLAGS) -c _tinysshd-test-hello1.c _tinysshd-test-hello2.o: _tinysshd-test-hello2.c log.h packet.h buf.h \ cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h sshcrypto.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h limit.h haslimits.h \ channel.h iptostr.h porttostr.h global.h str.h writeall.h $(CC) $(CFLAGS) $(CPPFLAGS) -c _tinysshd-test-hello2.c _tinysshd-test-kex1.o: _tinysshd-test-kex1.c log.h packet.h buf.h \ cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h sshcrypto.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h limit.h haslimits.h \ channel.h iptostr.h porttostr.h ssh.h bug.h global.h e.h packetparser.h $(CC) $(CFLAGS) $(CPPFLAGS) -c _tinysshd-test-kex1.c _tinysshd-test-kex2.o: _tinysshd-test-kex2.c log.h packet.h buf.h \ cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h sshcrypto.h crypto.h \ cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h limit.h haslimits.h \ channel.h iptostr.h porttostr.h ssh.h bug.h global.h e.h packetparser.h $(CC) $(CFLAGS) $(CPPFLAGS) -c _tinysshd-test-kex2.c _tinysshd-unauthenticated.o: _tinysshd-unauthenticated.c log.h packet.h \ buf.h cryptoint/crypto_uint8.h cryptoint/crypto_uint32.h sshcrypto.h \ crypto.h cryptoint/crypto_int16.h cryptoint/crypto_int32.h \ cryptoint/crypto_int64.h cryptoint/crypto_int8.h \ cryptoint/crypto_uint16.h cryptoint/crypto_uint64.h crypto_verify_16.h \ crypto_verify_32.h haslibrandombytes.h randombytes.h \ crypto_hash_sha256.h crypto_hash_sha512.h haslib25519.h \ crypto_kem_sntrup761.h haslibntruprime.h crypto_kem_sntrup761x25519.h \ crypto_onetimeauth_poly1305.h haslib1305.h \ crypto_scalarmult_curve25519.h crypto_dh_x25519.h crypto_sign_ed25519.h \ crypto_sort_uint32.h crypto_stream_chacha20.h limit.h haslimits.h \ channel.h iptostr.h porttostr.h ssh.h bug.h global.h e.h packetparser.h $(CC) $(CFLAGS) $(CPPFLAGS) -c _tinysshd-unauthenticated.c trymlock.o: trymlock.c hasmlock.h trymlock.h $(CC) $(CFLAGS) $(CPPFLAGS) -c trymlock.c uint16_optblocker.o: uint16_optblocker.c cryptoint/crypto_uint16.h $(CC) $(CFLAGS) $(CPPFLAGS) -c uint16_optblocker.c uint32_optblocker.o: uint32_optblocker.c cryptoint/crypto_uint32.h $(CC) $(CFLAGS) $(CPPFLAGS) -c uint32_optblocker.c uint64_optblocker.o: uint64_optblocker.c cryptoint/crypto_uint64.h $(CC) $(CFLAGS) $(CPPFLAGS) -c uint64_optblocker.c uint8_optblocker.o: uint8_optblocker.c cryptoint/crypto_uint8.h $(CC) $(CFLAGS) $(CPPFLAGS) -c uint8_optblocker.c writeall.o: writeall.c e.h writeall.h $(CC) $(CFLAGS) $(CPPFLAGS) -c writeall.c tinysshd: tinysshd.o $(OBJLIB) randombytes.o libs $(CC) $(CFLAGS) $(CPPFLAGS) -o tinysshd tinysshd.o \ $(OBJLIB) $(LDFLAGS) `cat libs` randombytes.o _tinysshd-printkex: _tinysshd-printkex.o $(OBJLIB) randombytes.o libs $(CC) $(CFLAGS) $(CPPFLAGS) -o _tinysshd-printkex _tinysshd-printkex.o \ $(OBJLIB) $(LDFLAGS) `cat libs` randombytes.o _tinysshd-speed: _tinysshd-speed.o $(OBJLIB) randombytes.o libs $(CC) $(CFLAGS) $(CPPFLAGS) -o _tinysshd-speed _tinysshd-speed.o \ $(OBJLIB) $(LDFLAGS) `cat libs` randombytes.o _tinysshd-test-hello1: _tinysshd-test-hello1.o $(OBJLIB) randombytes.o libs $(CC) $(CFLAGS) $(CPPFLAGS) -o _tinysshd-test-hello1 _tinysshd-test-hello1.o \ $(OBJLIB) $(LDFLAGS) `cat libs` randombytes.o _tinysshd-test-hello2: _tinysshd-test-hello2.o $(OBJLIB) randombytes.o libs $(CC) $(CFLAGS) $(CPPFLAGS) -o _tinysshd-test-hello2 _tinysshd-test-hello2.o \ $(OBJLIB) $(LDFLAGS) `cat libs` randombytes.o _tinysshd-test-kex1: _tinysshd-test-kex1.o $(OBJLIB) randombytes.o libs $(CC) $(CFLAGS) $(CPPFLAGS) -o _tinysshd-test-kex1 _tinysshd-test-kex1.o \ $(OBJLIB) $(LDFLAGS) `cat libs` randombytes.o _tinysshd-test-kex2: _tinysshd-test-kex2.o $(OBJLIB) randombytes.o libs $(CC) $(CFLAGS) $(CPPFLAGS) -o _tinysshd-test-kex2 _tinysshd-test-kex2.o \ $(OBJLIB) $(LDFLAGS) `cat libs` randombytes.o _tinysshd-unauthenticated: _tinysshd-unauthenticated.o $(OBJLIB) randombytes.o libs $(CC) $(CFLAGS) $(CPPFLAGS) -o _tinysshd-unauthenticated _tinysshd-unauthenticated.o \ $(OBJLIB) $(LDFLAGS) `cat libs` randombytes.o test-crypto: test-crypto.o $(OBJLIB) libs $(CC) $(CFLAGS) $(CPPFLAGS) -o test-crypto test-crypto.o \ $(OBJLIB) $(LDFLAGS) `cat libs` haslib1305.h: tryfeature.sh haslib1305.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh haslib1305.c >haslib1305.h 2>haslib1305.log cat haslib1305.h haslib25519.h: tryfeature.sh haslib25519.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh haslib25519.c >haslib25519.h 2>haslib25519.log cat haslib25519.h haslibntruprime.h: tryfeature.sh haslibntruprime.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh haslibntruprime.c >haslibntruprime.h 2>haslibntruprime.log cat haslibntruprime.h haslibrandombytes.h: tryfeature.sh haslibrandombytes.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh haslibrandombytes.c >haslibrandombytes.h 2>haslibrandombytes.log cat haslibrandombytes.h haslibutilh.h: tryfeature.sh haslibutilh.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh haslibutilh.c >haslibutilh.h 2>haslibutilh.log cat haslibutilh.h haslimits.h: tryfeature.sh haslimits.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh haslimits.c >haslimits.h 2>haslimits.log cat haslimits.h haslogintty.h: tryfeature.sh haslogintty.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh haslogintty.c >haslogintty.h 2>haslogintty.log cat haslogintty.h hasmlock.h: tryfeature.sh hasmlock.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasmlock.c >hasmlock.h 2>hasmlock.log cat hasmlock.h hasopenpty.h: tryfeature.sh hasopenpty.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasopenpty.c >hasopenpty.h 2>hasopenpty.log cat hasopenpty.h hasutilh.h: tryfeature.sh hasutilh.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutilh.c >hasutilh.h 2>hasutilh.log cat hasutilh.h hasutmpaddrv6.h: tryfeature.sh hasutmpaddrv6.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmpaddrv6.c >hasutmpaddrv6.h 2>hasutmpaddrv6.log cat hasutmpaddrv6.h hasutmp.h: tryfeature.sh hasutmp.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmp.c >hasutmp.h 2>hasutmp.log cat hasutmp.h hasutmphost.h: tryfeature.sh hasutmphost.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmphost.c >hasutmphost.h 2>hasutmphost.log cat hasutmphost.h hasutmploginlogout.h: tryfeature.sh hasutmploginlogout.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmploginlogout.c >hasutmploginlogout.h 2>hasutmploginlogout.log cat hasutmploginlogout.h hasutmplogwtmp.h: tryfeature.sh hasutmplogwtmp.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmplogwtmp.c >hasutmplogwtmp.h 2>hasutmplogwtmp.log cat hasutmplogwtmp.h hasutmpname.h: tryfeature.sh hasutmpname.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmpname.c >hasutmpname.h 2>hasutmpname.log cat hasutmpname.h hasutmppid.h: tryfeature.sh hasutmppid.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmppid.c >hasutmppid.h 2>hasutmppid.log cat hasutmppid.h hasutmptime.h: tryfeature.sh hasutmptime.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmptime.c >hasutmptime.h 2>hasutmptime.log cat hasutmptime.h hasutmptv.h: tryfeature.sh hasutmptv.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmptv.c >hasutmptv.h 2>hasutmptv.log cat hasutmptv.h hasutmptype.h: tryfeature.sh hasutmptype.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmptype.c >hasutmptype.h 2>hasutmptype.log cat hasutmptype.h hasutmpuser.h: tryfeature.sh hasutmpuser.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmpuser.c >hasutmpuser.h 2>hasutmpuser.log cat hasutmpuser.h hasutmpxaddrv6.h: tryfeature.sh hasutmpxaddrv6.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmpxaddrv6.c >hasutmpxaddrv6.h 2>hasutmpxaddrv6.log cat hasutmpxaddrv6.h hasutmpx.h: tryfeature.sh hasutmpx.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmpx.c >hasutmpx.h 2>hasutmpx.log cat hasutmpx.h hasutmpxsyslen.h: tryfeature.sh hasutmpxsyslen.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmpxsyslen.c >hasutmpxsyslen.h 2>hasutmpxsyslen.log cat hasutmpxsyslen.h hasutmpxupdwtmpx.h: tryfeature.sh hasutmpxupdwtmpx.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasutmpxupdwtmpx.c >hasutmpxupdwtmpx.h 2>hasutmpxupdwtmpx.log cat hasutmpxupdwtmpx.h hasvalgrind.h: tryfeature.sh hasvalgrind.c libs env CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) `cat libs`" \ ./tryfeature.sh hasvalgrind.c >hasvalgrind.h 2>hasvalgrind.log cat hasvalgrind.h test-crypto-dh.out: $(BINARIES) $(TESTCRYPTOBINARIES) $(LINKS) runtest.sh test-crypto-dh.sh test-crypto-dh.exp sh runtest.sh test-crypto-dh.sh test-crypto-dh.out test-crypto-dh.exp test-crypto-hash.out: $(BINARIES) $(TESTCRYPTOBINARIES) $(LINKS) runtest.sh test-crypto-hash.sh test-crypto-hash.exp sh runtest.sh test-crypto-hash.sh test-crypto-hash.out test-crypto-hash.exp test-crypto-kem.out: $(BINARIES) $(TESTCRYPTOBINARIES) $(LINKS) runtest.sh test-crypto-kem.sh test-crypto-kem.exp sh runtest.sh test-crypto-kem.sh test-crypto-kem.out test-crypto-kem.exp test-crypto-onetimeauth.out: $(BINARIES) $(TESTCRYPTOBINARIES) $(LINKS) runtest.sh test-crypto-onetimeauth.sh test-crypto-onetimeauth.exp sh runtest.sh test-crypto-onetimeauth.sh test-crypto-onetimeauth.out test-crypto-onetimeauth.exp test-crypto-sign.out: $(BINARIES) $(TESTCRYPTOBINARIES) $(LINKS) runtest.sh test-crypto-sign.sh test-crypto-sign.exp sh runtest.sh test-crypto-sign.sh test-crypto-sign.out test-crypto-sign.exp test-crypto-sort.out: $(BINARIES) $(TESTCRYPTOBINARIES) $(LINKS) runtest.sh test-crypto-sort.sh test-crypto-sort.exp sh runtest.sh test-crypto-sort.sh test-crypto-sort.out test-crypto-sort.exp test-crypto-verify.out: $(BINARIES) $(TESTCRYPTOBINARIES) $(LINKS) runtest.sh test-crypto-verify.sh test-crypto-verify.exp sh runtest.sh test-crypto-verify.sh test-crypto-verify.out test-crypto-verify.exp test-tinysshd-makekey.out: $(BINARIES) $(TESTCRYPTOBINARIES) $(LINKS) runtest.sh test-tinysshd-makekey.sh test-tinysshd-makekey.exp sh runtest.sh test-tinysshd-makekey.sh test-tinysshd-makekey.out test-tinysshd-makekey.exp test-tinysshd-printkey.out: $(BINARIES) $(TESTCRYPTOBINARIES) $(LINKS) runtest.sh test-tinysshd-printkey.sh test-tinysshd-printkey.exp sh runtest.sh test-tinysshd-printkey.sh test-tinysshd-printkey.out test-tinysshd-printkey.exp test-tinysshd.out: $(BINARIES) $(TESTCRYPTOBINARIES) $(LINKS) runtest.sh test-tinysshd.sh test-tinysshd.exp sh runtest.sh test-tinysshd.sh test-tinysshd.out test-tinysshd.exp test-tinysshnoneauthd.out: $(BINARIES) $(TESTCRYPTOBINARIES) $(LINKS) runtest.sh test-tinysshnoneauthd.sh test-tinysshnoneauthd.exp sh runtest.sh test-tinysshnoneauthd.sh test-tinysshnoneauthd.out test-tinysshnoneauthd.exp test: $(TESTOUT) libs: trylibs.sh env CC="$(CC)" ./trylibs.sh -lsocket -lnsl -lutil -lrandombytes -l25519 -l1305 -lntruprime >libs 2>libs.log cat libs tinysshd-makekey: tinysshd rm -f tinysshd-makekey ln -s tinysshd tinysshd-makekey tinysshd-printkey: tinysshd rm -f tinysshd-printkey ln -s tinysshd tinysshd-printkey tinysshnoneauthd: tinysshd rm -f tinysshnoneauthd ln -s tinysshd tinysshnoneauthd install: $(BINARIES) $(LINKS) mkdir -p $(DESTDIR)$(PREFIX)/sbin mkdir -p $(DESTDIR)$(PREFIX)/share/man/man8 $(INSTALL) -m 0755 tinysshd $(DESTDIR)$(PREFIX)/sbin/tinysshd $(INSTALL) -m 0755 tinysshd-makekey $(DESTDIR)$(PREFIX)/sbin/tinysshd-makekey $(INSTALL) -m 0755 tinysshd-printkey $(DESTDIR)$(PREFIX)/sbin/tinysshd-printkey $(INSTALL) -m 0755 tinysshnoneauthd $(DESTDIR)$(PREFIX)/sbin/tinysshnoneauthd $(INSTALL) -m 0644 man/tinysshd.8 $(DESTDIR)$(PREFIX)/share/man/man8/tinysshd.8 $(INSTALL) -m 0644 man/tinysshd-makekey.8 $(DESTDIR)$(PREFIX)/share/man/man8/tinysshd-makekey.8 $(INSTALL) -m 0644 man/tinysshd-printkey.8 $(DESTDIR)$(PREFIX)/share/man/man8/tinysshd-printkey.8 $(INSTALL) -m 0644 man/tinysshnoneauthd.8 $(DESTDIR)$(PREFIX)/share/man/man8/tinysshnoneauthd.8 clean: rm -f *.log libs $(OBJLIB) $(OBJALL) $(BINARIES) $(TESTCRYPTOBINARIES) $(LINKS) $(AUTOHEADERS) $(TESTOUT) tinyssh-20250501/README.md000066400000000000000000000054301500472222400147320ustar00rootroot00000000000000### Introduction ### * tinysshd is a minimalistic SSH server which implements only a subset of SSHv2 features. * tinysshd supports only secure cryptography (minimum 128-bit security, protected against cache-timing attacks) * tinysshd doesn't implement older crypto (such as RSA, DSA, HMAC-MD5, HMAC-SHA1, 3DES, RC4, ...) * tinysshd doesn't implement unsafe features (such as password or hostbased authentication) * tinysshd doesn't have features such: SSH1 protocol, compression, port forwarding, agent forwarding, X11 forwarding ... * tinysshd doesn't use dynamic memory allocation (no allocation failures, etc.) ### Crypto primitives ### * State-of-the-art crypto: ssh-ed25519, curve25519-sha256, chacha20-poly1305@openssh.com * Older standard: ecdsa-sha2-nistp256, ecdh-sha2-nistp256, aes256-ctr, hmac-sha2-256 removed in version 20190101 * Postquantum crypto: sntrup761x25519-sha512@openssh.com, chacha20-poly1305@openssh.com ### Project timelime ### * experimental: 2014.01.01 - 2014.12.31 (experimentation) * alpha(updated): 2015.01.01 - 2017.12.31 (not ready for production use, ready for testing) * beta(updated): 2018.01.01 - ????.??.?? (ready for production use) * stable: expected ????.??.?? - (ready for production use - including post-quantum crypto) ### Current release (20250501) ### * has 74260 words of code * beta release ### How-to compile and install ### ~~~ make sudo make install ~~~ ### How-to run ### ~~~ mkdir -p /etc/tinyssh tinysshd-makekey /etc/tinyssh/sshkeydir ~~~ ~~~ TCPSERVER tcpserver -HRDl0 0.0.0.0 22 /usr/sbin/tinysshd -v /etc/tinyssh/sshkeydir & BUSYBOX busybox tcpsvd 0 22 tinysshd -v /etc/tinyssh/sshkeydir & INETD /etc/inetd.conf: ssh stream tcp nowait root /usr/sbin/tinysshd tinysshd -l -v /etc/tinyssh/sshkeydir SYSTEMD tinysshd.socket: [Unit] Description=TinySSH server socket ConditionPathExists=!/etc/tinyssh/disable_tinysshd [Socket] ListenStream=22 Accept=yes [Install] WantedBy=sockets.target tinysshd@.service: [Unit] Description=Tiny SSH server After=network.target auditd.service [Service] ExecStartPre=-/usr/sbin/tinysshd-makekey -q /etc/tinyssh/sshkeydir EnvironmentFile=-/etc/default/tinysshd ExecStart=/usr/sbin/tinysshd ${TINYSSHDOPTS} -- /etc/tinyssh/sshkeydir KillMode=process SuccessExitStatus=111 StandardInput=socket StandardError=journal [Install] WantedBy=multi-user.target ~~~ tinyssh-20250501/_crypto-test_dh_x25519.inc000066400000000000000000000315571500472222400202230ustar00rootroot00000000000000/* ----- dh/x25519, derived from supercop/crypto_dh/try.c */ /* derived from djb work from lib25519/libntruprime mj modifications: - rename files to test-crypto.c and _crypto_<>.<>.inc - fix compiler warnings - include crypto.h - use less rounds for valgrind test - reformat using clang-format */ #include #include #include #include #include "crypto_dh_x25519.h" #define fail ((ok = 0), printf) static const char *dh_x25519_checksums[] = { "2c8a73ec86d5d4c4bc838f49cfd78c87b60b534ae6fff59ce3bea0c32cdc1450", "b09016b3a1371786b46a183085133338159e623c5eb9cbc5eaa4f8b62d6c5aea", }; static int (*crypto_dh_keypair)(unsigned char *, unsigned char *); static int (*crypto_dh)(unsigned char *, const unsigned char *, const unsigned char *); #define crypto_dh_SECRETKEYBYTES crypto_dh_x25519_SECRETKEYBYTES #define crypto_dh_PUBLICKEYBYTES crypto_dh_x25519_PUBLICKEYBYTES #define crypto_dh_BYTES crypto_dh_x25519_BYTES static void *storage_dh_x25519_a; static unsigned char *test_dh_x25519_a; static void *storage_dh_x25519_b; static unsigned char *test_dh_x25519_b; static void *storage_dh_x25519_c; static unsigned char *test_dh_x25519_c; static void *storage_dh_x25519_d; static unsigned char *test_dh_x25519_d; static void *storage_dh_x25519_e; static unsigned char *test_dh_x25519_e; static void *storage_dh_x25519_f; static unsigned char *test_dh_x25519_f; static void *storage_dh_x25519_a2; static unsigned char *test_dh_x25519_a2; static void *storage_dh_x25519_b2; static unsigned char *test_dh_x25519_b2; static void *storage_dh_x25519_c2; static unsigned char *test_dh_x25519_c2; static void *storage_dh_x25519_d2; static unsigned char *test_dh_x25519_d2; static void *storage_dh_x25519_e2; static unsigned char *test_dh_x25519_e2; static void *storage_dh_x25519_f2; static unsigned char *test_dh_x25519_f2; static void test_dh_x25519_impl(long long impl) { unsigned char *a = test_dh_x25519_a; unsigned char *b = test_dh_x25519_b; unsigned char *c = test_dh_x25519_c; unsigned char *d = test_dh_x25519_d; unsigned char *e = test_dh_x25519_e; unsigned char *f = test_dh_x25519_f; unsigned char *a2 = test_dh_x25519_a2; unsigned char *b2 = test_dh_x25519_b2; unsigned char *c2 = test_dh_x25519_c2; unsigned char *d2 = test_dh_x25519_d2; unsigned char *e2 = test_dh_x25519_e2; unsigned char *f2 = test_dh_x25519_f2; long long alen = crypto_dh_SECRETKEYBYTES; long long blen = crypto_dh_SECRETKEYBYTES; long long clen = crypto_dh_PUBLICKEYBYTES; long long dlen = crypto_dh_PUBLICKEYBYTES; long long elen = crypto_dh_BYTES; long long flen = crypto_dh_BYTES; if (targetn && atol(targetn) != impl) return; crypto_dh_keypair = crypto_dh_x25519_keypair; crypto_dh = crypto_dh_x25519; for (long long checksumbig = 0; checksumbig < 2; ++checksumbig) { long long loops = checksumbig ? 512 : 64; if (checksumbig && valgrind) break; checksum_clear(); for (long long loop = 0; loop < loops; ++loop) { output_prepare(c2, c, clen); output_prepare(a2, a, alen); crypto_dh_keypair(c, a); public(c, clen); public(a, alen); checksum(c, clen); checksum(a, alen); output_compare(c2, c, clen, "crypto_dh_keypair"); output_compare(a2, a, alen, "crypto_dh_keypair"); output_prepare(d2, d, dlen); output_prepare(b2, b, blen); crypto_dh_keypair(d, b); public(d, dlen); public(b, blen); checksum(d, dlen); checksum(b, blen); output_compare(d2, d, dlen, "crypto_dh_keypair"); output_compare(b2, b, blen, "crypto_dh_keypair"); output_prepare(e2, e, elen); memcpy(d2, d, dlen); double_canary(d2, d, dlen); memcpy(a2, a, alen); double_canary(a2, a, alen); secret(d, dlen); secret(a, alen); crypto_dh(e, d, a); public(d, dlen); public(a, alen); public(e, elen); checksum(e, elen); output_compare(e2, e, elen, "crypto_dh"); input_compare(d2, d, dlen, "crypto_dh"); input_compare(a2, a, alen, "crypto_dh"); double_canary(e2, e, elen); double_canary(d2, d, dlen); double_canary(a2, a, alen); secret(d2, dlen); secret(a2, alen); crypto_dh(e2, d2, a2); public(d2, dlen); public(a2, alen); public(e2, elen); if (memcmp(e2, e, elen) != 0) fail("failure: crypto_dh is nondeterministic\n"); double_canary(e2, e, elen); double_canary(d2, d, dlen); double_canary(a2, a, alen); secret(d2, dlen); secret(a, alen); crypto_dh(d2, d2, a); public(d2, elen); public(a, alen); if (memcmp(d2, e, elen) != 0) fail("failure: crypto_dh does not handle d=e overlap\n"); memcpy(d2, d, dlen); secret(d, dlen); secret(a2, alen); crypto_dh(a2, d, a2); public(a2, elen); public(d, dlen); if (memcmp(a2, e, elen) != 0) fail("failure: crypto_dh does not handle a=e overlap\n"); memcpy(a2, a, alen); output_prepare(f2, f, flen); memcpy(c2, c, clen); double_canary(c2, c, clen); memcpy(b2, b, blen); double_canary(b2, b, blen); secret(c, clen); secret(b, blen); crypto_dh(f, c, b); public(c, clen); public(b, blen); public(f, flen); checksum(f, flen); output_compare(f2, f, flen, "crypto_dh"); input_compare(c2, c, clen, "crypto_dh"); input_compare(b2, b, blen, "crypto_dh"); double_canary(f2, f, flen); double_canary(c2, c, clen); double_canary(b2, b, blen); secret(c2, clen); secret(b2, blen); crypto_dh(f2, c2, b2); public(c2, clen); public(b2, blen); public(f2, flen); if (memcmp(f2, f, flen) != 0) fail("failure: crypto_dh is nondeterministic\n"); double_canary(f2, f, flen); double_canary(c2, c, clen); double_canary(b2, b, blen); secret(c2, clen); secret(b, blen); crypto_dh(c2, c2, b); public(c2, flen); public(b, blen); if (memcmp(c2, f, flen) != 0) fail("failure: crypto_dh does not handle c=f overlap\n"); memcpy(c2, c, clen); secret(c, clen); secret(b2, blen); crypto_dh(b2, c, b2); public(b2, flen); public(c, clen); if (memcmp(b2, f, flen) != 0) fail("failure: crypto_dh does not handle b=f overlap\n"); memcpy(b2, b, blen); if (memcmp(f, e, elen) != 0) fail("failure: crypto_dh not associative\n"); } checksum_expected(dh_x25519_checksums[checksumbig]); } } void test_dh_x25519(void) { long long maxalloc = 0; if (targeto && strcmp(targeto, "dh")) return; if (targetp && strcmp(targetp, "x25519")) return; storage_dh_x25519_a = callocplus( crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); test_dh_x25519_a = aligned(storage_dh_x25519_a, crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); if (crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES > maxalloc) maxalloc = crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES; storage_dh_x25519_b = callocplus( crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); test_dh_x25519_b = aligned(storage_dh_x25519_b, crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); if (crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES > maxalloc) maxalloc = crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES; storage_dh_x25519_c = callocplus( crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); test_dh_x25519_c = aligned(storage_dh_x25519_c, crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); if (crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES > maxalloc) maxalloc = crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES; storage_dh_x25519_d = callocplus( crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); test_dh_x25519_d = aligned(storage_dh_x25519_d, crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); if (crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES > maxalloc) maxalloc = crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES; storage_dh_x25519_e = callocplus( crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); test_dh_x25519_e = aligned(storage_dh_x25519_e, crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); if (crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES > maxalloc) maxalloc = crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES; storage_dh_x25519_f = callocplus( crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); test_dh_x25519_f = aligned(storage_dh_x25519_f, crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); if (crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES > maxalloc) maxalloc = crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES; storage_dh_x25519_a2 = callocplus(maxalloc); test_dh_x25519_a2 = aligned(storage_dh_x25519_a2, crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); storage_dh_x25519_b2 = callocplus(maxalloc); test_dh_x25519_b2 = aligned(storage_dh_x25519_b2, crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); storage_dh_x25519_c2 = callocplus(maxalloc); test_dh_x25519_c2 = aligned(storage_dh_x25519_c2, crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); storage_dh_x25519_d2 = callocplus(maxalloc); test_dh_x25519_d2 = aligned(storage_dh_x25519_d2, crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); storage_dh_x25519_e2 = callocplus(maxalloc); test_dh_x25519_e2 = aligned(storage_dh_x25519_e2, crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); storage_dh_x25519_f2 = callocplus(maxalloc); test_dh_x25519_f2 = aligned(storage_dh_x25519_f2, crypto_dh_BYTES + crypto_dh_PUBLICKEYBYTES + crypto_dh_SECRETKEYBYTES); for (long long offset = 0; offset < 2; ++offset) { if (targetoffset && atol(targetoffset) != offset) continue; if (offset && valgrind) break; printf("dh_x25519 offset %lld\n", offset); forked(test_dh_x25519_impl, -1); ++test_dh_x25519_a; ++test_dh_x25519_b; ++test_dh_x25519_c; ++test_dh_x25519_d; ++test_dh_x25519_e; ++test_dh_x25519_f; ++test_dh_x25519_a2; ++test_dh_x25519_b2; ++test_dh_x25519_c2; ++test_dh_x25519_d2; ++test_dh_x25519_e2; ++test_dh_x25519_f2; } free(storage_dh_x25519_f2); free(storage_dh_x25519_e2); free(storage_dh_x25519_d2); free(storage_dh_x25519_c2); free(storage_dh_x25519_b2); free(storage_dh_x25519_a2); free(storage_dh_x25519_f); free(storage_dh_x25519_e); free(storage_dh_x25519_d); free(storage_dh_x25519_c); free(storage_dh_x25519_b); free(storage_dh_x25519_a); } #undef crypto_dh_SECRETKEYBYTES #undef crypto_dh_PUBLICKEYBYTES #undef crypto_dh_BYTES tinyssh-20250501/_crypto-test_hash_sha256.inc000066400000000000000000000104041500472222400206720ustar00rootroot00000000000000/* ----- hash/sha256, derived from supercop/crypto_hash/try.c */ /* derived from djb work from lib25519/libntruprime mj modifications: - rename files to test-crypto.c and _crypto_<>.<>.inc - fix compiler warnings - include crypto.h - use less rounds for valgrind test - reformat using clang-format */ #include #include #include #include #include "crypto.h" #define fail ((ok = 0), printf) static const char *hash_sha256_checksums[] = { "0fb5122d471d9310c4ff212c64a73cc985f0826484c24f34b56cb1d39534ba24", "55ff5e29282c4d7d192a20b427c000ec121fcda33dd96d53aa8857e3f2dd1469", }; static int (*crypto_hash)(unsigned char *, const unsigned char *, unsigned long long); #define crypto_hash_BYTES crypto_hash_sha256_BYTES static void *storage_hash_sha256_h; static unsigned char *test_hash_sha256_h; static void *storage_hash_sha256_m; static unsigned char *test_hash_sha256_m; static void *storage_hash_sha256_h2; static unsigned char *test_hash_sha256_h2; static void *storage_hash_sha256_m2; static unsigned char *test_hash_sha256_m2; static void test_hash_sha256_impl(long long impl) { unsigned char *h = test_hash_sha256_h; unsigned char *m = test_hash_sha256_m; unsigned char *h2 = test_hash_sha256_h2; unsigned char *m2 = test_hash_sha256_m2; long long hlen = crypto_hash_BYTES; long long mlen; if (targetn && atol(targetn) != impl) return; crypto_hash = crypto_hash_sha256; for (long long checksumbig = 0; checksumbig < 2; ++checksumbig) { long long loops = checksumbig ? 512 : 64; long long maxtest = checksumbig ? 4096 : 128; if (checksumbig && valgrind) break; checksum_clear(); for (long long loop = 0; loop < loops; ++loop) { mlen = myrandom() % (maxtest + 1); output_prepare(h2, h, hlen); input_prepare(m2, m, mlen); secret(m, mlen); crypto_hash(h, m, mlen); public(m, mlen); public(h, hlen); checksum(h, hlen); output_compare(h2, h, hlen, "crypto_hash"); input_compare(m2, m, mlen, "crypto_hash"); double_canary(h2, h, hlen); double_canary(m2, m, mlen); secret(m2, mlen); crypto_hash(h2, m2, mlen); public(m2, mlen); public(h2, hlen); if (memcmp(h2, h, hlen) != 0) fail("failure: crypto_hash is nondeterministic\n"); double_canary(h2, h, hlen); double_canary(m2, m, mlen); secret(m2, mlen); crypto_hash(m2, m2, mlen); public(m2, hlen); if (memcmp(m2, h, hlen) != 0) fail("failure: crypto_hash does not handle m=h overlap\n"); memcpy(m2, m, mlen); } checksum_expected(hash_sha256_checksums[checksumbig]); } } void test_hash_sha256(void) { long long maxalloc = 0; if (targeto && strcmp(targeto, "hash")) return; if (targetp && strcmp(targetp, "sha256")) return; storage_hash_sha256_h = callocplus(crypto_hash_BYTES); test_hash_sha256_h = aligned(storage_hash_sha256_h, crypto_hash_BYTES); if (crypto_hash_BYTES > maxalloc) maxalloc = crypto_hash_BYTES; storage_hash_sha256_m = callocplus(4096 + crypto_hash_BYTES); test_hash_sha256_m = aligned(storage_hash_sha256_m, 4096 + crypto_hash_BYTES); if (4096 + crypto_hash_BYTES > maxalloc) maxalloc = 4096 + crypto_hash_BYTES; storage_hash_sha256_h2 = callocplus(maxalloc); test_hash_sha256_h2 = aligned(storage_hash_sha256_h2, crypto_hash_BYTES); storage_hash_sha256_m2 = callocplus(maxalloc); test_hash_sha256_m2 = aligned(storage_hash_sha256_m2, 4096 + crypto_hash_BYTES); for (long long offset = 0; offset < 2; ++offset) { if (targetoffset && atol(targetoffset) != offset) continue; if (offset && valgrind) break; printf("hash_sha256 offset %lld\n", offset); forked(test_hash_sha256_impl, -1); ++test_hash_sha256_h; ++test_hash_sha256_m; ++test_hash_sha256_h2; ++test_hash_sha256_m2; } free(storage_hash_sha256_m2); free(storage_hash_sha256_h2); free(storage_hash_sha256_m); free(storage_hash_sha256_h); } #undef crypto_hash_BYTES tinyssh-20250501/_crypto-test_hash_sha512.inc000066400000000000000000000104041500472222400206650ustar00rootroot00000000000000/* ----- hash/sha512, derived from supercop/crypto_hash/try.c */ /* derived from djb work from lib25519/libntruprime mj modifications: - rename files to test-crypto.c and _crypto_<>.<>.inc - fix compiler warnings - include crypto.h - use less rounds for valgrind test - reformat using clang-format */ #include #include #include #include #include "crypto.h" #define fail ((ok = 0), printf) static const char *hash_sha512_checksums[] = { "8220572f58bd4730be165c9739d8d4b0fd2e0229dbe01e25b4aed23f00f23b70", "c1e322b7cbfc941260c5508967ba05bce22eeee94d425e708b7c3301ea1d5e2e", }; static int (*crypto_hash)(unsigned char *, const unsigned char *, unsigned long long); #define crypto_hash_BYTES crypto_hash_sha512_BYTES static void *storage_hash_sha512_h; static unsigned char *test_hash_sha512_h; static void *storage_hash_sha512_m; static unsigned char *test_hash_sha512_m; static void *storage_hash_sha512_h2; static unsigned char *test_hash_sha512_h2; static void *storage_hash_sha512_m2; static unsigned char *test_hash_sha512_m2; static void test_hash_sha512_impl(long long impl) { unsigned char *h = test_hash_sha512_h; unsigned char *m = test_hash_sha512_m; unsigned char *h2 = test_hash_sha512_h2; unsigned char *m2 = test_hash_sha512_m2; long long hlen = crypto_hash_BYTES; long long mlen; if (targetn && atol(targetn) != impl) return; crypto_hash = crypto_hash_sha512; for (long long checksumbig = 0; checksumbig < 2; ++checksumbig) { long long loops = checksumbig ? 512 : 64; long long maxtest = checksumbig ? 4096 : 128; if (checksumbig && valgrind) break; checksum_clear(); for (long long loop = 0; loop < loops; ++loop) { mlen = myrandom() % (maxtest + 1); output_prepare(h2, h, hlen); input_prepare(m2, m, mlen); secret(m, mlen); crypto_hash(h, m, mlen); public(m, mlen); public(h, hlen); checksum(h, hlen); output_compare(h2, h, hlen, "crypto_hash"); input_compare(m2, m, mlen, "crypto_hash"); double_canary(h2, h, hlen); double_canary(m2, m, mlen); secret(m2, mlen); crypto_hash(h2, m2, mlen); public(m2, mlen); public(h2, hlen); if (memcmp(h2, h, hlen) != 0) fail("failure: crypto_hash is nondeterministic\n"); double_canary(h2, h, hlen); double_canary(m2, m, mlen); secret(m2, mlen); crypto_hash(m2, m2, mlen); public(m2, hlen); if (memcmp(m2, h, hlen) != 0) fail("failure: crypto_hash does not handle m=h overlap\n"); memcpy(m2, m, mlen); } checksum_expected(hash_sha512_checksums[checksumbig]); } } void test_hash_sha512(void) { long long maxalloc = 0; if (targeto && strcmp(targeto, "hash")) return; if (targetp && strcmp(targetp, "sha512")) return; storage_hash_sha512_h = callocplus(crypto_hash_BYTES); test_hash_sha512_h = aligned(storage_hash_sha512_h, crypto_hash_BYTES); if (crypto_hash_BYTES > maxalloc) maxalloc = crypto_hash_BYTES; storage_hash_sha512_m = callocplus(4096 + crypto_hash_BYTES); test_hash_sha512_m = aligned(storage_hash_sha512_m, 4096 + crypto_hash_BYTES); if (4096 + crypto_hash_BYTES > maxalloc) maxalloc = 4096 + crypto_hash_BYTES; storage_hash_sha512_h2 = callocplus(maxalloc); test_hash_sha512_h2 = aligned(storage_hash_sha512_h2, crypto_hash_BYTES); storage_hash_sha512_m2 = callocplus(maxalloc); test_hash_sha512_m2 = aligned(storage_hash_sha512_m2, 4096 + crypto_hash_BYTES); for (long long offset = 0; offset < 2; ++offset) { if (targetoffset && atol(targetoffset) != offset) continue; if (offset && valgrind) break; printf("hash_sha512 offset %lld\n", offset); forked(test_hash_sha512_impl, -1); ++test_hash_sha512_h; ++test_hash_sha512_m; ++test_hash_sha512_h2; ++test_hash_sha512_m2; } free(storage_hash_sha512_m2); free(storage_hash_sha512_h2); free(storage_hash_sha512_m); free(storage_hash_sha512_h); } #undef crypto_hash_BYTES tinyssh-20250501/_crypto-test_kem_sntrup761.inc000066400000000000000000000226021500472222400213070ustar00rootroot00000000000000/* ----- kem/sntrup761, derived from supercop/crypto_kem/try.c */ /* derived from djb work from lib25519/libntruprime mj modifications: - rename files to test-crypto.c and _crypto_<>.<>.inc - fix compiler warnings - include crypto.h - use less rounds for valgrind test - reformat using clang-format */ #include #include #include #include #include "crypto.h" #define fail ((ok = 0), printf) static const char *kem_sntrup761_checksums[] = { "4081ab3f61bac9aae91bff7f9b212855177591ec4427dff2a501be124c5bb97d", "730a572b64fa05a42bce7b1573edc04b70ef75909db309c012aa27f53f1f2f41", }; static int (*crypto_kem_keypair)(unsigned char *, unsigned char *); static int (*crypto_kem_enc)(unsigned char *, unsigned char *, const unsigned char *); static int (*crypto_kem_dec)(unsigned char *, const unsigned char *, const unsigned char *); #define crypto_kem_SECRETKEYBYTES crypto_kem_sntrup761_SECRETKEYBYTES #define crypto_kem_PUBLICKEYBYTES crypto_kem_sntrup761_PUBLICKEYBYTES #define crypto_kem_CIPHERTEXTBYTES crypto_kem_sntrup761_CIPHERTEXTBYTES #define crypto_kem_BYTES crypto_kem_sntrup761_BYTES static void *storage_kem_sntrup761_p; static unsigned char *test_kem_sntrup761_p; static void *storage_kem_sntrup761_s; static unsigned char *test_kem_sntrup761_s; static void *storage_kem_sntrup761_k; static unsigned char *test_kem_sntrup761_k; static void *storage_kem_sntrup761_c; static unsigned char *test_kem_sntrup761_c; static void *storage_kem_sntrup761_t; static unsigned char *test_kem_sntrup761_t; static void *storage_kem_sntrup761_p2; static unsigned char *test_kem_sntrup761_p2; static void *storage_kem_sntrup761_s2; static unsigned char *test_kem_sntrup761_s2; static void *storage_kem_sntrup761_k2; static unsigned char *test_kem_sntrup761_k2; static void *storage_kem_sntrup761_c2; static unsigned char *test_kem_sntrup761_c2; static void *storage_kem_sntrup761_t2; static unsigned char *test_kem_sntrup761_t2; static void test_kem_sntrup761_impl(long long impl) { unsigned char *p = test_kem_sntrup761_p; unsigned char *s = test_kem_sntrup761_s; unsigned char *k = test_kem_sntrup761_k; unsigned char *c = test_kem_sntrup761_c; unsigned char *t = test_kem_sntrup761_t; unsigned char *p2 = test_kem_sntrup761_p2; unsigned char *s2 = test_kem_sntrup761_s2; unsigned char *k2 = test_kem_sntrup761_k2; unsigned char *c2 = test_kem_sntrup761_c2; unsigned char *t2 = test_kem_sntrup761_t2; long long plen = crypto_kem_PUBLICKEYBYTES; long long slen = crypto_kem_SECRETKEYBYTES; long long klen = crypto_kem_BYTES; long long clen = crypto_kem_CIPHERTEXTBYTES; long long tlen = crypto_kem_BYTES; if (targetn && atol(targetn) != impl) return; crypto_kem_keypair = crypto_kem_sntrup761_keypair; crypto_kem_enc = crypto_kem_sntrup761_enc; crypto_kem_dec = crypto_kem_sntrup761_dec; for (long long checksumbig = 0; checksumbig < 2; ++checksumbig) { long long loops = checksumbig ? 64 : 8; if (checksumbig && valgrind) break; checksum_clear(); for (long long loop = 0; loop < loops; ++loop) { output_prepare(p2, p, plen); output_prepare(s2, s, slen); crypto_kem_keypair(p, s); public(p, plen); public(s, slen); checksum(p, plen); checksum(s, slen); output_compare(p2, p, plen, "crypto_kem_keypair"); output_compare(s2, s, slen, "crypto_kem_keypair"); output_prepare(c2, c, clen); output_prepare(k2, k, klen); memcpy(p2, p, plen); double_canary(p2, p, plen); secret(p, plen); crypto_kem_enc(c, k, p); public(p, plen); public(c, clen); public(k, klen); checksum(c, clen); checksum(k, klen); output_compare(c2, c, clen, "crypto_kem_enc"); output_compare(k2, k, klen, "crypto_kem_enc"); input_compare(p2, p, plen, "crypto_kem_enc"); output_prepare(t2, t, tlen); memcpy(c2, c, clen); double_canary(c2, c, clen); memcpy(s2, s, slen); double_canary(s2, s, slen); secret(c, clen); secret(s, slen); crypto_kem_dec(t, c, s); public(c, clen); public(s, slen); public(t, tlen); if (memcmp(t, k, klen) != 0) fail("failure: crypto_kem_dec does not match k\n"); checksum(t, tlen); output_compare(t2, t, tlen, "crypto_kem_dec"); input_compare(c2, c, clen, "crypto_kem_dec"); input_compare(s2, s, slen, "crypto_kem_dec"); double_canary(t2, t, tlen); double_canary(c2, c, clen); double_canary(s2, s, slen); secret(c2, clen); secret(s2, slen); crypto_kem_dec(t2, c2, s2); public(c2, clen); public(s2, slen); public(t2, tlen); if (memcmp(t2, t, tlen) != 0) fail("failure: crypto_kem_dec is nondeterministic\n"); double_canary(t2, t, tlen); double_canary(c2, c, clen); double_canary(s2, s, slen); secret(c2, clen); secret(s, slen); crypto_kem_dec(c2, c2, s); public(c2, tlen); public(s, slen); if (memcmp(c2, t, tlen) != 0) fail("failure: crypto_kem_dec does not handle c=t overlap\n"); memcpy(c2, c, clen); secret(c, clen); secret(s2, slen); crypto_kem_dec(s2, c, s2); public(s2, tlen); public(c, clen); if (memcmp(s2, t, tlen) != 0) fail("failure: crypto_kem_dec does not handle s=t overlap\n"); memcpy(s2, s, slen); c[myrandom() % clen] += 1 + (myrandom() % 255); crypto_kem_dec(t, c, s); checksum(t, tlen); c[myrandom() % clen] += 1 + (myrandom() % 255); crypto_kem_dec(t, c, s); checksum(t, tlen); c[myrandom() % clen] += 1 + (myrandom() % 255); crypto_kem_dec(t, c, s); checksum(t, tlen); } checksum_expected(kem_sntrup761_checksums[checksumbig]); } } void test_kem_sntrup761(void) { long long maxalloc = 0; if (targeto && strcmp(targeto, "kem")) return; if (targetp && strcmp(targetp, "sntrup761")) return; storage_kem_sntrup761_p = callocplus(crypto_kem_PUBLICKEYBYTES); test_kem_sntrup761_p = aligned(storage_kem_sntrup761_p, crypto_kem_PUBLICKEYBYTES); if (crypto_kem_PUBLICKEYBYTES > maxalloc) maxalloc = crypto_kem_PUBLICKEYBYTES; storage_kem_sntrup761_s = callocplus(crypto_kem_SECRETKEYBYTES); test_kem_sntrup761_s = aligned(storage_kem_sntrup761_s, crypto_kem_SECRETKEYBYTES); if (crypto_kem_SECRETKEYBYTES > maxalloc) maxalloc = crypto_kem_SECRETKEYBYTES; storage_kem_sntrup761_k = callocplus(crypto_kem_BYTES); test_kem_sntrup761_k = aligned(storage_kem_sntrup761_k, crypto_kem_BYTES); if (crypto_kem_BYTES > maxalloc) maxalloc = crypto_kem_BYTES; storage_kem_sntrup761_c = callocplus(crypto_kem_CIPHERTEXTBYTES); test_kem_sntrup761_c = aligned(storage_kem_sntrup761_c, crypto_kem_CIPHERTEXTBYTES); if (crypto_kem_CIPHERTEXTBYTES > maxalloc) maxalloc = crypto_kem_CIPHERTEXTBYTES; storage_kem_sntrup761_t = callocplus(crypto_kem_BYTES); test_kem_sntrup761_t = aligned(storage_kem_sntrup761_t, crypto_kem_BYTES); if (crypto_kem_BYTES > maxalloc) maxalloc = crypto_kem_BYTES; storage_kem_sntrup761_p2 = callocplus(maxalloc); test_kem_sntrup761_p2 = aligned(storage_kem_sntrup761_p2, crypto_kem_PUBLICKEYBYTES); storage_kem_sntrup761_s2 = callocplus(maxalloc); test_kem_sntrup761_s2 = aligned(storage_kem_sntrup761_s2, crypto_kem_SECRETKEYBYTES); storage_kem_sntrup761_k2 = callocplus(maxalloc); test_kem_sntrup761_k2 = aligned(storage_kem_sntrup761_k2, crypto_kem_BYTES); storage_kem_sntrup761_c2 = callocplus(maxalloc); test_kem_sntrup761_c2 = aligned(storage_kem_sntrup761_c2, crypto_kem_CIPHERTEXTBYTES); storage_kem_sntrup761_t2 = callocplus(maxalloc); test_kem_sntrup761_t2 = aligned(storage_kem_sntrup761_t2, crypto_kem_BYTES); for (long long offset = 0; offset < 2; ++offset) { if (targetoffset && atol(targetoffset) != offset) continue; if (offset && valgrind) break; printf("kem_sntrup761 offset %lld\n", offset); forked(test_kem_sntrup761_impl, -1); ++test_kem_sntrup761_p; ++test_kem_sntrup761_s; ++test_kem_sntrup761_k; ++test_kem_sntrup761_c; ++test_kem_sntrup761_t; ++test_kem_sntrup761_p2; ++test_kem_sntrup761_s2; ++test_kem_sntrup761_k2; ++test_kem_sntrup761_c2; ++test_kem_sntrup761_t2; } free(storage_kem_sntrup761_t2); free(storage_kem_sntrup761_c2); free(storage_kem_sntrup761_k2); free(storage_kem_sntrup761_s2); free(storage_kem_sntrup761_p2); free(storage_kem_sntrup761_t); free(storage_kem_sntrup761_c); free(storage_kem_sntrup761_k); free(storage_kem_sntrup761_s); free(storage_kem_sntrup761_p); } #undef crypto_kem_SECRETKEYBYTES #undef crypto_kem_PUBLICKEYBYTES #undef crypto_kem_CIPHERTEXTBYTES #undef crypto_kem_BYTES tinyssh-20250501/_crypto-test_onetimeauth_poly1305.inc000066400000000000000000012746141500472222400225750ustar00rootroot00000000000000/* ----- onetimeauth/poly1305, derived from supercop/crypto_onetimeauth/try.c */ /* derived from djb work from lib25519/lib1305 mj modifications: - rename files to test-crypto.c and _crypto_<>.<>.inc - fix compiler warnings - include crypto.h - reformat using clang-format */ #include #include #include #include #include "crypto.h" #define fail ((ok = 0), printf) static const char *onetimeauth_poly1305_checksums[] = { "6e0b9cab26afe89025afa79802234668b378ae2a0f8415b062ece0174f8bdcef", "d31323d65ade3ad4f87a77aef4c31e87c3aecf32087f2706cf43f81b3b0868b9", }; static int (*crypto_onetimeauth)(unsigned char *, const unsigned char *, unsigned long long, const unsigned char *); static int (*crypto_onetimeauth_verify)(const unsigned char *, const unsigned char *, unsigned long long, const unsigned char *); #define crypto_onetimeauth_BYTES crypto_onetimeauth_poly1305_BYTES #define crypto_onetimeauth_KEYBYTES crypto_onetimeauth_poly1305_KEYBYTES static void *storage_onetimeauth_poly1305_a; static unsigned char *test_onetimeauth_poly1305_a; static void *storage_onetimeauth_poly1305_m; static unsigned char *test_onetimeauth_poly1305_m; static void *storage_onetimeauth_poly1305_k; static unsigned char *test_onetimeauth_poly1305_k; static void *storage_onetimeauth_poly1305_a2; static unsigned char *test_onetimeauth_poly1305_a2; static void *storage_onetimeauth_poly1305_m2; static unsigned char *test_onetimeauth_poly1305_m2; static void *storage_onetimeauth_poly1305_k2; static unsigned char *test_onetimeauth_poly1305_k2; #define precomputed_onetimeauth_poly1305_NUM 132 static const unsigned char precomputed_onetimeauth_poly1305[62157] = { 240, 69, 235, 32, 108, 34, 151, 76, 232, 193, 111, 66, 140, 216, 234, 96, 187, 71, 129, 10, 202, 48, 41, 121, 29, 132, 65, 170, 197, 121, 57, 170, 56, 158, 155, 151, 12, 157, 231, 95, 66, 183, 77, 112, 185, 170, 243, 152, 98, 32, 55, 186, 226, 246, 76, 216, 71, 9, 173, 178, 47, 23, 11, 112, 234, 148, 133, 192, 216, 86, 112, 85, 197, 250, 89, 178, 110, 145, 209, 15, 93, 205, 82, 133, 13, 231, 80, 227, 137, 5, 68, 158, 132, 168, 71, 242, 233, 239, 141, 233, 203, 97, 27, 253, 200, 172, 177, 123, 252, 197, 90, 85, 86, 74, 215, 197, 214, 195, 199, 35, 254, 108, 212, 244, 180, 245, 181, 105, 128, 128, 171, 186, 0, 31, 6, 66, 215, 178, 224, 175, 50, 34, 185, 186, 109, 100, 120, 15, 177, 108, 75, 245, 28, 136, 165, 39, 123, 249, 35, 213, 25, 215, 191, 52, 186, 86, 202, 29, 143, 188, 104, 177, 116, 37, 164, 225, 65, 231, 34, 164, 193, 226, 24, 136, 9, 253, 191, 115, 43, 240, 159, 119, 245, 182, 114, 222, 4, 144, 242, 88, 46, 43, 29, 152, 185, 81, 24, 3, 137, 90, 53, 222, 137, 156, 158, 70, 133, 134, 247, 43, 70, 54, 111, 208, 243, 230, 176, 29, 5, 24, 180, 178, 205, 227, 246, 134, 254, 241, 103, 226, 20, 192, 152, 26, 134, 253, 38, 117, 119, 240, 124, 215, 255, 227, 241, 235, 120, 136, 11, 91, 206, 145, 229, 75, 34, 67, 115, 104, 142, 224, 146, 95, 158, 6, 62, 168, 231, 217, 232, 246, 52, 228, 68, 56, 168, 144, 250, 16, 131, 144, 52, 26, 134, 169, 15, 120, 157, 168, 226, 100, 232, 221, 196, 38, 71, 153, 32, 204, 15, 130, 161, 8, 219, 227, 177, 23, 27, 28, 122, 204, 131, 14, 133, 6, 184, 140, 223, 98, 10, 251, 14, 72, 161, 120, 2, 229, 76, 200, 176, 65, 60, 180, 96, 163, 18, 241, 104, 236, 23, 19, 233, 69, 68, 13, 188, 206, 127, 206, 154, 127, 91, 14, 18, 197, 237, 104, 90, 15, 219, 79, 90, 14, 20, 67, 230, 106, 216, 95, 60, 20, 189, 246, 244, 127, 170, 49, 235, 172, 171, 209, 115, 112, 84, 103, 24, 231, 38, 178, 97, 107, 172, 82, 130, 246, 240, 134, 251, 9, 231, 127, 26, 174, 236, 199, 76, 70, 87, 169, 191, 239, 229, 65, 212, 252, 104, 193, 200, 9, 61, 75, 92, 5, 192, 172, 46, 176, 161, 22, 113, 197, 116, 176, 161, 104, 71, 112, 97, 158, 12, 160, 198, 248, 79, 9, 243, 132, 131, 23, 26, 162, 79, 1, 25, 198, 164, 89, 216, 138, 151, 120, 237, 245, 95, 77, 204, 84, 36, 207, 177, 51, 192, 189, 220, 167, 159, 29, 115, 55, 246, 128, 110, 65, 146, 19, 240, 127, 167, 214, 83, 63, 218, 56, 140, 254, 135, 151, 177, 61, 139, 200, 82, 205, 132, 39, 47, 116, 198, 53, 172, 137, 21, 135, 121, 203, 101, 112, 221, 219, 255, 50, 191, 165, 80, 2, 37, 62, 50, 93, 101, 176, 251, 189, 237, 243, 17, 227, 96, 104, 179, 58, 159, 105, 54, 47, 221, 214, 47, 95, 242, 210, 201, 213, 170, 25, 59, 46, 19, 35, 175, 232, 123, 125, 29, 110, 242, 103, 94, 148, 21, 32, 172, 246, 32, 27, 16, 121, 68, 171, 204, 231, 97, 95, 43, 100, 247, 127, 73, 247, 124, 121, 91, 82, 212, 121, 151, 222, 195, 60, 80, 67, 101, 59, 46, 130, 152, 207, 193, 106, 164, 202, 15, 237, 49, 210, 178, 72, 126, 54, 157, 17, 86, 85, 81, 114, 50, 21, 228, 25, 203, 79, 60, 55, 98, 37, 156, 86, 57, 99, 53, 255, 77, 253, 139, 129, 3, 10, 178, 220, 30, 62, 173, 33, 175, 231, 138, 239, 126, 241, 48, 28, 96, 222, 247, 44, 160, 75, 102, 137, 101, 232, 102, 235, 182, 124, 133, 13, 121, 241, 56, 191, 18, 97, 247, 174, 14, 240, 161, 192, 247, 127, 159, 227, 107, 247, 32, 172, 178, 57, 56, 169, 249, 79, 86, 136, 95, 190, 109, 2, 115, 252, 107, 109, 87, 42, 105, 77, 148, 217, 125, 158, 85, 87, 12, 148, 217, 158, 146, 237, 83, 220, 230, 110, 103, 72, 193, 223, 74, 72, 54, 103, 98, 254, 253, 74, 136, 247, 131, 161, 62, 140, 79, 246, 51, 102, 175, 42, 110, 10, 186, 234, 157, 213, 221, 170, 149, 126, 179, 244, 89, 191, 245, 248, 37, 136, 254, 17, 229, 212, 221, 96, 73, 41, 111, 195, 194, 11, 98, 47, 208, 188, 206, 189, 250, 45, 100, 52, 97, 17, 43, 159, 166, 64, 13, 0, 104, 189, 194, 117, 150, 7, 62, 42, 73, 10, 97, 2, 82, 160, 124, 209, 211, 141, 253, 214, 244, 85, 25, 188, 78, 8, 52, 126, 143, 152, 106, 43, 131, 44, 10, 59, 68, 111, 216, 176, 193, 118, 181, 127, 213, 239, 245, 35, 80, 195, 193, 163, 210, 34, 70, 94, 168, 221, 18, 145, 27, 83, 224, 165, 83, 62, 220, 53, 164, 94, 206, 196, 35, 247, 15, 143, 35, 33, 104, 197, 222, 122, 145, 246, 56, 32, 77, 115, 108, 45, 143, 170, 85, 130, 31, 90, 52, 26, 52, 83, 63, 111, 102, 88, 48, 157, 250, 187, 15, 161, 231, 39, 228, 163, 204, 92, 105, 17, 79, 136, 154, 105, 58, 79, 135, 170, 144, 203, 182, 88, 189, 27, 64, 0, 91, 148, 21, 13, 39, 28, 197, 197, 99, 196, 7, 49, 84, 46, 241, 231, 168, 122, 214, 30, 92, 80, 10, 230, 246, 196, 86, 70, 159, 129, 239, 0, 68, 15, 224, 48, 253, 148, 95, 236, 172, 55, 94, 187, 147, 190, 12, 174, 118, 101, 158, 72, 87, 70, 43, 63, 89, 230, 24, 41, 255, 168, 153, 167, 37, 217, 168, 104, 202, 19, 16, 125, 11, 60, 63, 42, 216, 152, 211, 203, 246, 102, 189, 68, 164, 255, 198, 249, 183, 252, 172, 243, 100, 250, 77, 143, 231, 251, 81, 12, 153, 129, 236, 105, 34, 184, 169, 224, 89, 99, 153, 3, 65, 137, 125, 168, 247, 231, 34, 185, 114, 210, 20, 239, 168, 130, 92, 67, 112, 54, 245, 196, 117, 122, 139, 204, 207, 240, 159, 245, 160, 175, 2, 19, 49, 133, 119, 128, 8, 179, 144, 246, 135, 129, 27, 53, 75, 210, 27, 217, 201, 232, 138, 209, 179, 205, 229, 184, 4, 200, 151, 230, 81, 46, 179, 15, 101, 13, 199, 32, 137, 105, 83, 232, 47, 95, 199, 240, 140, 6, 231, 32, 43, 238, 146, 15, 94, 46, 166, 99, 247, 186, 33, 156, 197, 122, 223, 195, 153, 58, 36, 250, 21, 244, 67, 228, 116, 158, 19, 193, 27, 196, 193, 114, 11, 109, 183, 112, 21, 213, 201, 178, 197, 98, 77, 130, 190, 26, 118, 157, 15, 25, 247, 170, 162, 27, 201, 90, 115, 89, 74, 171, 84, 175, 11, 59, 49, 95, 166, 99, 234, 247, 248, 33, 40, 131, 127, 27, 15, 142, 144, 252, 226, 241, 41, 54, 162, 211, 150, 170, 116, 216, 34, 208, 172, 163, 115, 151, 102, 154, 54, 31, 11, 18, 164, 234, 90, 47, 158, 13, 70, 211, 35, 235, 137, 89, 195, 233, 181, 184, 17, 148, 228, 78, 242, 179, 11, 194, 180, 242, 137, 209, 116, 28, 198, 97, 96, 21, 193, 214, 147, 67, 236, 43, 26, 211, 112, 97, 229, 24, 119, 180, 162, 91, 112, 142, 241, 160, 132, 20, 54, 50, 239, 180, 38, 33, 94, 205, 240, 94, 63, 140, 17, 235, 253, 220, 86, 161, 174, 20, 161, 191, 234, 106, 63, 54, 149, 73, 175, 149, 117, 77, 134, 26, 12, 242, 32, 85, 47, 14, 85, 250, 194, 23, 208, 7, 100, 202, 84, 57, 128, 5, 106, 44, 84, 124, 24, 136, 28, 184, 173, 98, 15, 87, 85, 233, 46, 239, 158, 79, 139, 153, 227, 52, 157, 0, 206, 9, 161, 189, 5, 217, 140, 115, 242, 158, 244, 103, 100, 173, 194, 147, 25, 76, 223, 51, 156, 7, 117, 198, 51, 109, 10, 158, 20, 119, 170, 97, 171, 223, 145, 160, 221, 192, 60, 79, 141, 221, 248, 132, 175, 162, 20, 30, 120, 102, 53, 1, 192, 200, 22, 84, 47, 11, 34, 148, 39, 149, 8, 84, 203, 219, 238, 237, 29, 86, 46, 88, 6, 218, 215, 172, 226, 166, 48, 149, 109, 105, 221, 235, 88, 168, 205, 38, 74, 87, 119, 50, 132, 133, 145, 164, 52, 219, 134, 155, 206, 171, 213, 86, 173, 106, 62, 175, 20, 56, 253, 169, 80, 104, 227, 254, 223, 223, 156, 125, 31, 202, 118, 63, 183, 249, 37, 204, 35, 155, 55, 158, 255, 142, 111, 80, 178, 227, 118, 37, 39, 67, 111, 115, 147, 232, 94, 245, 146, 16, 37, 241, 199, 38, 8, 170, 152, 135, 221, 186, 85, 146, 143, 21, 110, 163, 210, 173, 16, 219, 43, 145, 73, 213, 89, 103, 160, 103, 73, 134, 210, 140, 24, 228, 206, 24, 218, 216, 162, 115, 179, 13, 189, 242, 23, 106, 233, 171, 181, 215, 216, 252, 63, 154, 52, 241, 75, 129, 118, 217, 5, 128, 98, 34, 110, 135, 106, 13, 224, 13, 193, 18, 219, 23, 75, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 253, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 249, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 246, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 247, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 243, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 244, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 240, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 241, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 237, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 238, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 234, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 235, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 231, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 232, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 250, 255, 255, 23, 187, 20, 186, 106, 150, 129, 231, 55, 25, 111, 40, 7, 29, 120, 219, 48, 214, 198, 218, 161, 195, 149, 80, 68, 74, 35, 110, 110, 64, 78, 210, 1, 1, 116, 161, 40, 210, 173, 16, 205, 125, 130, 246, 59, 236, 213, 201, 97, 241, 246, 235, 108, 129, 39, 21, 156, 229, 73, 43, 210, 92, 63, 98, 188, 148, 2, 189, 9, 93, 196, 15, 19, 58, 61, 168, 39, 123, 31, 164, 52, 125, 186, 176, 70, 166, 238, 95, 246, 49, 115, 23, 125, 142, 251, 13, 147, 209, 1, 213, 75, 226, 180, 243, 57, 55, 29, 15, 79, 172, 45, 229, 8, 108, 58, 28, 42, 166, 23, 113, 186, 198, 123, 83, 207, 83, 110, 150, 196, 169, 90, 208, 124, 90, 221, 144, 106, 143, 234, 170, 91, 41, 129, 12, 45, 104, 222, 224, 173, 86, 173, 166, 89, 69, 108, 2, 97, 0, 117, 206, 191, 176, 22, 217, 49, 137, 8, 45, 85, 18, 128, 221, 121, 251, 177, 17, 120, 231, 73, 235, 247, 116, 139, 48, 76, 71, 177, 108, 142, 39, 28, 27, 2, 45, 139, 46, 103, 228, 187, 94, 113, 204, 224, 243, 213, 238, 65, 146, 113, 119, 84, 14, 123, 32, 125, 26, 197, 248, 67, 29, 251, 52, 102, 236, 229, 203, 83, 210, 112, 15, 105, 183, 39, 171, 6, 59, 138, 30, 13, 250, 190, 30, 216, 86, 36, 101, 91, 124, 7, 66, 185, 132, 49, 189, 174, 243, 105, 205, 151, 230, 96, 134, 251, 235, 75, 84, 4, 201, 116, 33, 221, 164, 16, 148, 21, 75, 57, 169, 99, 178, 157, 240, 115, 61, 237, 147, 24, 115, 143, 24, 97, 255, 7, 211, 52, 57, 79, 47, 155, 2, 223, 209, 106, 26, 167, 35, 211, 248, 211, 178, 92, 128, 100, 50, 117, 69, 150, 157, 228, 144, 60, 23, 203, 137, 97, 34, 13, 192, 236, 52, 136, 169, 215, 10, 146, 18, 214, 91, 127, 69, 177, 222, 111, 2, 38, 119, 188, 112, 161, 254, 157, 19, 237, 162, 77, 78, 175, 238, 35, 192, 154, 179, 70, 242, 92, 193, 3, 26, 203, 187, 244, 67, 132, 187, 69, 135, 224, 108, 59, 135, 244, 214, 211, 165, 158, 91, 54, 46, 200, 189, 157, 142, 212, 187, 238, 6, 198, 166, 220, 205, 14, 16, 129, 49, 195, 184, 155, 72, 245, 55, 37, 52, 0, 241, 100, 89, 224, 171, 139, 29, 118, 80, 174, 10, 36, 166, 179, 74, 203, 79, 245, 144, 190, 219, 159, 235, 62, 248, 92, 65, 182, 168, 213, 242, 207, 181, 154, 161, 132, 57, 15, 11, 244, 150, 195, 31, 52, 209, 35, 109, 137, 35, 206, 166, 84, 128, 113, 52, 235, 21, 227, 145, 33, 213, 66, 43, 149, 125, 237, 219, 167, 145, 24, 166, 70, 230, 115, 73, 140, 224, 135, 16, 156, 73, 60, 20, 169, 221, 196, 18, 221, 195, 93, 227, 250, 94, 244, 187, 27, 211, 22, 39, 136, 171, 192, 175, 96, 191, 100, 223, 54, 244, 124, 216, 0, 191, 120, 217, 185, 39, 128, 66, 9, 29, 54, 159, 19, 22, 87, 41, 108, 150, 16, 204, 144, 205, 170, 207, 51, 127, 61, 228, 128, 46, 7, 150, 121, 191, 7, 31, 152, 154, 140, 230, 237, 219, 114, 131, 77, 87, 143, 111, 67, 1, 194, 19, 209, 104, 155, 79, 118, 145, 212, 144, 250, 137, 211, 70, 93, 36, 168, 238, 12, 137, 193, 123, 57, 222, 136, 11, 191, 154, 43, 205, 218, 152, 235, 132, 19, 185, 147, 199, 247, 169, 35, 25, 203, 220, 125, 79, 138, 187, 217, 196, 57, 121, 24, 148, 94, 217, 41, 217, 113, 208, 155, 13, 49, 105, 52, 43, 35, 26, 190, 173, 182, 208, 118, 106, 17, 59, 67, 163, 115, 15, 191, 77, 128, 15, 241, 23, 49, 52, 250, 131, 221, 35, 96, 35, 105, 115, 219, 102, 243, 89, 137, 32, 119, 130, 36, 244, 79, 197, 250, 184, 224, 142, 194, 190, 84, 48, 85, 186, 244, 80, 250, 212, 253, 44, 80, 176, 226, 33, 210, 1, 59, 158, 244, 209, 22, 10, 235, 199, 187, 209, 3, 162, 216, 117, 4, 66, 34, 153, 162, 185, 76, 180, 61, 90, 63, 163, 93, 146, 28, 243, 205, 70, 252, 114, 227, 160, 130, 50, 4, 92, 5, 75, 194, 89, 71, 173, 127, 60, 218, 45, 82, 191, 31, 71, 241, 146, 141, 31, 212, 227, 48, 58, 148, 183, 156, 91, 114, 227, 39, 80, 54, 114, 16, 141, 86, 69, 14, 16, 234, 133, 93, 158, 158, 147, 245, 226, 61, 117, 82, 165, 171, 14, 182, 135, 253, 221, 221, 122, 112, 194, 138, 28, 29, 153, 113, 152, 166, 246, 124, 90, 171, 20, 150, 99, 117, 198, 62, 118, 65, 112, 150, 18, 248, 204, 195, 77, 142, 19, 168, 71, 138, 98, 235, 170, 194, 67, 188, 219, 46, 107, 164, 88, 25, 40, 104, 8, 249, 177, 27, 15, 245, 134, 213, 207, 229, 189, 138, 116, 73, 198, 37, 238, 252, 103, 54, 248, 188, 55, 191, 96, 172, 43, 89, 159, 60, 42, 148, 238, 35, 94, 15, 173, 217, 176, 238, 165, 118, 147, 92, 216, 53, 132, 111, 198, 175, 219, 39, 118, 135, 12, 74, 247, 13, 32, 228, 219, 49, 0, 241, 46, 119, 120, 203, 214, 200, 80, 45, 236, 185, 146, 244, 76, 189, 28, 162, 197, 121, 196, 60, 137, 177, 77, 113, 61, 23, 195, 57, 45, 226, 96, 134, 72, 50, 59, 173, 131, 168, 75, 149, 103, 133, 222, 219, 7, 199, 72, 124, 110, 66, 138, 210, 116, 66, 140, 115, 47, 235, 74, 126, 35, 247, 75, 220, 107, 88, 56, 92, 116, 209, 200, 139, 147, 178, 163, 84, 232, 87, 169, 236, 227, 108, 44, 28, 41, 197, 252, 104, 41, 146, 13, 80, 254, 32, 196, 133, 74, 90, 100, 133, 193, 32, 101, 99, 68, 166, 234, 38, 185, 220, 196, 135, 183, 236, 74, 243, 146, 6, 207, 19, 42, 128, 41, 61, 225, 83, 229, 126, 109, 162, 63, 242, 203, 141, 134, 143, 108, 151, 105, 98, 248, 67, 109, 61, 129, 8, 238, 58, 241, 175, 1, 131, 13, 216, 242, 189, 110, 12, 207, 99, 180, 88, 6, 205, 94, 2, 161, 44, 172, 203, 211, 172, 190, 104, 43, 28, 161, 176, 234, 194, 163, 43, 208, 215, 63, 12, 84, 125, 138, 148, 228, 174, 51, 107, 7, 77, 196, 131, 21, 239, 15, 206, 197, 10, 197, 156, 123, 115, 99, 90, 22, 175, 118, 247, 178, 237, 60, 196, 86, 23, 134, 17, 242, 177, 163, 71, 113, 198, 9, 82, 225, 182, 119, 130, 88, 150, 151, 155, 3, 124, 96, 172, 64, 24, 95, 92, 39, 57, 147, 14, 214, 121, 186, 99, 62, 41, 191, 207, 168, 66, 187, 173, 102, 108, 232, 158, 214, 38, 110, 137, 240, 201, 230, 13, 186, 174, 53, 47, 181, 80, 84, 87, 101, 125, 112, 237, 129, 118, 107, 37, 191, 74, 240, 116, 2, 111, 138, 57, 224, 0, 148, 148, 112, 112, 100, 108, 185, 173, 96, 200, 66, 150, 152, 246, 106, 212, 110, 161, 142, 147, 253, 185, 249, 248, 12, 235, 122, 32, 64, 244, 141, 87, 110, 253, 96, 232, 9, 4, 217, 70, 83, 237, 251, 131, 61, 199, 70, 176, 224, 222, 103, 157, 77, 224, 177, 110, 24, 103, 207, 34, 10, 161, 242, 172, 225, 68, 72, 209, 147, 6, 96, 162, 25, 249, 70, 170, 1, 10, 250, 121, 28, 52, 134, 149, 33, 0, 27, 188, 133, 133, 93, 5, 139, 73, 141, 60, 148, 62, 46, 94, 205, 2, 97, 115, 127, 45, 172, 182, 89, 68, 193, 222, 122, 134, 151, 179, 20, 13, 222, 137, 118, 179, 14, 40, 202, 230, 1, 11, 210, 143, 191, 167, 3, 239, 15, 166, 148, 143, 105, 3, 22, 105, 123, 8, 90, 177, 244, 82, 89, 226, 35, 10, 178, 31, 121, 160, 231, 1, 228, 207, 52, 4, 115, 135, 219, 108, 182, 31, 71, 51, 205, 81, 36, 70, 38, 243, 95, 59, 84, 76, 164, 117, 119, 251, 1, 149, 43, 224, 137, 217, 154, 143, 67, 222, 101, 236, 205, 92, 162, 28, 101, 255, 206, 208, 99, 55, 98, 114, 22, 239, 22, 146, 166, 176, 12, 117, 212, 202, 106, 215, 216, 212, 114, 26, 230, 255, 39, 117, 153, 75, 220, 237, 195, 36, 121, 214, 88, 222, 21, 244, 23, 213, 119, 216, 209, 211, 8, 190, 132, 142, 24, 138, 219, 195, 237, 185, 149, 228, 37, 186, 100, 35, 99, 145, 50, 167, 54, 91, 201, 136, 38, 120, 213, 135, 194, 172, 93, 16, 63, 71, 225, 205, 120, 79, 46, 83, 28, 248, 239, 185, 193, 192, 118, 129, 178, 78, 109, 100, 242, 164, 112, 218, 75, 41, 63, 186, 131, 48, 149, 249, 89, 248, 34, 216, 232, 200, 170, 48, 84, 155, 60, 5, 115, 220, 1, 27, 202, 142, 175, 79, 222, 122, 74, 182, 55, 148, 123, 150, 105, 51, 118, 251, 36, 146, 72, 241, 179, 48, 255, 78, 160, 12, 244, 66, 116, 64, 152, 244, 49, 125, 200, 198, 144, 178, 151, 132, 174, 53, 90, 82, 65, 131, 220, 93, 84, 99, 241, 145, 245, 19, 232, 176, 159, 113, 128, 248, 77, 94, 136, 122, 43, 179, 210, 242, 246, 201, 50, 230, 37, 175, 160, 189, 50, 238, 215, 173, 209, 238, 124, 181, 70, 67, 65, 68, 253, 122, 198, 235, 93, 202, 27, 65, 39, 110, 95, 4, 21, 29, 28, 196, 142, 28, 245, 225, 186, 27, 71, 174, 209, 107, 70, 21, 23, 246, 136, 26, 109, 83, 22, 216, 185, 247, 225, 178, 27, 255, 126, 33, 187, 4, 104, 249, 218, 223, 211, 233, 112, 250, 165, 235, 235, 55, 45, 172, 216, 141, 244, 90, 16, 95, 216, 50, 73, 34, 229, 252, 76, 110, 160, 158, 60, 25, 239, 161, 155, 249, 226, 30, 233, 74, 126, 13, 21, 41, 238, 72, 36, 69, 217, 214, 62, 167, 14, 73, 91, 152, 240, 136, 245, 244, 205, 9, 94, 200, 23, 144, 44, 208, 151, 111, 100, 36, 13, 187, 104, 113, 152, 205, 110, 90, 152, 156, 76, 140, 143, 192, 36, 76, 51, 8, 73, 50, 117, 64, 46, 26, 107, 14, 112, 206, 104, 226, 251, 254, 104, 231, 111, 32, 48, 90, 114, 210, 88, 51, 95, 33, 99, 63, 138, 7, 249, 212, 168, 2, 228, 116, 240, 184, 73, 240, 189, 238, 21, 242, 88, 226, 76, 178, 25, 218, 117, 168, 125, 191, 180, 83, 51, 83, 184, 192, 99, 172, 36, 197, 199, 184, 148, 79, 82, 235, 121, 10, 22, 53, 214, 20, 97, 248, 176, 117, 31, 151, 78, 22, 108, 130, 253, 0, 46, 46, 16, 49, 229, 32, 97, 142, 233, 29, 242, 81, 166, 86, 142, 198, 249, 91, 222, 38, 118, 44, 97, 78, 169, 1, 139, 124, 150, 233, 66, 187, 21, 251, 192, 43, 233, 85, 77, 50, 40, 167, 213, 159, 151, 37, 20, 3, 255, 252, 5, 121, 182, 191, 111, 96, 65, 139, 158, 202, 92, 113, 96, 42, 171, 92, 132, 47, 37, 188, 55, 70, 89, 49, 3, 26, 112, 183, 3, 95, 26, 221, 63, 68, 73, 106, 180, 50, 134, 58, 40, 77, 89, 14, 62, 232, 201, 210, 5, 64, 210, 152, 35, 111, 128, 60, 213, 104, 159, 134, 185, 4, 87, 9, 10, 140, 215, 195, 110, 222, 97, 90, 188, 82, 220, 36, 111, 128, 76, 237, 50, 210, 56, 153, 170, 116, 147, 58, 220, 77, 59, 242, 42, 66, 222, 52, 226, 102, 86, 171, 250, 244, 246, 105, 57, 38, 251, 236, 63, 238, 21, 15, 125, 224, 75, 93, 102, 72, 160, 174, 138, 238, 43, 49, 121, 237, 57, 108, 42, 197, 0, 47, 154, 168, 167, 50, 35, 104, 132, 128, 167, 188, 50, 227, 171, 74, 18, 206, 20, 112, 43, 11, 82, 20, 127, 94, 180, 219, 53, 93, 37, 0, 65, 211, 17, 26, 159, 12, 75, 189, 103, 27, 58, 92, 180, 238, 23, 214, 179, 81, 34, 209, 148, 141, 31, 212, 153, 70, 215, 204, 141, 101, 108, 101, 31, 69, 171, 97, 190, 219, 4, 232, 65, 226, 220, 132, 112, 166, 86, 96, 197, 153, 225, 186, 34, 141, 28, 26, 33, 3, 207, 47, 132, 16, 206, 92, 89, 118, 237, 235, 113, 139, 204, 143, 247, 44, 143, 250, 222, 5, 226, 78, 13, 169, 114, 245, 117, 63, 113, 72, 111, 2, 230, 233, 235, 119, 217, 98, 200, 87, 233, 178, 196, 157, 181, 39, 141, 244, 95, 113, 194, 124, 180, 88, 143, 169, 4, 168, 129, 118, 126, 248, 22, 159, 140, 46, 93, 123, 230, 236, 30, 237, 116, 193, 69, 50, 153, 2, 129, 44, 104, 21, 21, 70, 249, 164, 33, 67, 96, 71, 153, 72, 102, 15, 49, 44, 171, 82, 185, 109, 123, 97, 95, 209, 167, 98, 6, 11, 28, 218, 181, 23, 47, 133, 28, 73, 43, 20, 31, 86, 32, 123, 251, 39, 222, 6, 9, 124, 6, 209, 158, 18, 59, 66, 243, 255, 233, 92, 218, 114, 140, 80, 254, 198, 36, 182, 210, 254, 106, 28, 192, 251, 49, 127, 145, 56, 35, 86, 1, 11, 46, 62, 190, 231, 130, 234, 182, 12, 167, 168, 232, 225, 175, 204, 179, 83, 70, 103, 154, 99, 211, 143, 16, 123, 202, 149, 47, 143, 159, 33, 126, 218, 127, 90, 75, 129, 171, 230, 78, 91, 139, 240, 254, 124, 222, 160, 180, 250, 203, 217, 11, 62, 192, 64, 213, 79, 156, 235, 236, 204, 222, 97, 157, 66, 205, 0, 179, 147, 196, 136, 31, 154, 105, 225, 196, 151, 120, 236, 1, 159, 231, 36, 23, 197, 124, 95, 75, 7, 240, 70, 70, 114, 230, 195, 154, 138, 106, 87, 65, 141, 51, 67, 182, 12, 105, 38, 124, 215, 39, 125, 34, 143, 64, 111, 161, 189, 43, 248, 85, 78, 94, 52, 17, 228, 215, 45, 47, 194, 177, 140, 170, 110, 18, 234, 116, 90, 94, 15, 159, 15, 248, 143, 151, 103, 220, 187, 143, 246, 75, 40, 193, 157, 32, 238, 144, 11, 140, 115, 18, 42, 157, 72, 206, 68, 231, 81, 241, 96, 177, 163, 212, 235, 218, 28, 13, 32, 57, 45, 95, 101, 224, 129, 142, 71, 254, 165, 228, 169, 146, 32, 86, 37, 65, 124, 124, 204, 121, 83, 70, 162, 101, 101, 17, 193, 45, 160, 211, 149, 241, 18, 14, 132, 205, 28, 49, 59, 151, 148, 15, 104, 135, 219, 139, 4, 209, 173, 73, 176, 153, 214, 251, 216, 147, 193, 183, 230, 95, 226, 7, 239, 190, 60, 237, 143, 151, 230, 128, 182, 152, 97, 80, 219, 56, 71, 44, 194, 39, 212, 247, 220, 89, 138, 187, 175, 11, 80, 165, 119, 31, 146, 26, 128, 185, 133, 63, 33, 79, 101, 126, 248, 205, 163, 136, 252, 6, 105, 126, 22, 139, 235, 93, 166, 71, 135, 45, 194, 86, 99, 225, 77, 86, 85, 127, 85, 132, 236, 111, 182, 59, 118, 107, 183, 2, 169, 215, 208, 63, 241, 62, 232, 221, 110, 62, 97, 1, 18, 218, 56, 228, 44, 219, 65, 66, 27, 246, 163, 149, 79, 196, 246, 163, 97, 74, 114, 242, 106, 95, 226, 71, 211, 223, 89, 155, 99, 12, 149, 233, 198, 20, 151, 245, 255, 99, 48, 69, 238, 1, 14, 140, 107, 65, 39, 138, 75, 116, 30, 163, 58, 220, 55, 90, 227, 193, 247, 42, 189, 168, 40, 104, 128, 239, 6, 251, 114, 3, 124, 38, 166, 76, 47, 68, 160, 245, 46, 151, 252, 95, 199, 78, 234, 2, 19, 138, 189, 235, 208, 244, 39, 210, 195, 21, 190, 207, 30, 234, 197, 0, 158, 113, 252, 82, 244, 0, 38, 116, 177, 117, 144, 95, 200, 236, 56, 146, 75, 88, 45, 58, 84, 246, 213, 170, 188, 242, 185, 60, 146, 238, 34, 225, 44, 59, 52, 222, 75, 111, 56, 36, 149, 86, 226, 134, 74, 173, 61, 58, 147, 146, 68, 27, 36, 213, 195, 228, 252, 169, 221, 64, 190, 137, 203, 38, 76, 14, 160, 60, 57, 120, 221, 155, 8, 130, 95, 173, 76, 56, 162, 104, 191, 42, 108, 28, 60, 130, 72, 28, 3, 23, 16, 158, 43, 112, 224, 7, 197, 179, 24, 220, 85, 2, 104, 47, 167, 227, 92, 250, 147, 99, 21, 228, 181, 133, 57, 91, 195, 157, 252, 233, 146, 52, 0, 18, 140, 211, 37, 127, 236, 128, 237, 6, 110, 193, 106, 98, 83, 73, 11, 35, 225, 243, 115, 12, 19, 98, 216, 54, 189, 95, 255, 185, 135, 19, 45, 228, 75, 253, 227, 206, 88, 17, 145, 27, 192, 219, 124, 206, 81, 63, 238, 9, 35, 143, 126, 224, 122, 223, 164, 47, 108, 194, 157, 7, 161, 41, 180, 204, 141, 186, 4, 30, 44, 71, 250, 16, 65, 122, 117, 255, 43, 226, 229, 17, 212, 81, 241, 118, 182, 185, 173, 184, 205, 217, 58, 161, 10, 166, 23, 236, 120, 221, 86, 104, 142, 138, 155, 118, 14, 80, 224, 144, 211, 129, 250, 141, 96, 193, 215, 111, 134, 98, 4, 197, 31, 222, 5, 103, 209, 94, 24, 9, 218, 8, 120, 48, 56, 205, 246, 27, 100, 218, 245, 87, 218, 213, 165, 111, 223, 68, 230, 231, 87, 65, 221, 96, 128, 52, 182, 242, 161, 105, 180, 78, 90, 99, 9, 155, 130, 30, 168, 221, 132, 127, 123, 219, 46, 94, 217, 105, 24, 77, 184, 74, 254, 249, 68, 149, 255, 78, 124, 40, 69, 210, 231, 223, 90, 41, 19, 131, 168, 89, 88, 156, 103, 66, 118, 115, 60, 47, 90, 114, 193, 23, 18, 88, 236, 248, 206, 100, 51, 160, 12, 1, 58, 106, 240, 69, 182, 101, 236, 208, 200, 202, 155, 167, 158, 75, 136, 54, 88, 180, 70, 102, 181, 82, 200, 82, 34, 18, 175, 145, 157, 155, 132, 67, 178, 220, 56, 167, 8, 190, 6, 176, 220, 140, 75, 62, 202, 56, 1, 70, 87, 247, 111, 98, 215, 112, 131, 64, 74, 118, 110, 169, 229, 192, 169, 169, 35, 209, 66, 192, 25, 226, 228, 57, 224, 42, 145, 229, 171, 77, 111, 215, 141, 111, 116, 8, 210, 65, 109, 25, 38, 253, 69, 23, 80, 100, 94, 85, 209, 6, 84, 117, 237, 137, 4, 56, 176, 222, 242, 57, 170, 56, 119, 113, 76, 154, 74, 153, 196, 247, 13, 246, 176, 55, 96, 130, 23, 159, 64, 252, 90, 249, 45, 177, 53, 201, 75, 236, 156, 128, 162, 157, 114, 21, 41, 94, 42, 180, 3, 221, 86, 31, 175, 63, 67, 203, 24, 216, 228, 129, 220, 16, 58, 98, 254, 173, 137, 54, 151, 113, 172, 103, 159, 215, 208, 129, 212, 227, 176, 180, 34, 230, 215, 215, 192, 100, 197, 6, 226, 240, 238, 188, 232, 29, 197, 132, 62, 119, 38, 207, 158, 123, 108, 144, 173, 194, 67, 146, 54, 6, 229, 149, 244, 156, 23, 118, 3, 145, 0, 44, 29, 84, 46, 168, 162, 245, 184, 89, 5, 58, 137, 80, 116, 103, 62, 119, 49, 216, 186, 26, 195, 45, 152, 8, 105, 67, 52, 135, 82, 217, 8, 10, 176, 104, 10, 49, 197, 105, 23, 213, 216, 167, 172, 185, 74, 165, 66, 70, 182, 63, 205, 177, 22, 56, 238, 7, 217, 128, 246, 230, 210, 41, 24, 118, 8, 233, 193, 161, 175, 247, 18, 249, 24, 74, 237, 187, 67, 131, 234, 245, 238, 11, 99, 173, 98, 49, 136, 187, 160, 119, 98, 193, 52, 84, 92, 56, 248, 199, 143, 224, 136, 232, 22, 55, 183, 63, 7, 147, 126, 252, 145, 71, 125, 205, 254, 13, 13, 209, 136, 44, 90, 213, 111, 207, 74, 38, 230, 113, 249, 134, 57, 50, 233, 4, 164, 151, 114, 179, 28, 141, 180, 138, 54, 16, 72, 225, 63, 212, 74, 55, 137, 242, 7, 92, 129, 167, 154, 105, 215, 167, 24, 222, 13, 219, 57, 169, 191, 60, 177, 27, 22, 245, 208, 10, 6, 40, 198, 38, 116, 0, 70, 126, 172, 157, 99, 87, 206, 246, 229, 149, 37, 124, 223, 15, 173, 218, 59, 226, 0, 156, 179, 241, 4, 240, 28, 221, 11, 19, 15, 149, 117, 170, 79, 238, 97, 56, 24, 148, 234, 72, 219, 235, 29, 62, 35, 193, 67, 9, 169, 72, 16, 165, 45, 8, 46, 178, 146, 160, 112, 90, 206, 216, 12, 203, 32, 69, 101, 171, 30, 11, 182, 141, 41, 215, 141, 118, 199, 1, 64, 137, 214, 15, 90, 142, 97, 158, 30, 227, 207, 187, 85, 135, 223, 165, 145, 244, 48, 204, 67, 229, 240, 91, 119, 91, 16, 189, 197, 197, 5, 75, 45, 103, 239, 175, 102, 240, 253, 200, 118, 57, 136, 20, 93, 143, 70, 173, 221, 58, 77, 213, 235, 56, 73, 2, 69, 65, 20, 85, 232, 166, 41, 52, 132, 203, 8, 146, 138, 52, 37, 138, 153, 4, 195, 6, 239, 107, 175, 146, 127, 204, 59, 170, 134, 248, 87, 100, 71, 122, 209, 126, 101, 32, 46, 84, 116, 14, 20, 132, 234, 216, 135, 195, 134, 213, 72, 24, 47, 93, 219, 76, 240, 193, 228, 198, 4, 82, 172, 33, 54, 216, 15, 166, 7, 234, 254, 29, 255, 132, 0, 47, 72, 33, 8, 88, 227, 137, 163, 167, 203, 105, 71, 72, 242, 52, 85, 124, 28, 18, 61, 44, 189, 252, 176, 79, 121, 189, 167, 118, 99, 7, 90, 202, 181, 241, 4, 176, 168, 24, 110, 186, 85, 116, 45, 0, 179, 92, 201, 24, 135, 17, 76, 63, 80, 2, 25, 69, 138, 65, 205, 206, 154, 9, 167, 81, 60, 65, 140, 162, 1, 249, 19, 23, 242, 106, 148, 33, 210, 106, 169, 66, 212, 148, 212, 103, 75, 138, 94, 26, 95, 171, 110, 166, 30, 34, 2, 31, 86, 125, 126, 76, 181, 29, 144, 5, 135, 74, 103, 132, 5, 228, 91, 130, 158, 102, 205, 187, 100, 60, 221, 95, 234, 252, 255, 21, 156, 217, 109, 82, 111, 125, 180, 83, 2, 249, 197, 233, 168, 239, 226, 139, 81, 73, 24, 136, 196, 182, 41, 16, 108, 85, 211, 229, 77, 44, 248, 34, 119, 24, 60, 139, 195, 125, 147, 179, 215, 182, 159, 73, 73, 166, 168, 12, 233, 43, 79, 225, 26, 95, 42, 107, 79, 251, 104, 181, 1, 254, 157, 252, 155, 112, 6, 97, 240, 163, 220, 252, 170, 67, 234, 62, 236, 171, 97, 212, 232, 109, 215, 93, 45, 62, 170, 116, 239, 93, 110, 65, 108, 104, 12, 41, 204, 66, 208, 108, 98, 252, 182, 222, 130, 48, 133, 10, 113, 102, 45, 160, 119, 54, 198, 92, 255, 123, 103, 9, 36, 249, 200, 195, 210, 121, 137, 130, 221, 158, 225, 33, 108, 62, 22, 243, 179, 94, 119, 71, 129, 232, 104, 141, 111, 82, 142, 77, 208, 139, 142, 254, 62, 151, 19, 245, 190, 51, 119, 115, 145, 135, 189, 179, 144, 114, 52, 151, 228, 46, 80, 73, 94, 54, 174, 131, 85, 54, 100, 111, 230, 200, 196, 162, 149, 132, 148, 222, 227, 134, 28, 111, 95, 135, 112, 59, 145, 110, 46, 225, 25, 54, 102, 45, 211, 210, 218, 244, 175, 238, 246, 113, 221, 105, 35, 20, 217, 193, 239, 151, 30, 185, 13, 246, 49, 199, 31, 10, 200, 4, 147, 13, 198, 31, 154, 106, 194, 86, 219, 184, 226, 69, 203, 166, 110, 235, 47, 83, 199, 114, 156, 140, 88, 20, 208, 160, 58, 193, 224, 227, 237, 231, 218, 85, 209, 12, 10, 51, 54, 1, 209, 216, 57, 210, 245, 91, 157, 243, 132, 250, 207, 209, 145, 207, 57, 186, 208, 168, 252, 181, 100, 180, 108, 33, 64, 5, 209, 72, 27, 169, 207, 169, 15, 45, 207, 106, 173, 187, 196, 67, 56, 184, 20, 127, 28, 213, 254, 98, 131, 143, 90, 160, 112, 29, 224, 121, 249, 94, 210, 242, 45, 77, 7, 60, 191, 224, 91, 136, 108, 118, 163, 16, 80, 204, 121, 46, 156, 138, 145, 92, 69, 246, 105, 20, 188, 228, 166, 239, 79, 218, 26, 134, 13, 103, 47, 102, 73, 187, 54, 91, 198, 84, 154, 143, 224, 191, 103, 204, 43, 107, 121, 47, 127, 87, 26, 221, 193, 82, 105, 144, 126, 50, 205, 170, 113, 162, 44, 111, 248, 88, 189, 17, 150, 11, 226, 249, 113, 169, 199, 42, 241, 25, 67, 121, 117, 131, 159, 255, 77, 184, 70, 7, 187, 0, 132, 224, 162, 154, 186, 212, 60, 193, 46, 83, 103, 189, 128, 252, 135, 55, 156, 150, 190, 211, 122, 54, 107, 215, 156, 185, 127, 119, 244, 67, 29, 56, 85, 62, 165, 136, 4, 99, 24, 6, 201, 34, 189, 210, 178, 98, 9, 193, 211, 64, 83, 133, 38, 160, 151, 242, 197, 64, 242, 163, 85, 44, 167, 100, 255, 26, 137, 194, 47, 126, 213, 22, 115, 55, 224, 244, 49, 94, 160, 238, 115, 210, 255, 3, 204, 14, 149, 210, 172, 210, 54, 123, 138, 172, 61, 34, 215, 210, 19, 17, 97, 47, 151, 204, 157, 65, 195, 90, 239, 19, 11, 51, 91, 110, 240, 114, 9, 60, 232, 77, 136, 230, 107, 9, 33, 44, 180, 96, 79, 210, 22, 82, 28, 38, 46, 86, 197, 244, 115, 137, 75, 24, 33, 137, 169, 122, 101, 61, 183, 169, 93, 219, 133, 236, 232, 153, 243, 20, 187, 187, 254, 93, 167, 216, 118, 144, 224, 143, 178, 219, 137, 51, 8, 195, 249, 222, 100, 72, 22, 98, 165, 107, 144, 208, 112, 124, 71, 62, 31, 59, 129, 81, 69, 136, 100, 26, 251, 40, 203, 228, 244, 100, 250, 46, 187, 156, 111, 19, 99, 158, 2, 65, 132, 208, 218, 162, 74, 139, 38, 221, 115, 141, 164, 37, 203, 198, 220, 59, 153, 7, 163, 215, 250, 185, 73, 17, 29, 125, 1, 241, 162, 92, 94, 9, 191, 149, 98, 78, 134, 100, 152, 115, 41, 189, 212, 186, 82, 230, 133, 37, 119, 63, 84, 46, 99, 221, 20, 151, 159, 104, 117, 203, 11, 18, 41, 180, 149, 82, 142, 90, 95, 21, 39, 26, 255, 165, 28, 166, 136, 194, 180, 49, 62, 168, 207, 160, 8, 65, 62, 181, 3, 9, 202, 157, 22, 40, 53, 231, 18, 161, 224, 229, 230, 73, 12, 20, 95, 35, 6, 53, 132, 115, 210, 193, 164, 101, 60, 83, 215, 73, 95, 158, 247, 68, 248, 173, 177, 113, 151, 208, 166, 128, 162, 86, 187, 8, 106, 77, 144, 117, 32, 58, 99, 93, 98, 141, 73, 5, 72, 175, 116, 101, 251, 165, 117, 10, 39, 60, 165, 109, 193, 154, 242, 202, 180, 13, 35, 49, 13, 18, 209, 26, 90, 65, 163, 54, 119, 170, 74, 38, 176, 238, 245, 12, 168, 177, 100, 104, 199, 143, 106, 153, 183, 153, 85, 14, 22, 250, 162, 77, 5, 14, 36, 38, 178, 142, 4, 255, 1, 238, 63, 132, 27, 219, 195, 177, 98, 191, 13, 73, 235, 182, 172, 154, 152, 51, 142, 209, 105, 221, 34, 186, 50, 150, 30, 121, 153, 248, 82, 122, 54, 179, 132, 190, 126, 252, 21, 129, 106, 199, 65, 6, 84, 202, 205, 9, 110, 114, 4, 212, 66, 201, 55, 44, 186, 158, 59, 19, 154, 97, 94, 145, 142, 228, 25, 50, 35, 160, 117, 133, 231, 213, 143, 179, 245, 182, 67, 228, 85, 165, 129, 129, 147, 24, 164, 80, 152, 140, 254, 201, 231, 137, 172, 52, 132, 162, 40, 87, 177, 180, 77, 17, 172, 130, 122, 133, 69, 183, 187, 233, 84, 12, 160, 102, 164, 170, 160, 26, 83, 4, 3, 66, 172, 181, 63, 31, 43, 153, 236, 225, 147, 235, 36, 47, 208, 53, 77, 238, 163, 16, 4, 113, 100, 167, 104, 234, 115, 205, 116, 153, 247, 98, 220, 51, 213, 121, 74, 215, 21, 252, 180, 177, 101, 104, 54, 2, 93, 22, 69, 87, 126, 249, 150, 141, 65, 155, 133, 133, 184, 229, 185, 170, 62, 128, 243, 73, 229, 31, 201, 120, 44, 150, 146, 42, 67, 215, 220, 64, 245, 151, 179, 156, 178, 33, 224, 187, 191, 163, 99, 11, 81, 72, 88, 169, 140, 123, 135, 183, 175, 125, 100, 60, 157, 33, 84, 87, 211, 11, 62, 249, 213, 162, 100, 153, 52, 187, 86, 57, 52, 220, 27, 13, 199, 193, 123, 73, 156, 206, 146, 180, 137, 141, 25, 24, 181, 53, 41, 76, 39, 10, 141, 236, 236, 37, 152, 239, 61, 201, 106, 86, 196, 176, 145, 133, 84, 77, 29, 151, 127, 48, 191, 211, 83, 16, 66, 23, 85, 180, 164, 7, 26, 55, 174, 192, 46, 112, 208, 205, 46, 17, 14, 186, 157, 145, 136, 152, 190, 232, 121, 174, 19, 85, 150, 128, 242, 236, 243, 194, 123, 168, 138, 254, 154, 235, 3, 3, 217, 192, 181, 33, 148, 58, 85, 90, 234, 216, 180, 209, 37, 39, 211, 189, 147, 105, 199, 183, 93, 153, 195, 8, 235, 14, 31, 215, 3, 243, 213, 171, 212, 118, 180, 216, 142, 182, 233, 167, 93, 179, 144, 42, 6, 218, 241, 5, 113, 125, 90, 229, 22, 157, 43, 226, 8, 68, 145, 120, 58, 230, 87, 96, 108, 209, 98, 234, 86, 226, 190, 177, 227, 174, 146, 252, 17, 66, 23, 228, 6, 17, 185, 163, 144, 177, 115, 132, 86, 144, 205, 222, 192, 55, 100, 177, 2, 50, 52, 12, 241, 241, 136, 92, 249, 189, 231, 58, 90, 42, 132, 137, 184, 22, 206, 187, 250, 205, 15, 43, 217, 123, 57, 9, 69, 34, 163, 46, 70, 239, 145, 94, 255, 26, 3, 246, 150, 136, 181, 12, 211, 45, 115, 163, 221, 62, 64, 181, 112, 54, 78, 131, 143, 233, 55, 252, 233, 58, 191, 40, 213, 218, 121, 252, 58, 84, 92, 245, 19, 118, 99, 192, 213, 197, 159, 224, 184, 117, 237, 155, 216, 106, 61, 147, 19, 122, 233, 114, 219, 227, 29, 104, 188, 41, 89, 167, 40, 171, 64, 42, 174, 17, 61, 12, 143, 231, 82, 39, 53, 247, 63, 31, 153, 4, 112, 114, 140, 237, 154, 101, 96, 252, 187, 40, 226, 53, 39, 132, 224, 9, 225, 240, 30, 237, 202, 86, 238, 90, 142, 76, 192, 179, 248, 212, 104, 181, 20, 181, 218, 62, 71, 120, 54, 54, 30, 138, 73, 181, 92, 201, 194, 159, 213, 193, 195, 111, 236, 192, 168, 49, 3, 181, 115, 161, 145, 49, 115, 162, 6, 26, 228, 208, 12, 178, 241, 222, 97, 48, 135, 52, 78, 44, 13, 181, 119, 137, 140, 101, 164, 34, 205, 124, 85, 160, 59, 231, 7, 219, 164, 27, 172, 237, 139, 40, 124, 231, 108, 251, 165, 148, 17, 134, 1, 110, 127, 84, 73, 242, 79, 31, 140, 201, 213, 233, 126, 136, 60, 78, 122, 207, 89, 187, 1, 105, 137, 3, 128, 43, 213, 212, 201, 176, 101, 135, 228, 99, 118, 172, 151, 67, 5, 40, 56, 170, 3, 67, 104, 41, 220, 229, 206, 200, 13, 253, 19, 33, 225, 0, 99, 92, 212, 50, 121, 182, 57, 155, 115, 73, 100, 227, 213, 4, 115, 84, 223, 99, 138, 118, 105, 102, 10, 193, 236, 179, 64, 201, 199, 112, 241, 19, 86, 3, 181, 173, 99, 139, 188, 60, 22, 90, 69, 78, 223, 155, 216, 170, 27, 255, 254, 242, 6, 117, 167, 7, 48, 146, 59, 156, 1, 121, 240, 53, 8, 68, 43, 248, 120, 74, 244, 67, 249, 164, 37, 45, 30, 158, 184, 50, 173, 185, 98, 174, 246, 6, 243, 99, 171, 92, 152, 24, 164, 131, 171, 95, 102, 32, 81, 87, 76, 22, 42, 3, 134, 224, 137, 78, 73, 37, 34, 185, 244, 162, 20, 186, 210, 214, 245, 169, 77, 77, 40, 96, 103, 205, 133, 25, 181, 168, 68, 114, 32, 51, 214, 229, 167, 0, 82, 242, 104, 170, 29, 182, 124, 135, 229, 95, 125, 31, 245, 11, 105, 231, 220, 71, 155, 182, 151, 156, 51, 84, 165, 41, 138, 7, 154, 159, 94, 20, 118, 44, 239, 210, 167, 255, 176, 33, 224, 89, 135, 64, 62, 206, 94, 243, 175, 152, 123, 87, 46, 118, 106, 90, 50, 165, 74, 54, 189, 187, 206, 192, 240, 15, 52, 56, 92, 230, 66, 254, 233, 173, 135, 149, 147, 39, 137, 253, 17, 202, 117, 97, 43, 20, 253, 229, 241, 197, 61, 190, 239, 0, 5, 198, 140, 96, 203, 144, 25, 4, 140, 95, 21, 145, 148, 248, 155, 179, 42, 207, 122, 14, 233, 76, 222, 46, 147, 157, 216, 141, 137, 149, 168, 20, 44, 206, 93, 155, 152, 32, 242, 220, 191, 30, 24, 99, 28, 146, 11, 100, 76, 59, 212, 253, 115, 45, 1, 210, 230, 13, 166, 157, 21, 127, 131, 39, 85, 208, 146, 164, 199, 126, 90, 138, 40, 167, 207, 146, 252, 151, 139, 199, 69, 3, 249, 104, 2, 183, 45, 135, 43, 185, 231, 76, 154, 162, 50, 51, 84, 21, 146, 10, 120, 163, 20, 198, 92, 63, 186, 133, 112, 6, 123, 242, 50, 7, 192, 132, 72, 82, 233, 146, 186, 179, 209, 147, 5, 172, 157, 115, 158, 118, 62, 53, 15, 220, 140, 249, 125, 139, 90, 33, 236, 88, 54, 231, 225, 174, 211, 98, 224, 110, 169, 230, 217, 1, 232, 67, 144, 178, 225, 79, 48, 134, 101, 68, 29, 113, 0, 212, 175, 39, 102, 30, 54, 158, 250, 248, 193, 0, 18, 108, 3, 245, 226, 181, 156, 180, 96, 7, 14, 21, 86, 110, 213, 169, 179, 105, 76, 45, 90, 38, 53, 105, 173, 112, 252, 167, 179, 180, 38, 228, 172, 80, 103, 49, 84, 228, 26, 155, 127, 54, 134, 114, 132, 69, 69, 14, 12, 31, 112, 11, 217, 6, 181, 123, 80, 173, 224, 180, 69, 157, 224, 60, 92, 249, 139, 72, 76, 53, 118, 98, 21, 117, 210, 49, 96, 199, 81, 83, 13, 153, 40, 127, 210, 14, 114, 239, 33, 130, 137, 228, 215, 112, 30, 92, 201, 2, 178, 149, 27, 237, 40, 170, 225, 160, 253, 84, 55, 10, 32, 6, 58, 237, 144, 83, 4, 38, 222, 240, 117, 246, 130, 28, 129, 22, 153, 46, 41, 136, 173, 100, 37, 60, 254, 140, 218, 74, 43, 236, 64, 238, 190, 53, 20, 31, 92, 158, 184, 90, 205, 62, 34, 239, 125, 142, 76, 211, 88, 222, 90, 208, 22, 54, 103, 73, 87, 234, 11, 181, 6, 11, 209, 189, 143, 135, 154, 28, 154, 230, 185, 97, 108, 6, 84, 230, 208, 119, 84, 219, 32, 22, 148, 98, 69, 219, 172, 235, 58, 135, 151, 137, 123, 135, 219, 31, 89, 111, 224, 47, 86, 192, 185, 97, 155, 94, 160, 243, 85, 25, 213, 220, 19, 169, 220, 229, 88, 42, 101, 215, 139, 50, 119, 238, 129, 218, 158, 126, 126, 32, 232, 225, 214, 139, 74, 108, 128, 129, 196, 111, 120, 62, 213, 140, 186, 117, 25, 237, 196, 105, 28, 192, 165, 210, 28, 170, 60, 166, 180, 28, 115, 96, 92, 53, 199, 226, 153, 153, 58, 106, 215, 164, 79, 228, 221, 27, 64, 74, 131, 24, 32, 168, 72, 155, 141, 146, 140, 220, 10, 186, 210, 201, 39, 130, 103, 161, 51, 39, 217, 96, 104, 2, 152, 135, 88, 105, 103, 239, 169, 104, 13, 99, 83, 74, 11, 86, 158, 43, 34, 71, 95, 36, 155, 19, 222, 15, 38, 105, 190, 246, 185, 234, 74, 82, 16, 199, 48, 106, 248, 32, 233, 40, 186, 86, 126, 201, 151, 178, 1, 235, 226, 102, 225, 211, 85, 173, 133, 148, 253, 35, 207, 163, 250, 170, 152, 120, 73, 159, 231, 251, 248, 36, 66, 105, 110, 242, 202, 145, 74, 39, 239, 97, 85, 223, 7, 39, 242, 120, 71, 87, 16, 197, 113, 231, 191, 84, 240, 237, 15, 82, 194, 138, 186, 36, 171, 45, 176, 42, 255, 17, 226, 158, 91, 34, 120, 107, 19, 121, 28, 182, 246, 13, 198, 125, 47, 42, 111, 247, 195, 89, 169, 107, 162, 255, 57, 127, 126, 34, 149, 132, 94, 150, 152, 242, 178, 92, 20, 194, 117, 168, 133, 127, 84, 164, 176, 9, 39, 216, 174, 203, 192, 20, 219, 55, 190, 243, 44, 59, 143, 132, 137, 221, 170, 232, 228, 75, 96, 137, 91, 75, 208, 164, 132, 170, 228, 92, 142, 230, 136, 11, 173, 146, 155, 51, 224, 5, 144, 152, 47, 162, 58, 183, 18, 250, 148, 52, 227, 9, 3, 213, 176, 167, 222, 180, 68, 224, 156, 147, 97, 25, 93, 204, 169, 183, 233, 163, 163, 87, 70, 58, 62, 197, 103, 59, 34, 116, 5, 137, 131, 142, 77, 162, 155, 86, 179, 167, 145, 134, 106, 115, 10, 189, 105, 216, 100, 84, 204, 136, 47, 159, 196, 135, 172, 230, 101, 42, 144, 3, 255, 18, 133, 144, 63, 70, 65, 56, 234, 82, 79, 104, 69, 145, 99, 236, 131, 95, 161, 108, 66, 130, 101, 208, 40, 182, 179, 80, 252, 46, 239, 179, 136, 98, 229, 162, 138, 55, 141, 143, 247, 111, 111, 199, 113, 13, 251, 160, 179, 9, 134, 219, 165, 90, 73, 194, 125, 62, 65, 210, 219, 249, 141, 221, 129, 88, 193, 200, 152, 9, 146, 99, 238, 222, 54, 219, 125, 196, 150, 56, 225, 98, 244, 119, 65, 84, 237, 208, 133, 28, 20, 132, 129, 32, 215, 151, 143, 91, 191, 150, 236, 81, 71, 251, 172, 228, 17, 86, 228, 18, 73, 6, 49, 194, 29, 94, 137, 190, 149, 12, 166, 189, 138, 36, 225, 123, 165, 109, 180, 185, 210, 218, 59, 10, 35, 58, 63, 58, 151, 147, 217, 170, 51, 109, 106, 61, 110, 186, 154, 29, 181, 153, 160, 25, 205, 183, 96, 47, 30, 127, 188, 3, 19, 171, 241, 64, 238, 96, 161, 159, 105, 103, 184, 176, 164, 47, 224, 182, 161, 48, 78, 133, 228, 174, 125, 4, 209, 69, 199, 127, 131, 222, 112, 73, 7, 82, 54, 41, 76, 137, 61, 64, 66, 174, 165, 43, 15, 0, 38, 244, 82, 115, 17, 1, 214, 252, 99, 171, 94, 66, 23, 200, 145, 183, 87, 192, 125, 192, 36, 170, 239, 116, 180, 203, 29, 127, 165, 235, 163, 111, 161, 36, 17, 211, 175, 44, 131, 102, 231, 53, 9, 110, 214, 242, 224, 25, 2, 206, 33, 206, 173, 93, 49, 184, 131, 112, 153, 67, 91, 150, 50, 186, 100, 250, 19, 7, 186, 92, 60, 147, 70, 219, 109, 125, 109, 136, 145, 96, 249, 68, 206, 3, 170, 231, 100, 69, 60, 53, 97, 220, 62, 43, 60, 190, 51, 140, 214, 206, 118, 148, 217, 19, 52, 239, 240, 238, 129, 93, 31, 231, 237, 12, 251, 113, 31, 100, 23, 223, 58, 194, 149, 219, 141, 201, 207, 33, 199, 6, 192, 232, 16, 26, 112, 25, 141, 112, 254, 106, 119, 176, 82, 113, 242, 131, 132, 196, 146, 18, 182, 112, 147, 8, 194, 157, 143, 46, 105, 124, 189, 225, 58, 36, 193, 202, 87, 120, 216, 230, 190, 37, 18, 248, 26, 196, 52, 218, 176, 14, 215, 12, 228, 117, 252, 251, 99, 53, 36, 141, 221, 159, 185, 194, 87, 126, 224, 174, 189, 122, 15, 242, 79, 87, 164, 173, 84, 30, 210, 115, 42, 135, 137, 187, 247, 245, 161, 150, 166, 159, 223, 10, 255, 27, 17, 29, 226, 151, 116, 210, 196, 96, 7, 242, 137, 44, 182, 170, 69, 251, 144, 120, 49, 180, 194, 241, 29, 106, 33, 41, 126, 199, 121, 113, 175, 216, 162, 120, 59, 210, 70, 72, 174, 198, 87, 63, 70, 24, 91, 124, 54, 207, 166, 254, 56, 199, 35, 108, 238, 160, 10, 46, 76, 40, 77, 63, 66, 179, 77, 137, 10, 119, 65, 44, 252, 33, 72, 80, 119, 133, 53, 154, 64, 13, 14, 48, 235, 94, 222, 39, 192, 188, 203, 188, 132, 92, 40, 187, 201, 71, 101, 185, 125, 105, 104, 155, 155, 144, 64, 167, 97, 176, 56, 2, 139, 55, 200, 104, 129, 31, 129, 93, 13, 104, 80, 150, 39, 164, 211, 179, 18, 245, 175, 253, 131, 76, 66, 195, 0, 218, 183, 56, 71, 190, 163, 232, 74, 126, 116, 171, 61, 118, 245, 114, 28, 27, 115, 166, 191, 151, 117, 66, 26, 111, 100, 218, 209, 24, 245, 86, 154, 148, 36, 190, 212, 72, 134, 204, 187, 135, 72, 108, 188, 16, 98, 117, 64, 24, 195, 23, 135, 155, 7, 169, 54, 174, 236, 48, 156, 162, 62, 50, 243, 143, 26, 167, 212, 209, 195, 184, 39, 30, 172, 194, 156, 31, 1, 92, 87, 3, 91, 95, 22, 197, 8, 1, 134, 86, 137, 211, 21, 253, 220, 204, 109, 43, 15, 94, 56, 93, 165, 30, 41, 125, 148, 6, 101, 242, 242, 143, 195, 190, 52, 28, 134, 249, 221, 97, 90, 103, 66, 68, 70, 15, 243, 234, 54, 86, 73, 171, 151, 118, 220, 46, 176, 177, 60, 72, 131, 35, 232, 227, 19, 181, 255, 195, 179, 141, 226, 89, 65, 91, 80, 35, 163, 249, 216, 40, 14, 138, 146, 214, 223, 207, 162, 92, 106, 160, 193, 154, 180, 18, 61, 55, 163, 180, 95, 236, 66, 156, 121, 69, 172, 152, 41, 69, 15, 42, 133, 254, 192, 203, 208, 139, 57, 233, 68, 105, 164, 250, 193, 3, 230, 200, 124, 59, 147, 145, 21, 6, 227, 113, 229, 5, 253, 68, 156, 250, 241, 221, 253, 173, 16, 72, 174, 85, 5, 212, 145, 186, 60, 161, 3, 178, 195, 53, 104, 186, 157, 205, 158, 119, 100, 30, 212, 35, 158, 18, 76, 107, 159, 38, 113, 54, 105, 220, 222, 105, 138, 59, 59, 103, 60, 202, 155, 25, 18, 120, 176, 249, 142, 247, 244, 244, 85, 149, 9, 18, 240, 14, 82, 232, 190, 96, 128, 85, 51, 183, 60, 17, 167, 240, 212, 123, 15, 89, 148, 102, 40, 7, 178, 87, 100, 18, 246, 53, 249, 167, 115, 108, 205, 240, 223, 164, 67, 106, 26, 3, 122, 255, 178, 96, 64, 159, 2, 149, 49, 118, 68, 107, 146, 212, 131, 247, 233, 79, 66, 111, 240, 154, 114, 111, 202, 95, 136, 156, 211, 44, 146, 56, 190, 20, 70, 29, 8, 112, 140, 187, 118, 134, 16, 222, 9, 12, 145, 209, 195, 95, 158, 223, 132, 8, 122, 158, 31, 94, 195, 2, 226, 157, 186, 152, 218, 179, 190, 13, 129, 99, 3, 161, 246, 64, 199, 117, 86, 134, 201, 35, 116, 110, 150, 111, 21, 186, 3, 6, 219, 122, 179, 184, 111, 171, 52, 14, 227, 29, 166, 245, 37, 22, 178, 77, 52, 91, 200, 18, 167, 172, 203, 28, 104, 140, 163, 190, 27, 63, 227, 246, 254, 171, 14, 195, 149, 218, 90, 18, 120, 137, 91, 112, 82, 135, 234, 8, 106, 169, 78, 130, 241, 50, 4, 133, 119, 27, 19, 199, 125, 243, 175, 231, 129, 89, 93, 205, 91, 215, 27, 28, 224, 74, 203, 98, 38, 150, 139, 46, 97, 158, 190, 15, 65, 26, 56, 7, 219, 146, 65, 187, 88, 80, 235, 110, 115, 121, 67, 165, 182, 123, 10, 69, 94, 2, 29, 82, 233, 241, 133, 149, 168, 94, 154, 20, 176, 205, 103, 140, 176, 73, 185, 2, 206, 246, 223, 25, 7, 43, 194, 154, 102, 158, 183, 23, 51, 205, 44, 244, 102, 251, 224, 215, 63, 158, 17, 173, 84, 41, 137, 250, 106, 248, 212, 189, 101, 27, 53, 242, 26, 175, 203, 30, 197, 105, 67, 4, 194, 49, 201, 16, 9, 77, 41, 0, 70, 17, 228, 154, 98, 35, 10, 69, 155, 132, 250, 26, 250, 81, 58, 207, 106, 131, 96, 167, 155, 143, 189, 12, 144, 206, 182, 12, 52, 166, 150, 214, 247, 195, 26, 18, 162, 126, 140, 21, 244, 231, 241, 195, 248, 9, 162, 99, 17, 94, 147, 59, 152, 67, 137, 253, 188, 251, 104, 136, 171, 86, 141, 175, 163, 178, 108, 249, 109, 175, 254, 141, 211, 236, 196, 163, 248, 253, 38, 138, 148, 112, 18, 200, 211, 129, 62, 152, 75, 231, 35, 48, 156, 163, 127, 65, 164, 142, 22, 220, 153, 67, 225, 102, 157, 236, 249, 30, 242, 242, 174, 145, 185, 252, 99, 213, 173, 31, 172, 85, 216, 35, 7, 208, 44, 58, 88, 169, 164, 208, 147, 156, 247, 211, 166, 151, 231, 67, 134, 3, 68, 204, 233, 91, 87, 143, 142, 154, 144, 55, 22, 243, 149, 241, 158, 210, 1, 35, 226, 223, 234, 10, 85, 204, 46, 42, 170, 72, 188, 179, 166, 166, 188, 72, 196, 38, 15, 140, 227, 11, 255, 31, 0, 220, 113, 98, 38, 165, 243, 15, 59, 240, 57, 40, 195, 176, 89, 174, 207, 99, 236, 172, 9, 139, 10, 28, 157, 55, 60, 56, 154, 61, 230, 18, 219, 186, 212, 200, 209, 107, 8, 247, 173, 124, 43, 211, 183, 60, 178, 60, 249, 14, 155, 192, 72, 117, 2, 75, 164, 214, 100, 228, 236, 90, 243, 150, 124, 37, 149, 86, 243, 227, 184, 140, 121, 127, 94, 0, 88, 206, 17, 23, 147, 72, 185, 213, 112, 12, 68, 251, 55, 152, 96, 87, 32, 213, 48, 168, 80, 85, 193, 104, 240, 154, 118, 79, 230, 19, 221, 22, 218, 49, 99, 153, 11, 223, 210, 134, 52, 254, 59, 58, 62, 33, 73, 26, 244, 254, 63, 219, 152, 65, 6, 149, 222, 175, 116, 101, 19, 201, 40, 34, 114, 41, 142, 173, 149, 60, 92, 148, 90, 1, 124, 35, 24, 232, 238, 136, 8, 52, 60, 173, 5, 206, 102, 149, 208, 127, 58, 165, 114, 93, 127, 135, 5, 98, 236, 234, 47, 42, 176, 206, 12, 209, 240, 244, 204, 228, 26, 120, 40, 157, 152, 240, 93, 127, 103, 46, 106, 251, 250, 12, 144, 35, 223, 164, 187, 250, 171, 246, 86, 88, 180, 169, 71, 196, 105, 53, 98, 83, 101, 152, 169, 12, 183, 128, 98, 63, 39, 97, 201, 191, 65, 56, 18, 86, 159, 93, 230, 78, 73, 246, 239, 168, 65, 102, 21, 149, 74, 10, 243, 71, 184, 213, 101, 17, 169, 216, 57, 224, 12, 129, 169, 15, 137, 91, 115, 207, 38, 231, 49, 138, 55, 224, 1, 188, 53, 134, 73, 9, 126, 82, 64, 127, 189, 222, 209, 45, 41, 87, 10, 204, 25, 2, 52, 105, 117, 57, 39, 167, 98, 251, 164, 241, 245, 237, 27, 100, 245, 131, 61, 14, 159, 139, 91, 94, 232, 82, 101, 143, 14, 8, 31, 68, 199, 8, 176, 98, 22, 4, 29, 85, 22, 35, 169, 105, 17, 154, 199, 110, 116, 156, 195, 65, 251, 107, 250, 82, 199, 215, 168, 254, 107, 92, 124, 135, 140, 154, 56, 159, 124, 91, 157, 95, 158, 29, 203, 248, 230, 60, 226, 47, 84, 13, 82, 19, 188, 73, 131, 118, 165, 132, 104, 109, 8, 104, 252, 206, 3, 218, 245, 186, 139, 21, 34, 71, 185, 100, 172, 208, 171, 72, 165, 176, 219, 193, 160, 133, 155, 239, 220, 93, 91, 49, 149, 98, 28, 135, 247, 94, 55, 221, 76, 10, 50, 17, 77, 18, 50, 209, 206, 161, 110, 55, 243, 206, 191, 53, 240, 60, 80, 98, 230, 40, 158, 40, 245, 104, 13, 171, 125, 55, 251, 218, 33, 34, 33, 39, 136, 250, 199, 23, 125, 38, 173, 139, 218, 245, 170, 101, 254, 71, 215, 153, 198, 43, 97, 204, 155, 243, 64, 126, 50, 66, 235, 138, 123, 174, 170, 187, 185, 223, 94, 116, 234, 181, 70, 80, 222, 172, 235, 90, 8, 148, 168, 216, 203, 104, 150, 141, 242, 240, 158, 197, 255, 178, 147, 57, 103, 15, 116, 188, 229, 80, 88, 223, 141, 88, 84, 221, 130, 30, 41, 232, 158, 175, 36, 107, 206, 71, 188, 120, 247, 64, 220, 123, 215, 242, 97, 190, 8, 199, 211, 16, 70, 238, 199, 94, 96, 247, 67, 72, 189, 170, 129, 93, 164, 133, 168, 97, 73, 119, 76, 145, 181, 216, 11, 243, 88, 100, 46, 71, 8, 96, 174, 155, 129, 169, 161, 29, 242, 142, 116, 235, 83, 101, 26, 11, 166, 135, 194, 93, 42, 30, 79, 215, 100, 70, 32, 68, 63, 255, 201, 155, 164, 111, 95, 223, 10, 109, 166, 2, 196, 220, 235, 122, 58, 230, 96, 51, 146, 98, 32, 42, 52, 99, 76, 162, 98, 212, 86, 142, 56, 60, 84, 20, 207, 116, 186, 229, 45, 0, 174, 52, 89, 130, 36, 56, 26, 174, 86, 43, 149, 110, 122, 33, 60, 213, 222, 181, 128, 37, 97, 11, 178, 208, 217, 72, 146, 201, 59, 250, 194, 98, 14, 121, 213, 47, 61, 70, 48, 110, 102, 212, 63, 64, 131, 65, 49, 21, 83, 103, 14, 4, 65, 164, 36, 224, 166, 5, 216, 72, 14, 75, 89, 241, 99, 166, 25, 176, 44, 112, 138, 237, 76, 48, 240, 103, 179, 164, 132, 199, 89, 75, 7, 227, 188, 0, 125, 165, 157, 104, 56, 57, 134, 204, 149, 69, 123, 162, 236, 93, 131, 32, 45, 167, 188, 22, 152, 200, 217, 45, 41, 37, 17, 117, 39, 233, 94, 123, 38, 188, 226, 202, 194, 25, 214, 47, 159, 114, 229, 46, 57, 225, 59, 230, 43, 17, 205, 17, 135, 44, 62, 209, 10, 50, 219, 81, 17, 51, 179, 29, 175, 152, 253, 58, 227, 207, 178, 233, 37, 171, 49, 232, 252, 166, 124, 145, 128, 112, 155, 88, 166, 87, 238, 55, 44, 82, 229, 248, 216, 56, 172, 208, 206, 12, 107, 66, 189, 80, 231, 230, 170, 241, 251, 115, 41, 54, 229, 34, 75, 71, 54, 11, 48, 187, 203, 243, 45, 242, 79, 142, 106, 112, 218, 17, 134, 42, 231, 50, 133, 57, 8, 123, 207, 2, 181, 86, 52, 238, 59, 138, 88, 124, 70, 12, 249, 203, 41, 242, 68, 94, 8, 78, 252, 35, 7, 148, 212, 138, 193, 98, 43, 47, 252, 170, 247, 176, 0, 51, 54, 207, 124, 61, 60, 38, 254, 242, 116, 51, 10, 206, 184, 99, 5, 40, 38, 77, 227, 186, 112, 187, 187, 117, 109, 193, 75, 220, 39, 125, 65, 73, 158, 53, 62, 236, 166, 129, 91, 99, 103, 100, 180, 112, 115, 65, 17, 159, 99, 19, 178, 81, 100, 76, 7, 17, 90, 166, 149, 232, 239, 47, 175, 206, 3, 87, 220, 177, 64, 229, 72, 30, 51, 168, 96, 170, 178, 240, 126, 85, 23, 173, 153, 243, 61, 13, 10, 158, 150, 71, 15, 197, 51, 230, 28, 21, 178, 53, 231, 155, 82, 154, 157, 140, 185, 143, 236, 106, 43, 250, 253, 162, 59, 78, 52, 182, 195, 192, 205, 101, 0, 140, 167, 141, 84, 93, 181, 156, 163, 42, 22, 115, 38, 144, 98, 82, 255, 18, 162, 23, 187, 81, 29, 121, 28, 248, 4, 86, 32, 12, 170, 232, 21, 27, 75, 99, 246, 140, 178, 228, 181, 205, 112, 65, 116, 82, 90, 245, 179, 101, 112, 31, 111, 231, 1, 222, 137, 34, 103, 75, 23, 26, 39, 17, 126, 109, 20, 223, 250, 205, 110, 226, 246, 221, 162, 190, 231, 27, 215, 57, 162, 78, 201, 175, 8, 224, 100, 146, 54, 194, 59, 182, 191, 174, 134, 142, 167, 78, 34, 184, 61, 98, 21, 57, 190, 51, 121, 199, 26, 233, 110, 152, 27, 8, 36, 150, 239, 231, 44, 78, 87, 234, 154, 6, 50, 217, 41, 34, 133, 94, 50, 211, 145, 67, 137, 29, 17, 15, 3, 41, 68, 131, 47, 131, 242, 210, 171, 83, 62, 186, 43, 248, 34, 42, 19, 216, 198, 232, 164, 26, 89, 34, 17, 128, 71, 129, 192, 27, 94, 136, 10, 234, 217, 151, 101, 25, 171, 156, 130, 18, 160, 77, 125, 182, 45, 234, 114, 106, 213, 249, 144, 219, 32, 206, 136, 121, 199, 158, 235, 62, 67, 22, 240, 81, 68, 151, 142, 37, 122, 62, 45, 68, 147, 43, 70, 109, 13, 102, 173, 140, 211, 47, 124, 132, 117, 255, 122, 179, 24, 148, 183, 241, 134, 123, 133, 45, 39, 52, 38, 12, 146, 119, 48, 176, 35, 134, 121, 90, 152, 89, 202, 229, 55, 213, 47, 194, 3, 1, 120, 39, 3, 132, 77, 47, 130, 224, 238, 21, 117, 238, 254, 218, 151, 182, 87, 81, 43, 178, 203, 39, 234, 66, 164, 111, 255, 242, 159, 8, 119, 182, 32, 67, 66, 145, 145, 131, 139, 176, 12, 197, 203, 67, 23, 87, 204, 113, 247, 122, 51, 28, 183, 166, 233, 140, 201, 103, 9, 181, 37, 182, 114, 4, 228, 205, 242, 175, 118, 134, 123, 63, 31, 17, 45, 112, 43, 71, 181, 35, 54, 102, 72, 107, 192, 172, 64, 175, 88, 239, 41, 207, 169, 156, 156, 130, 203, 17, 247, 153, 215, 60, 149, 200, 109, 166, 235, 83, 248, 221, 201, 86, 105, 113, 34, 3, 144, 26, 165, 58, 53, 60, 109, 142, 74, 212, 22, 53, 27, 189, 136, 211, 248, 47, 214, 58, 82, 132, 185, 244, 109, 71, 145, 164, 54, 183, 243, 244, 243, 22, 106, 65, 236, 24, 96, 7, 47, 52, 65, 254, 92, 182, 20, 210, 60, 254, 251, 196, 56, 82, 232, 21, 82, 11, 34, 197, 140, 106, 64, 54, 129, 45, 190, 8, 71, 100, 85, 128, 173, 143, 128, 230, 8, 141, 243, 114, 247, 127, 242, 207, 47, 7, 125, 206, 166, 23, 132, 42, 148, 114, 168, 204, 77, 197, 180, 221, 20, 37, 24, 147, 210, 120, 220, 95, 203, 77, 217, 160, 78, 156, 90, 236, 119, 254, 42, 248, 60, 192, 118, 247, 122, 161, 56, 226, 186, 148, 175, 103, 44, 220, 217, 189, 45, 169, 23, 131, 103, 82, 109, 74, 83, 32, 195, 110, 175, 224, 84, 26, 60, 90, 96, 189, 172, 229, 118, 228, 96, 99, 65, 212, 252, 104, 23, 79, 249, 123, 26, 34, 158, 231, 125, 122, 18, 34, 162, 151, 118, 239, 148, 220, 243, 103, 100, 1, 205, 185, 41, 20, 77, 235, 54, 41, 214, 180, 237, 24, 225, 147, 27, 25, 14, 110, 93, 86, 214, 3, 183, 162, 32, 3, 174, 146, 19, 236, 75, 243, 203, 107, 102, 1, 79, 221, 4, 146, 153, 91, 163, 195, 17, 26, 248, 214, 172, 78, 29, 104, 228, 32, 242, 104, 251, 14, 7, 234, 224, 202, 185, 126, 252, 217, 108, 167, 102, 78, 116, 145, 173, 141, 183, 151, 19, 116, 195, 206, 70, 161, 227, 225, 107, 239, 60, 81, 212, 7, 220, 129, 83, 146, 39, 172, 105, 53, 149, 216, 88, 240, 147, 96, 86, 78, 233, 205, 209, 144, 96, 195, 137, 72, 22, 93, 245, 133, 179, 147, 166, 166, 216, 247, 78, 171, 178, 93, 219, 235, 34, 115, 252, 173, 69, 19, 80, 25, 91, 46, 176, 209, 207, 116, 249, 187, 44, 133, 141, 0, 234, 112, 85, 74, 164, 83, 216, 214, 95, 162, 67, 162, 86, 89, 99, 85, 18, 183, 114, 41, 222, 20, 49, 191, 33, 199, 108, 50, 71, 211, 108, 25, 70, 208, 192, 128, 59, 207, 60, 94, 148, 112, 211, 138, 58, 146, 27, 116, 78, 247, 23, 36, 51, 143, 43, 60, 126, 24, 178, 16, 151, 217, 132, 29, 230, 140, 185, 121, 74, 65, 212, 102, 112, 252, 208, 183, 202, 132, 98, 4, 37, 214, 188, 15, 17, 201, 55, 201, 133, 65, 69, 47, 178, 106, 167, 205, 218, 2, 97, 195, 126, 193, 228, 0, 232, 237, 249, 197, 196, 177, 238, 152, 193, 243, 231, 110, 46, 96, 38, 3, 81, 214, 228, 31, 42, 119, 126, 26, 204, 218, 226, 6, 253, 79, 77, 78, 76, 90, 140, 199, 37, 58, 16, 240, 223, 32, 150, 30, 106, 101, 39, 44, 150, 255, 170, 225, 215, 1, 202, 102, 216, 5, 81, 32, 119, 3, 85, 172, 21, 240, 62, 82, 29, 19, 101, 133, 203, 2, 95, 139, 118, 185, 189, 225, 202, 211, 212, 226, 5, 158, 151, 47, 82, 26, 29, 121, 216, 176, 132, 11, 157, 166, 200, 80, 103, 83, 225, 206, 123, 64, 254, 88, 186, 22, 68, 158, 47, 245, 59, 78, 149, 98, 209, 144, 102, 88, 70, 168, 205, 226, 152, 66, 0, 52, 220, 50, 227, 104, 34, 64, 219, 208, 236, 249, 101, 84, 225, 220, 226, 253, 141, 38, 175, 235, 147, 131, 139, 2, 149, 86, 209, 231, 42, 30, 106, 206, 144, 126, 153, 82, 110, 190, 187, 11, 193, 252, 124, 101, 4, 245, 128, 22, 30, 204, 23, 206, 200, 75, 17, 186, 38, 137, 186, 175, 83, 0, 238, 17, 143, 46, 154, 14, 12, 8, 233, 28, 11, 23, 44, 30, 10, 229, 186, 114, 254, 178, 156, 31, 75, 59, 60, 160, 21, 75, 23, 222, 152, 42, 74, 29, 86, 18, 6, 227, 248, 88, 173, 89, 165, 61, 86, 92, 100, 156, 186, 43, 171, 48, 119, 26, 5, 29, 224, 92, 136, 193, 154, 81, 103, 138, 151, 250, 19, 98, 21, 128, 164, 65, 236, 116, 19, 248, 230, 194, 250, 88, 214, 86, 0, 31, 26, 152, 166, 197, 192, 30, 113, 208, 34, 205, 37, 118, 234, 47, 61, 167, 235, 49, 198, 108, 73, 147, 19, 157, 198, 241, 18, 227, 40, 170, 250, 39, 179, 185, 168, 38, 191, 146, 240, 58, 233, 99, 182, 118, 90, 119, 179, 234, 183, 15, 111, 176, 153, 34, 75, 195, 130, 122, 53, 220, 235, 186, 27, 154, 65, 190, 107, 0, 42, 189, 25, 190, 24, 146, 76, 22, 191, 132, 36, 167, 63, 254, 4, 97, 148, 132, 184, 169, 24, 49, 233, 65, 98, 237, 17, 151, 213, 90, 207, 215, 137, 177, 23, 230, 3, 154, 154, 212, 215, 166, 132, 125, 1, 35, 145, 50, 177, 38, 31, 77, 227, 79, 10, 159, 110, 116, 125, 88, 120, 18, 96, 240, 164, 82, 218, 193, 165, 25, 238, 154, 162, 21, 112, 85, 244, 247, 212, 200, 100, 65, 38, 59, 212, 152, 77, 153, 248, 186, 245, 171, 98, 20, 72, 174, 113, 59, 152, 85, 194, 59, 20, 239, 238, 201, 104, 168, 162, 86, 237, 52, 39, 80, 170, 101, 248, 220, 173, 150, 54, 13, 232, 114, 240, 112, 121, 201, 54, 86, 121, 195, 172, 239, 211, 167, 176, 27, 165, 9, 22, 184, 238, 162, 192, 190, 66, 1, 63, 210, 40, 145, 174, 247, 95, 183, 243, 6, 112, 199, 191, 72, 48, 100, 189, 111, 54, 54, 35, 245, 63, 111, 44, 57, 152, 170, 94, 4, 232, 251, 7, 228, 227, 250, 100, 198, 13, 119, 134, 26, 254, 59, 234, 30, 51, 215, 180, 195, 179, 159, 222, 34, 125, 249, 22, 155, 211, 134, 131, 32, 36, 150, 29, 15, 73, 53, 84, 43, 243, 231, 85, 212, 236, 76, 165, 35, 200, 252, 79, 251, 177, 24, 15, 215, 14, 64, 164, 28, 235, 209, 10, 69, 27, 253, 159, 35, 173, 181, 161, 250, 185, 154, 178, 231, 50, 226, 231, 68, 66, 164, 157, 112, 23, 127, 31, 77, 99, 152, 188, 62, 36, 2, 115, 131, 226, 107, 13, 92, 44, 225, 231, 151, 250, 47, 194, 24, 195, 116, 22, 193, 75, 229, 3, 238, 168, 175, 175, 120, 128, 164, 73, 132, 153, 233, 145, 50, 167, 85, 42, 127, 143, 240, 93, 54, 95, 87, 115, 49, 18, 49, 210, 77, 118, 155, 167, 26, 86, 100, 82, 203, 100, 8, 1, 112, 96, 172, 162, 164, 104, 111, 24, 234, 249, 21, 20, 88, 199, 167, 162, 218, 236, 193, 169, 97, 121, 91, 112, 64, 61, 148, 46, 64, 155, 77, 172, 91, 156, 166, 223, 160, 208, 74, 103, 10, 137, 3, 40, 41, 31, 92, 96, 236, 23, 195, 163, 131, 254, 52, 216, 240, 136, 185, 169, 28, 31, 76, 1, 224, 154, 116, 242, 206, 104, 63, 56, 45, 248, 60, 221, 63, 147, 65, 232, 79, 70, 121, 199, 121, 233, 105, 225, 235, 149, 81, 155, 158, 132, 30, 150, 11, 153, 92, 198, 27, 96, 253, 240, 191, 3, 231, 194, 69, 193, 228, 250, 213, 9, 124, 125, 158, 202, 8, 244, 158, 204, 36, 93, 248, 157, 206, 208, 179, 227, 38, 66, 253, 163, 12, 100, 42, 28, 157, 86, 30, 67, 177, 49, 77, 184, 165, 108, 119, 234, 35, 37, 131, 142, 221, 150, 5, 64, 30, 84, 96, 166, 27, 211, 59, 211, 60, 99, 226, 54, 29, 207, 249, 242, 156, 96, 201, 172, 144, 165, 99, 221, 142, 47, 84, 108, 54, 200, 86, 175, 57, 176, 11, 120, 206, 106, 85, 205, 126, 69, 66, 51, 253, 21, 255, 62, 229, 145, 229, 208, 85, 128, 231, 94, 162, 107, 249, 196, 166, 124, 254, 119, 17, 208, 170, 180, 65, 104, 200, 238, 133, 233, 229, 2, 30, 41, 163, 148, 166, 107, 57, 53, 51, 187, 118, 19, 189, 146, 185, 125, 47, 170, 37, 108, 98, 108, 143, 51, 208, 121, 100, 110, 60, 219, 222, 65, 87, 135, 206, 251, 33, 166, 71, 104, 123, 138, 138, 104, 237, 32, 196, 120, 99, 0, 197, 32, 131, 22, 165, 207, 212, 10, 227, 140, 166, 119, 49, 218, 148, 120, 213, 54, 69, 99, 233, 13, 171, 218, 2, 178, 82, 130, 196, 68, 80, 33, 174, 80, 31, 58, 118, 1, 187, 90, 175, 230, 248, 161, 67, 73, 147, 84, 0, 219, 213, 242, 59, 19, 137, 6, 130, 184, 250, 214, 16, 70, 216, 167, 201, 16, 242, 209, 60, 42, 5, 5, 218, 44, 209, 113, 110, 110, 191, 160, 167, 50, 143, 183, 101, 218, 147, 230, 143, 163, 255, 116, 150, 102, 19, 141, 112, 204, 102, 71, 59, 184, 28, 129, 201, 90, 253, 147, 22, 79, 158, 94, 158, 143, 53, 90, 32, 152, 55, 185, 64, 60, 25, 49, 253, 71, 31, 92, 154, 241, 243, 80, 129, 6, 137, 221, 210, 242, 13, 131, 237, 119, 254, 70, 114, 205, 49, 79, 233, 205, 181, 45, 133, 32, 181, 53, 103, 114, 193, 80, 139, 206, 67, 87, 127, 207, 177, 112, 225, 164, 178, 102, 205, 172, 78, 222, 63, 0, 185, 143, 92, 195, 83, 220, 30, 20, 169, 184, 37, 78, 3, 101, 201, 202, 195, 186, 98, 120, 114, 73, 45, 33, 65, 33, 40, 53, 177, 79, 238, 151, 234, 2, 150, 54, 243, 51, 57, 28, 145, 28, 9, 24, 186, 251, 239, 160, 56, 213, 118, 236, 97, 159, 67, 111, 128, 203, 98, 96, 249, 214, 178, 48, 39, 145, 125, 198, 46, 184, 109, 252, 166, 65, 113, 67, 27, 252, 244, 189, 95, 118, 210, 195, 112, 76, 33, 15, 58, 142, 170, 116, 87, 78, 105, 123, 81, 243, 21, 110, 117, 115, 214, 27, 161, 111, 91, 182, 148, 130, 20, 168, 2, 113, 16, 72, 184, 232, 147, 167, 9, 70, 210, 5, 91, 101, 164, 154, 112, 105, 19, 179, 161, 240, 86, 135, 65, 211, 241, 144, 148, 89, 245, 195, 54, 52, 56, 138, 203, 160, 68, 57, 166, 137, 4, 219, 53, 204, 13, 7, 191, 8, 71, 255, 177, 242, 138, 210, 211, 153, 9, 106, 16, 54, 26, 32, 177, 54, 63, 195, 100, 184, 15, 114, 148, 0, 106, 229, 94, 13, 147, 1, 126, 211, 55, 25, 157, 63, 132, 204, 76, 157, 43, 40, 116, 190, 234, 154, 153, 68, 80, 70, 173, 70, 4, 79, 195, 153, 209, 225, 87, 16, 159, 49, 234, 75, 118, 213, 59, 61, 245, 121, 110, 130, 187, 176, 26, 29, 12, 202, 218, 163, 71, 11, 151, 156, 74, 18, 34, 231, 88, 110, 11, 2, 208, 89, 119, 90, 69, 152, 76, 13, 138, 193, 1, 137, 174, 251, 152, 95, 71, 252, 183, 140, 203, 103, 25, 51, 37, 87, 254, 252, 209, 126, 119, 233, 41, 75, 123, 121, 110, 106, 192, 248, 74, 242, 162, 227, 220, 122, 214, 152, 120, 94, 103, 7, 65, 191, 181, 35, 68, 125, 62, 218, 144, 164, 173, 18, 209, 183, 47, 231, 183, 245, 170, 122, 63, 188, 215, 156, 25, 61, 131, 196, 139, 57, 49, 174, 182, 239, 36, 138, 251, 67, 24, 172, 61, 83, 112, 97, 93, 6, 255, 221, 72, 60, 11, 210, 249, 87, 221, 15, 148, 245, 81, 52, 200, 99, 109, 150, 171, 67, 183, 2, 67, 228, 30, 109, 174, 127, 206, 114, 118, 60, 136, 127, 210, 4, 43, 194, 15, 59, 47, 159, 7, 182, 115, 102, 179, 233, 198, 38, 170, 154, 229, 27, 12, 45, 17, 20, 237, 202, 76, 98, 188, 189, 64, 250, 40, 238, 254, 222, 72, 144, 80, 238, 88, 215, 141, 45, 130, 11, 135, 43, 147, 84, 237, 112, 241, 78, 81, 128, 119, 252, 201, 78, 151, 128, 94, 33, 202, 131, 127, 148, 67, 188, 66, 129, 211, 138, 236, 243, 202, 132, 14, 34, 219, 242, 18, 56, 68, 210, 118, 203, 69, 182, 1, 4, 224, 79, 186, 1, 252, 88, 205, 201, 243, 5, 157, 59, 129, 42, 150, 42, 229, 248, 3, 167, 232, 206, 161, 200, 71, 136, 70, 214, 204, 114, 36, 180, 58, 36, 89, 179, 199, 10, 202, 235, 196, 69, 183, 126, 28, 237, 53, 32, 248, 242, 145, 19, 245, 183, 159, 231, 174, 242, 98, 53, 235, 37, 106, 209, 21, 136, 45, 199, 148, 183, 209, 153, 87, 202, 149, 8, 187, 21, 132, 166, 143, 130, 240, 145, 184, 3, 149, 146, 188, 179, 229, 164, 161, 151, 85, 42, 242, 73, 56, 0, 237, 168, 45, 176, 246, 170, 119, 50, 196, 50, 7, 230, 21, 14, 56, 19, 181, 221, 253, 5, 92, 124, 63, 163, 214, 47, 25, 238, 217, 100, 166, 53, 247, 128, 83, 138, 19, 219, 254, 2, 145, 111, 109, 27, 13, 57, 166, 31, 11, 188, 56, 8, 37, 80, 10, 126, 109, 2, 227, 47, 4, 192, 67, 252, 153, 41, 138, 48, 94, 72, 235, 226, 55, 251, 184, 195, 16, 253, 61, 33, 227, 12, 89, 138, 154, 246, 189, 134, 47, 214, 245, 4, 35, 67, 53, 69, 167, 134, 240, 138, 200, 92, 192, 212, 157, 244, 13, 31, 34, 181, 2, 39, 102, 139, 25, 216, 187, 137, 252, 247, 110, 100, 167, 72, 93, 180, 35, 236, 117, 1, 15, 226, 54, 163, 227, 152, 24, 221, 59, 157, 173, 135, 35, 157, 104, 20, 25, 112, 113, 36, 15, 236, 47, 36, 99, 209, 243, 204, 134, 254, 78, 243, 81, 189, 134, 108, 90, 58, 97, 227, 253, 104, 2, 162, 40, 80, 127, 190, 11, 126, 92, 210, 44, 177, 205, 133, 127, 162, 103, 138, 40, 214, 172, 148, 103, 248, 33, 143, 172, 41, 48, 182, 33, 170, 216, 42, 69, 34, 202, 115, 101, 197, 3, 38, 255, 83, 152, 128, 76, 236, 139, 115, 101, 40, 46, 203, 147, 147, 126, 219, 120, 191, 214, 109, 185, 170, 248, 242, 27, 99, 85, 105, 39, 172, 27, 206, 153, 107, 202, 245, 93, 20, 126, 129, 254, 62, 133, 241, 75, 203, 138, 16, 68, 64, 254, 194, 71, 115, 254, 109, 90, 196, 184, 179, 8, 130, 114, 64, 72, 126, 218, 201, 6, 243, 248, 0, 244, 198, 40, 9, 28, 37, 103, 153, 146, 108, 24, 171, 240, 112, 28, 71, 165, 239, 32, 94, 169, 93, 217, 151, 30, 9, 3, 227, 87, 45, 220, 136, 81, 152, 66, 176, 87, 129, 142, 129, 139, 194, 8, 164, 164, 135, 161, 121, 136, 97, 63, 105, 17, 180, 26, 208, 42, 66, 29, 131, 181, 13, 187, 160, 212, 50, 83, 73, 202, 174, 86, 14, 67, 147, 79, 136, 209, 199, 85, 38, 92, 234, 29, 211, 70, 11, 112, 252, 229, 195, 251, 63, 154, 35, 67, 7, 75, 254, 110, 191, 117, 186, 164, 202, 93, 116, 97, 162, 94, 123, 228, 241, 221, 146, 24, 218, 102, 223, 85, 74, 183, 64, 70, 39, 208, 164, 11, 50, 202, 181, 26, 254, 168, 130, 199, 123, 72, 5, 244, 202, 71, 118, 126, 149, 104, 20, 208, 207, 224, 156, 33, 55, 237, 186, 132, 189, 53, 100, 4, 95, 83, 234, 71, 230, 66, 233, 237, 138, 220, 76, 213, 87, 193, 132, 101, 238, 48, 84, 235, 255, 81, 134, 133, 168, 35, 135, 96, 82, 156, 160, 122, 159, 234, 224, 105, 178, 20, 72, 57, 74, 248, 236, 124, 60, 170, 157, 100, 207, 126, 216, 141, 200, 14, 152, 79, 34, 136, 78, 167, 205, 52, 208, 142, 94, 63, 233, 200, 239, 20, 50, 249, 176, 37, 84, 163, 234, 87, 67, 69, 136, 73, 194, 0, 107, 57, 85, 131, 75, 222, 216, 74, 173, 189, 220, 124, 148, 144, 220, 90, 248, 77, 69, 12, 156, 6, 60, 90, 103, 192, 173, 75, 187, 89, 235, 66, 44, 103, 144, 166, 11, 87, 98, 212, 118, 42, 13, 134, 242, 11, 77, 43, 227, 80, 112, 99, 69, 93, 227, 102, 40, 105, 195, 241, 233, 227, 148, 119, 192, 252, 163, 69, 31, 149, 59, 253, 196, 238, 32, 245, 37, 11, 189, 144, 141, 241, 231, 7, 27, 3, 16, 183, 220, 210, 197, 170, 110, 138, 135, 242, 134, 64, 185, 10, 130, 68, 225, 4, 103, 184, 184, 95, 17, 183, 201, 4, 234, 191, 206, 171, 44, 240, 92, 75, 229, 211, 132, 229, 238, 243, 37, 76, 81, 15, 167, 65, 21, 118, 211, 88, 36, 94, 45, 31, 184, 112, 228, 111, 52, 97, 77, 111, 144, 129, 13, 241, 4, 253, 161, 168, 132, 117, 250, 7, 132, 173, 250, 103, 209, 22, 213, 227, 213, 173, 128, 236, 252, 3, 197, 167, 0, 40, 82, 1, 67, 160, 18, 141, 220, 138, 149, 145, 174, 238, 127, 180, 135, 0, 4, 111, 186, 86, 139, 172, 202, 220, 128, 136, 53, 207, 48, 170, 181, 201, 43, 95, 179, 92, 101, 34, 142, 145, 13, 25, 18, 238, 36, 13, 113, 70, 182, 200, 66, 167, 191, 0, 33, 8, 12, 3, 66, 199, 163, 229, 60, 33, 159, 14, 129, 171, 187, 209, 92, 252, 91, 147, 78, 190, 175, 109, 111, 22, 143, 13, 205, 223, 79, 222, 78, 132, 116, 247, 112, 22, 178, 0, 218, 147, 207, 170, 189, 170, 245, 23, 156, 226, 23, 3, 27, 175, 97, 186, 167, 136, 170, 172, 61, 152, 134, 193, 127, 59, 23, 183, 131, 184, 95, 116, 151, 157, 83, 128, 83, 238, 224, 212, 180, 216, 199, 53, 40, 92, 9, 32, 242, 117, 134, 114, 39, 4, 240, 247, 100, 159, 75, 152, 130, 126, 174, 107, 4, 12, 145, 87, 84, 39, 191, 129, 115, 86, 69, 191, 114, 204, 64, 6, 217, 148, 83, 171, 235, 90, 172, 195, 0, 226, 159, 122, 104, 182, 185, 11, 110, 176, 79, 166, 130, 105, 194, 126, 166, 179, 148, 243, 110, 185, 249, 210, 59, 133, 208, 39, 160, 51, 245, 178, 45, 203, 253, 96, 225, 25, 128, 229, 134, 92, 154, 12, 129, 63, 253, 144, 221, 94, 247, 253, 199, 78, 135, 174, 171, 237, 176, 123, 25, 165, 177, 26, 172, 237, 217, 177, 53, 43, 209, 7, 141, 248, 84, 100, 156, 42, 235, 125, 239, 250, 236, 91, 129, 213, 235, 28, 208, 248, 247, 136, 169, 148, 220, 120, 251, 0, 37, 218, 26, 114, 68, 166, 6, 53, 81, 115, 145, 134, 200, 101, 67, 226, 52, 153, 195, 93, 191, 212, 120, 202, 118, 108, 243, 167, 63, 17, 158, 199, 255, 100, 175, 177, 140, 217, 178, 141, 195, 13, 175, 216, 90, 143, 245, 169, 67, 206, 11, 151, 112, 26, 247, 47, 179, 105, 17, 236, 51, 132, 134, 157, 232, 68, 114, 209, 236, 68, 32, 112, 102, 176, 205, 23, 59, 215, 88, 5, 186, 251, 26, 57, 83, 125, 250, 229, 142, 161, 160, 217, 15, 157, 193, 230, 172, 126, 46, 150, 150, 252, 82, 80, 228, 43, 130, 39, 106, 151, 21, 197, 164, 227, 234, 128, 155, 28, 89, 6, 60, 87, 190, 16, 40, 157, 155, 1, 111, 9, 61, 21, 156, 57, 37, 0, 244, 205, 108, 236, 32, 152, 3, 43, 205, 154, 246, 151, 240, 26, 62, 61, 142, 149, 133, 7, 47, 31, 117, 52, 223, 49, 58, 212, 25, 30, 196, 165, 206, 113, 148, 6, 222, 217, 212, 136, 8, 211, 241, 120, 204, 52, 252, 2, 186, 23, 149, 210, 82, 90, 32, 203, 209, 92, 143, 113, 166, 201, 17, 199, 156, 56, 205, 116, 21, 55, 220, 157, 228, 172, 159, 246, 128, 181, 101, 231, 92, 212, 211, 8, 42, 70, 119, 116, 253, 249, 178, 65, 58, 25, 84, 8, 113, 94, 96, 92, 124, 188, 240, 67, 58, 221, 218, 47, 213, 189, 55, 194, 144, 235, 223, 218, 229, 51, 112, 15, 112, 138, 142, 101, 157, 128, 78, 148, 153, 208, 166, 19, 108, 204, 47, 213, 102, 65, 115, 131, 83, 162, 148, 108, 227, 59, 156, 223, 205, 149, 187, 213, 2, 205, 236, 114, 163, 91, 226, 147, 80, 143, 70, 245, 106, 21, 23, 111, 104, 1, 180, 119, 137, 88, 53, 7, 158, 212, 159, 98, 242, 69, 69, 21, 45, 52, 170, 39, 2, 121, 15, 57, 57, 128, 68, 96, 152, 96, 238, 60, 144, 149, 7, 170, 203, 141, 98, 140, 180, 129, 104, 181, 62, 61, 48, 19, 245, 101, 179, 151, 98, 110, 235, 68, 139, 88, 87, 157, 182, 203, 255, 12, 253, 139, 191, 90, 241, 26, 27, 227, 51, 160, 0, 169, 252, 251, 245, 185, 171, 143, 92, 111, 91, 253, 62, 3, 130, 148, 56, 207, 147, 101, 182, 45, 10, 90, 37, 207, 128, 154, 239, 254, 152, 27, 83, 119, 20, 104, 251, 170, 63, 68, 82, 26, 140, 52, 193, 44, 3, 24, 197, 61, 166, 238, 143, 117, 94, 74, 69, 195, 14, 77, 89, 131, 191, 151, 208, 15, 219, 205, 186, 179, 99, 214, 225, 2, 12, 228, 29, 91, 172, 100, 32, 168, 148, 59, 141, 28, 120, 232, 50, 82, 247, 32, 136, 193, 229, 207, 226, 33, 31, 99, 208, 163, 59, 70, 218, 212, 100, 229, 87, 28, 131, 229, 34, 35, 23, 221, 76, 166, 26, 36, 78, 125, 132, 142, 109, 66, 91, 200, 166, 187, 24, 199, 100, 55, 115, 64, 135, 93, 131, 17, 113, 74, 40, 12, 41, 152, 112, 26, 166, 35, 31, 43, 108, 192, 176, 172, 216, 6, 252, 6, 108, 3, 80, 129, 211, 190, 26, 164, 118, 11, 157, 26, 130, 103, 30, 97, 42, 100, 235, 151, 40, 213, 202, 126, 2, 72, 41, 192, 179, 194, 185, 189, 41, 61, 61, 193, 138, 95, 118, 39, 118, 26, 216, 152, 210, 154, 85, 203, 201, 85, 115, 91, 249, 82, 226, 200, 33, 192, 15, 219, 244, 165, 165, 210, 210, 11, 216, 10, 67, 77, 151, 185, 170, 185, 131, 51, 27, 157, 176, 196, 114, 41, 48, 26, 16, 148, 195, 103, 96, 190, 118, 241, 229, 30, 10, 158, 108, 114, 150, 127, 7, 199, 143, 214, 168, 230, 41, 247, 193, 86, 247, 64, 247, 100, 223, 236, 233, 136, 199, 131, 58, 206, 8, 15, 155, 135, 204, 152, 205, 1, 97, 22, 15, 61, 52, 128, 118, 111, 2, 74, 1, 91, 186, 7, 134, 43, 225, 98, 87, 186, 9, 243, 199, 124, 219, 105, 124, 29, 224, 38, 126, 148, 114, 235, 199, 227, 222, 228, 88, 30, 180, 28, 201, 232, 108, 2, 162, 90, 195, 34, 116, 46, 164, 40, 166, 105, 90, 159, 48, 109, 176, 31, 138, 136, 153, 108, 252, 159, 10, 87, 208, 196, 49, 71, 165, 76, 52, 15, 245, 100, 247, 0, 176, 185, 103, 174, 250, 232, 242, 184, 71, 233, 51, 133, 96, 77, 18, 207, 51, 220, 249, 28, 101, 83, 57, 129, 31, 31, 126, 73, 253, 37, 88, 42, 21, 142, 182, 141, 60, 239, 249, 230, 230, 35, 234, 215, 251, 182, 215, 158, 245, 41, 198, 198, 131, 214, 129, 176, 103, 159, 19, 249, 127, 227, 38, 160, 146, 57, 110, 122, 80, 1, 241, 165, 9, 38, 59, 6, 141, 129, 29, 155, 214, 183, 148, 169, 239, 178, 188, 3, 239, 205, 109, 13, 211, 35, 191, 144, 242, 30, 50, 9, 121, 92, 136, 161, 9, 68, 6, 183, 0, 155, 199, 10, 129, 161, 189, 106, 179, 149, 197, 121, 146, 144, 5, 215, 85, 210, 184, 152, 229, 209, 91, 50, 190, 61, 146, 24, 27, 92, 105, 77, 65, 153, 131, 120, 190, 10, 178, 141, 31, 227, 81, 54, 138, 11, 64, 211, 161, 173, 158, 25, 83, 196, 2, 165, 253, 177, 140, 240, 48, 17, 108, 60, 132, 222, 158, 248, 250, 243, 250, 218, 171, 180, 48, 115, 14, 24, 26, 65, 102, 80, 190, 85, 57, 20, 227, 170, 126, 236, 163, 31, 255, 182, 134, 132, 30, 216, 138, 101, 218, 170, 175, 221, 113, 158, 246, 190, 139, 88, 52, 174, 195, 89, 206, 80, 99, 174, 133, 3, 3, 115, 114, 222, 38, 178, 115, 32, 120, 214, 45, 177, 91, 207, 64, 235, 188, 138, 251, 155, 7, 136, 188, 250, 23, 173, 137, 16, 6, 219, 211, 37, 67, 80, 71, 229, 42, 55, 155, 66, 218, 219, 96, 85, 194, 80, 233, 236, 39, 246, 14, 15, 190, 11, 177, 87, 26, 140, 118, 239, 114, 129, 128, 241, 78, 11, 150, 243, 85, 174, 76, 70, 7, 79, 2, 38, 225, 84, 24, 171, 186, 255, 83, 201, 49, 30, 186, 196, 151, 21, 198, 175, 58, 170, 254, 63, 129, 244, 59, 156, 205, 15, 76, 47, 144, 138, 255, 141, 128, 89, 27, 109, 36, 102, 213, 94, 73, 167, 108, 194, 28, 23, 100, 87, 230, 20, 6, 11, 104, 21, 93, 179, 38, 68, 121, 46, 179, 212, 219, 210, 216, 176, 150, 89, 170, 18, 84, 103, 175, 22, 89, 233, 66, 218, 247, 251, 23, 170, 73, 186, 221, 215, 67, 254, 153, 73, 215, 23, 147, 234, 3, 102, 133, 127, 171, 88, 226, 49, 163, 148, 162, 77, 148, 191, 126, 211, 242, 253, 124, 72, 178, 210, 204, 232, 15, 248, 116, 144, 58, 130, 24, 41, 40, 22, 79, 176, 36, 224, 106, 5, 209, 20, 95, 77, 244, 27, 228, 54, 156, 18, 124, 113, 48, 229, 4, 77, 153, 81, 122, 7, 205, 16, 126, 173, 160, 102, 50, 160, 198, 180, 206, 161, 199, 124, 173, 63, 63, 212, 145, 162, 139, 232, 161, 144, 61, 121, 99, 28, 250, 199, 138, 137, 123, 16, 245, 239, 143, 216, 189, 190, 186, 25, 49, 6, 216, 56, 221, 119, 92, 105, 69, 94, 174, 95, 136, 130, 56, 165, 41, 217, 106, 61, 160, 194, 138, 104, 67, 208, 139, 51, 184, 212, 179, 46, 218, 168, 10, 119, 34, 26, 161, 151, 183, 181, 114, 116, 148, 157, 93, 1, 152, 9, 203, 125, 107, 104, 13, 6, 8, 14, 113, 249, 98, 70, 99, 93, 127, 152, 252, 190, 191, 215, 3, 82, 144, 147, 1, 241, 215, 121, 80, 239, 192, 97, 55, 190, 234, 185, 57, 174, 27, 109, 132, 236, 196, 212, 112, 24, 192, 36, 84, 119, 195, 171, 134, 254, 116, 192, 150, 103, 49, 202, 1, 145, 71, 171, 53, 179, 62, 226, 24, 1, 48, 238, 158, 59, 22, 52, 156, 21, 49, 199, 203, 248, 18, 165, 78, 143, 230, 220, 9, 95, 216, 17, 119, 44, 17, 54, 200, 211, 233, 198, 255, 96, 196, 199, 182, 111, 148, 146, 43, 35, 196, 155, 159, 173, 211, 64, 243, 201, 71, 24, 36, 73, 147, 251, 137, 250, 55, 52, 176, 11, 203, 246, 166, 111, 104, 138, 107, 101, 76, 169, 166, 164, 236, 44, 170, 117, 112, 42, 123, 231, 96, 4, 229, 4, 20, 14, 163, 249, 115, 22, 28, 8, 103, 163, 71, 174, 11, 107, 164, 227, 23, 23, 38, 223, 207, 19, 198, 245, 140, 203, 204, 80, 71, 214, 67, 197, 157, 200, 63, 210, 244, 1, 142, 93, 96, 31, 72, 56, 199, 103, 13, 82, 92, 100, 199, 176, 222, 219, 198, 145, 219, 200, 198, 181, 85, 104, 207, 162, 88, 232, 127, 50, 245, 216, 246, 21, 114, 154, 166, 138, 179, 221, 139, 83, 83, 151, 216, 89, 251, 240, 144, 118, 205, 94, 94, 197, 146, 194, 209, 151, 204, 134, 44, 193, 252, 146, 47, 221, 194, 215, 28, 213, 96, 122, 169, 219, 66, 104, 1, 162, 111, 229, 138, 125, 148, 170, 166, 18, 248, 228, 163, 199, 159, 70, 40, 78, 108, 19, 210, 69, 141, 41, 201, 165, 150, 31, 114, 43, 60, 43, 156, 216, 110, 183, 142, 56, 44, 87, 98, 201, 61, 100, 163, 22, 154, 113, 147, 249, 229, 49, 54, 217, 89, 230, 121, 81, 192, 87, 178, 35, 34, 63, 168, 168, 17, 229, 90, 191, 125, 49, 50, 220, 213, 28, 179, 88, 28, 196, 203, 166, 123, 185, 12, 181, 120, 65, 76, 149, 191, 57, 164, 45, 229, 178, 61, 138, 46, 137, 249, 154, 250, 60, 130, 219, 87, 167, 203, 227, 218, 58, 17, 44, 249, 96, 43, 33, 222, 80, 97, 125, 108, 190, 249, 127, 200, 137, 79, 183, 169, 90, 111, 123, 101, 81, 163, 202, 207, 24, 235, 135, 67, 115, 119, 241, 19, 137, 146, 76, 17, 124, 213, 143, 149, 56, 217, 174, 25, 162, 160, 199, 198, 58, 6, 231, 19, 189, 139, 150, 60, 234, 157, 45, 129, 167, 1, 16, 104, 143, 173, 203, 14, 143, 192, 224, 234, 102, 164, 90, 229, 136, 2, 49, 201, 80, 55, 196, 39, 67, 74, 113, 214, 152, 227, 185, 239, 184, 170, 147, 1, 98, 238, 186, 63, 29, 69, 47, 104, 130, 190, 30, 13, 243, 90, 119, 163, 39, 46, 93, 69, 178, 137, 120, 77, 114, 195, 197, 111, 105, 76, 141, 173, 19, 182, 170, 94, 22, 180, 228, 213, 127, 119, 197, 110, 119, 141, 133, 14, 44, 240, 194, 202, 53, 252, 232, 104, 224, 44, 180, 8, 36, 187, 146, 31, 88, 11, 10, 185, 50, 255, 79, 251, 11, 29, 103, 213, 19, 60, 244, 227, 100, 190, 75, 149, 5, 238, 90, 147, 142, 44, 122, 245, 53, 0, 97, 58, 21, 79, 114, 211, 45, 64, 58, 13, 121, 85, 251, 157, 229, 66, 226, 63, 242, 216, 46, 5, 64, 140, 233, 125, 114, 146, 139, 160, 108, 217, 28, 150, 217, 160, 246, 202, 174, 161, 16, 243, 161, 243, 188, 251, 30, 25, 61, 15, 29, 152, 10, 179, 181, 30, 42, 148, 116, 118, 255, 8, 100, 37, 19, 237, 138, 102, 25, 29, 164, 160, 40, 253, 51, 100, 158, 197, 48, 50, 20, 62, 248, 41, 194, 243, 152, 193, 18, 142, 50, 236, 178, 164, 107, 254, 141, 71, 107, 30, 154, 160, 37, 23, 176, 230, 112, 151, 100, 220, 126, 103, 46, 142, 67, 175, 223, 20, 36, 100, 100, 212, 194, 212, 246, 128, 234, 125, 203, 160, 100, 131, 210, 87, 243, 199, 78, 49, 195, 12, 48, 224, 244, 110, 29, 113, 233, 59, 91, 217, 209, 28, 141, 103, 64, 230, 156, 239, 179, 51, 64, 205, 139, 251, 147, 232, 158, 99, 9, 60, 190, 193, 96, 163, 176, 247, 5, 86, 151, 97, 202, 94, 33, 179, 107, 248, 207, 114, 121, 121, 19, 70, 24, 174, 104, 38, 122, 163, 178, 22, 187, 30, 152, 118, 64, 138, 29, 175, 85, 228, 213, 219, 171, 70, 182, 73, 215, 124, 88, 222, 229, 118, 74, 57, 230, 66, 254, 135, 243, 237, 127, 5, 243, 167, 143, 10, 190, 90, 156, 162, 96, 169, 14, 235, 210, 60, 8, 212, 85, 128, 250, 205, 225, 9, 114, 139, 150, 34, 27, 247, 148, 71, 161, 139, 58, 178, 70, 209, 128, 102, 177, 103, 230, 66, 11, 192, 7, 44, 66, 43, 116, 147, 90, 38, 139, 205, 162, 17, 248, 145, 64, 131, 172, 165, 216, 211, 223, 23, 122, 183, 137, 19, 46, 62, 152, 2, 79, 109, 122, 64, 8, 211, 46, 29, 54, 31, 104, 29, 61, 46, 201, 254, 67, 77, 17, 125, 95, 41, 254, 245, 191, 150, 147, 98, 171, 149, 174, 59, 95, 182, 40, 132, 132, 201, 79, 84, 250, 76, 144, 170, 172, 229, 144, 181, 148, 231, 51, 171, 181, 71, 204, 123, 87, 92, 149, 238, 207, 21, 71, 72, 119, 162, 244, 156, 177, 7, 112, 1, 118, 156, 12, 1, 87, 192, 217, 110, 63, 236, 154, 245, 51, 177, 111, 89, 241, 114, 49, 122, 139, 100, 50, 215, 141, 94, 129, 64, 168, 219, 194, 83, 14, 18, 130, 83, 142, 254, 98, 172, 115, 191, 25, 218, 170, 197, 253, 6, 210, 127, 6, 219, 200, 184, 24, 104, 193, 45, 240, 217, 30, 95, 180, 60, 91, 3, 185, 49, 194, 165, 46, 215, 172, 118, 155, 238, 81, 231, 28, 201, 16, 100, 13, 89, 150, 15, 209, 110, 216, 90, 86, 157, 43, 174, 103, 251, 48, 158, 229, 190, 38, 230, 127, 75, 179, 161, 198, 241, 82, 11, 47, 47, 116, 220, 221, 91, 17, 20, 222, 106, 225, 168, 72, 161, 182, 218, 14, 197, 1, 68, 173, 56, 134, 19, 198, 180, 112, 125, 150, 38, 57, 226, 204, 161, 104, 230, 51, 149, 66, 9, 188, 206, 228, 90, 186, 61, 56, 19, 41, 143, 249, 182, 131, 220, 218, 148, 73, 110, 117, 106, 202, 52, 178, 61, 78, 73, 223, 134, 135, 86, 174, 35, 83, 216, 58, 149, 166, 48, 5, 65, 124, 109, 137, 151, 103, 215, 20, 94, 9, 47, 84, 36, 1, 203, 22, 249, 225, 43, 56, 186, 236, 189, 126, 8, 133, 184, 83, 220, 3, 4, 60, 132, 188, 252, 135, 109, 149, 111, 113, 157, 225, 61, 47, 34, 144, 183, 135, 67, 166, 53, 14, 233, 154, 115, 130, 46, 4, 120, 16, 163, 64, 170, 24, 158, 133, 36, 123, 34, 91, 41, 16, 224, 242, 62, 215, 44, 95, 228, 193, 235, 142, 148, 151, 245, 76, 177, 176, 28, 58, 154, 95, 254, 200, 241, 134, 250, 63, 232, 13, 190, 189, 165, 33, 77, 252, 171, 139, 221, 78, 246, 56, 186, 201, 210, 234, 240, 41, 46, 216, 254, 149, 12, 22, 150, 182, 174, 236, 18, 222, 234, 102, 231, 225, 243, 37, 201, 130, 162, 33, 89, 206, 0, 17, 136, 36, 105, 3, 51, 172, 99, 191, 177, 30, 1, 98, 111, 112, 212, 42, 125, 40, 23, 25, 74, 125, 52, 51, 147, 185, 63, 213, 143, 111, 89, 237, 236, 12, 144, 194, 17, 109, 162, 171, 102, 34, 232, 10, 154, 251, 95, 23, 246, 127, 75, 127, 153, 98, 58, 36, 23, 59, 192, 128, 239, 192, 243, 16, 198, 9, 42, 145, 182, 78, 144, 224, 64, 57, 8, 121, 173, 208, 153, 114, 52, 63, 138, 82, 206, 30, 204, 156, 135, 219, 36, 93, 35, 129, 84, 57, 14, 31, 121, 151, 215, 254, 46, 42, 143, 158, 42, 68, 213, 52, 33, 142, 188, 100, 228, 97, 113, 190, 113, 27, 204, 140, 136, 155, 20, 186, 97, 149, 252, 2, 68, 94, 41, 220, 169, 144, 35, 21, 81, 121, 53, 169, 22, 4, 140, 188, 4, 103, 205, 88, 111, 88, 180, 131, 165, 223, 99, 208, 111, 142, 139, 83, 175, 147, 195, 65, 29, 139, 0, 218, 206, 100, 234, 30, 235, 16, 41, 105, 232, 32, 203, 78, 200, 199, 154, 1, 205, 106, 217, 23, 237, 141, 197, 89, 57, 232, 19, 173, 156, 146, 228, 191, 163, 228, 63, 94, 52, 126, 29, 14, 107, 194, 79, 250, 48, 15, 212, 124, 79, 126, 254, 181, 225, 13, 26, 57, 242, 199, 158, 211, 219, 237, 113, 73, 202, 20, 25, 231, 86, 239, 48, 32, 38, 143, 143, 209, 71, 243, 75, 167, 68, 74, 112, 200, 176, 247, 218, 122, 110, 57, 250, 214, 84, 224, 154, 102, 170, 44, 172, 86, 218, 43, 91, 38, 146, 204, 113, 47, 48, 53, 88, 232, 186, 20, 132, 199, 18, 92, 169, 47, 212, 101, 154, 250, 92, 79, 121, 20, 233, 30, 158, 223, 232, 7, 193, 108, 107, 141, 69, 135, 48, 20, 21, 131, 245, 4, 217, 245, 55, 130, 175, 156, 159, 129, 222, 134, 71, 112, 222, 79, 222, 68, 63, 79, 17, 164, 157, 72, 222, 20, 180, 220, 29, 162, 168, 102, 66, 168, 159, 100, 74, 35, 72, 137, 168, 171, 249, 213, 168, 179, 232, 230, 211, 39, 172, 194, 32, 218, 162, 243, 205, 233, 13, 237, 216, 84, 221, 82, 38, 42, 247, 127, 165, 195, 135, 208, 13, 81, 152, 24, 24, 251, 85, 166, 61, 229, 44, 244, 97, 131, 225, 216, 193, 49, 15, 92, 197, 183, 125, 107, 158, 71, 7, 129, 111, 185, 124, 234, 10, 120, 134, 147, 252, 221, 181, 149, 34, 227, 24, 11, 224, 224, 20, 198, 11, 197, 49, 143, 117, 96, 124, 206, 209, 135, 103, 191, 47, 217, 171, 83, 154, 111, 26, 150, 156, 191, 44, 173, 251, 143, 142, 59, 85, 162, 145, 51, 143, 55, 219, 166, 135, 97, 147, 130, 15, 224, 131, 185, 199, 205, 44, 197, 59, 133, 126, 94, 144, 152, 237, 60, 217, 189, 204, 157, 136, 254, 171, 29, 248, 78, 206, 76, 163, 189, 213, 27, 196, 54, 147, 251, 72, 159, 73, 184, 0, 84, 227, 124, 98, 35, 246, 79, 248, 186, 97, 108, 24, 215, 232, 3, 200, 152, 66, 30, 21, 122, 27, 206, 89, 36, 239, 208, 69, 232, 97, 132, 252, 177, 230, 109, 141, 247, 99, 116, 34, 180, 190, 142, 155, 222, 229, 147, 124, 98, 253, 214, 151, 221, 174, 0, 38, 243, 49, 179, 38, 206, 138, 253, 44, 218, 111, 57, 6, 55, 3, 158, 176, 238, 54, 235, 79, 228, 91, 139, 165, 184, 25, 155, 15, 1, 181, 48, 96, 197, 14, 11, 106, 62, 162, 117, 3, 29, 116, 183, 63, 74, 159, 86, 99, 9, 174, 27, 188, 115, 29, 111, 253, 70, 231, 216, 13, 162, 255, 129, 210, 101, 227, 131, 163, 130, 194, 94, 249, 204, 53, 125, 77, 10, 148, 70, 115, 193, 120, 219, 216, 77, 251, 118, 20, 55, 124, 150, 229, 241, 9, 94, 100, 128, 79, 192, 141, 2, 94, 254, 84, 77, 32, 10, 36, 232, 24, 225, 29, 238, 28, 153, 74, 197, 178, 49, 101, 144, 251, 184, 6, 140, 245, 219, 61, 181, 86, 28, 150, 83, 153, 29, 142, 179, 14, 14, 168, 219, 182, 37, 77, 29, 164, 24, 23, 44, 128, 151, 74, 185, 81, 58, 41, 123, 51, 62, 64, 227, 168, 59, 147, 143, 191, 93, 95, 158, 135, 219, 96, 172, 102, 35, 82, 126, 102, 216, 252, 22, 31, 51, 117, 20, 228, 99, 125, 176, 143, 2, 130, 130, 79, 12, 71, 44, 246, 235, 234, 86, 82, 167, 177, 246, 39, 197, 249, 158, 205, 75, 178, 135, 253, 241, 30, 172, 119, 151, 198, 214, 229, 23, 27, 90, 26, 213, 196, 120, 195, 64, 141, 228, 197, 194, 135, 25, 94, 207, 112, 109, 115, 116, 156, 145, 192, 182, 203, 6, 117, 125, 21, 79, 37, 177, 50, 69, 139, 215, 97, 150, 46, 31, 80, 70, 238, 82, 3, 239, 151, 93, 235, 232, 159, 2, 18, 177, 43, 178, 176, 253, 76, 138, 113, 217, 113, 164, 45, 121, 82, 3, 113, 18, 22, 120, 35, 41, 41, 176, 20, 83, 164, 202, 250, 143, 54, 226, 225, 192, 184, 207, 154, 240, 128, 187, 180, 239, 233, 54, 110, 122, 243, 240, 220, 158, 131, 111, 202, 17, 232, 139, 115, 145, 172, 91, 90, 42, 150, 190, 183, 192, 65, 128, 102, 213, 200, 9, 12, 74, 158, 67, 168, 71, 71, 111, 56, 205, 156, 62, 133, 86, 109, 247, 161, 211, 23, 158, 39, 216, 94, 20, 140, 158, 245, 237, 92, 24, 163, 72, 250, 88, 99, 146, 195, 211, 187, 240, 66, 25, 43, 159, 15, 225, 222, 131, 228, 131, 147, 238, 76, 251, 228, 0, 53, 186, 41, 243, 184, 88, 110, 71, 211, 3, 127, 29, 186, 69, 40, 224, 92, 145, 200, 50, 236, 245, 42, 198, 242, 9, 97, 177, 93, 86, 57, 248, 29, 50, 131, 131, 160, 109, 156, 80, 21, 204, 189, 190, 244, 193, 165, 173, 98, 173, 187, 37, 157, 31, 167, 216, 173, 9, 30, 226, 13, 208, 210, 64, 241, 53, 27, 218, 149, 126, 92, 169, 167, 70, 84, 84, 64, 83, 100, 130, 251, 137, 255, 69, 157, 136, 161, 49, 197, 149, 237, 224, 103, 114, 205, 21, 35, 254, 27, 6, 69, 72, 54, 86, 109, 20, 99, 126, 107, 29, 134, 135, 12, 203, 227, 15, 173, 49, 152, 240, 211, 111, 245, 246, 245, 162, 88, 148, 39, 111, 197, 200, 183, 236, 191, 74, 211, 131, 222, 35, 211, 185, 122, 97, 173, 146, 128, 60, 83, 244, 135, 75, 208, 230, 144, 127, 29, 115, 146, 129, 201, 19, 25, 181, 85, 174, 38, 65, 230, 17, 142, 71, 109, 15, 96, 180, 38, 20, 109, 70, 234, 219, 148, 43, 179, 231, 222, 222, 13, 73, 85, 153, 231, 33, 189, 33, 135, 70, 100, 190, 117, 53, 203, 196, 2, 15, 146, 210, 175, 237, 231, 124, 68, 254, 150, 55, 18, 153, 31, 48, 113, 118, 82, 249, 43, 2, 136, 111, 35, 140, 114, 45, 223, 21, 115, 37, 209, 14, 86, 34, 115, 115, 98, 152, 189, 57, 130, 96, 103, 103, 122, 74, 3, 230, 38, 45, 188, 18, 223, 140, 40, 234, 251, 46, 168, 44, 16, 230, 155, 184, 133, 94, 89, 29, 179, 194, 78, 15, 238, 8, 18, 41, 177, 87, 244, 16, 88, 176, 150, 108, 247, 127, 26, 71, 225, 109, 190, 2, 220, 132, 12, 18, 17, 35, 125, 87, 163, 153, 118, 225, 147, 26, 106, 0, 144, 137, 148, 45, 68, 112, 195, 225, 104, 255, 195, 34, 6, 210, 35, 205, 232, 173, 169, 138, 212, 198, 229, 241, 158, 216, 218, 231, 31, 97, 233, 241, 252, 44, 156, 110, 225, 6, 128, 148, 145, 190, 101, 117, 124, 116, 158, 39, 93, 64, 200, 244, 162, 247, 35, 25, 248, 145, 106, 75, 23, 163, 55, 183, 176, 188, 78, 219, 192, 77, 113, 24, 70, 133, 254, 222, 15, 45, 102, 9, 253, 47, 129, 9, 212, 53, 18, 77, 233, 217, 172, 88, 233, 38, 215, 168, 93, 244, 58, 218, 209, 52, 105, 58, 8, 67, 234, 29, 227, 1, 152, 140, 62, 223, 237, 78, 178, 216, 125, 205, 42, 249, 191, 173, 133, 55, 146, 99, 129, 91, 80, 182, 233, 114, 241, 80, 119, 200, 24, 31, 201, 33, 14, 175, 53, 186, 75, 41, 8, 83, 44, 157, 3, 237, 1, 202, 89, 193, 109, 198, 78, 228, 3, 105, 249, 14, 163, 220, 196, 82, 203, 104, 199, 5, 248, 81, 94, 96, 242, 198, 39, 122, 137, 212, 240, 200, 69, 115, 151, 111, 19, 20, 91, 243, 56, 157, 82, 181, 236, 201, 201, 99, 228, 181, 252, 251, 227, 28, 99, 76, 33, 233, 143, 216, 120, 255, 183, 75, 138, 159, 229, 117, 7, 167, 226, 172, 197, 148, 137, 50, 168, 47, 164, 160, 36, 122, 137, 48, 162, 23, 197, 193, 4, 117, 186, 124, 115, 66, 145, 179, 21, 144, 149, 217, 50, 186, 196, 36, 249, 209, 239, 181, 118, 108, 164, 169, 119, 28, 22, 135, 162, 176, 164, 137, 162, 84, 220, 16, 235, 98, 192, 185, 99, 218, 133, 146, 152, 73, 137, 61, 187, 230, 222, 140, 198, 183, 182, 46, 157, 188, 151, 238, 137, 114, 66, 194, 33, 135, 152, 100, 74, 25, 153, 90, 32, 193, 64, 61, 193, 150, 117, 159, 77, 139, 159, 181, 28, 79, 149, 94, 13, 142, 6, 183, 143, 51, 107, 154, 135, 96, 82, 82, 237, 131, 226, 122, 18, 255, 68, 173, 93, 239, 214, 166, 214, 160, 224, 227, 74, 192, 125, 170, 81, 0, 53, 219, 219, 114, 67, 115, 140, 224, 162, 190, 247, 221, 182, 57, 247, 27, 97, 65, 60, 5, 151, 125, 79, 125, 247, 143, 16, 165, 132, 14, 102, 130, 164, 182, 155, 106, 162, 38, 115, 196, 173, 205, 199, 131, 45, 65, 193, 193, 200, 204, 230, 144, 231, 32, 104, 75, 92, 33, 197, 67, 1, 52, 188, 77, 3, 207, 146, 0, 183, 232, 9, 223, 105, 147, 223, 175, 251, 80, 127, 228, 107, 162, 248, 94, 253, 254, 163, 79, 109, 1, 203, 34, 49, 77, 101, 239, 21, 64, 197, 84, 109, 113, 86, 173, 86, 237, 0, 188, 17, 67, 252, 74, 236, 56, 213, 44, 221, 227, 118, 176, 138, 158, 44, 154, 144, 230, 193, 49, 238, 135, 35, 192, 185, 228, 229, 214, 148, 49, 82, 225, 237, 219, 87, 204, 3, 57, 180, 119, 30, 46, 235, 68, 210, 213, 118, 54, 197, 35, 66, 188, 48, 123, 64, 137, 186, 209, 224, 103, 66, 95, 14, 54, 114, 198, 176, 72, 109, 136, 30, 97, 156, 174, 181, 227, 144, 244, 245, 2, 137, 64, 10, 186, 174, 239, 242, 241, 87, 91, 189, 116, 116, 100, 247, 205, 34, 251, 147, 207, 81, 222, 105, 57, 7, 211, 64, 242, 71, 189, 198, 3, 13, 112, 51, 5, 54, 226, 109, 127, 30, 177, 196, 131, 35, 222, 46, 187, 40, 4, 230, 255, 114, 231, 122, 82, 110, 104, 172, 114, 105, 214, 177, 54, 92, 81, 153, 123, 147, 230, 253, 99, 12, 114, 82, 191, 219, 113, 190, 169, 45, 233, 6, 186, 183, 244, 190, 238, 70, 167, 247, 167, 89, 170, 249, 154, 158, 50, 127, 58, 121, 1, 115, 176, 39, 118, 115, 170, 70, 175, 35, 21, 109, 224, 90, 56, 196, 11, 95, 249, 45, 2, 54, 243, 165, 229, 120, 112, 94, 252, 217, 214, 241, 81, 47, 141, 170, 189, 7, 35, 207, 69, 227, 235, 210, 115, 111, 135, 175, 129, 157, 184, 20, 122, 101, 205, 207, 26, 85, 218, 239, 198, 3, 160, 28, 60, 219, 68, 42, 154, 160, 180, 106, 182, 36, 2, 218, 26, 188, 157, 84, 206, 5, 27, 20, 229, 62, 202, 212, 75, 218, 155, 75, 232, 100, 78, 80, 149, 171, 20, 239, 251, 129, 55, 170, 154, 124, 75, 183, 152, 97, 67, 130, 155, 13, 192, 81, 118, 137, 209, 196, 140, 178, 48, 128, 133, 225, 155, 249, 247, 202, 28, 120, 33, 255, 100, 93, 227, 218, 213, 171, 236, 11, 174, 221, 57, 86, 208, 156, 72, 236, 210, 132, 139, 247, 222, 203, 23, 227, 220, 162, 59, 251, 143, 157, 71, 219, 224, 235, 25, 27, 100, 142, 201, 86, 165, 39, 58, 119, 97, 109, 91, 172, 211, 206, 147, 41, 115, 15, 14, 131, 249, 54, 235, 29, 63, 229, 231, 233, 93, 251, 100, 166, 241, 146, 28, 219, 84, 105, 134, 250, 231, 194, 182, 174, 56, 200, 154, 197, 42, 20, 191, 99, 168, 129, 130, 203, 184, 186, 46, 233, 92, 246, 43, 109, 183, 242, 154, 213, 112, 194, 153, 241, 13, 104, 98, 181, 158, 68, 187, 51, 84, 105, 199, 188, 86, 68, 12, 23, 184, 113, 215, 223, 30, 241, 29, 191, 5, 109, 79, 140, 130, 185, 249, 35, 147, 88, 7, 155, 1, 105, 169, 5, 228, 9, 186, 104, 166, 78, 221, 21, 133, 213, 44, 78, 143, 4, 179, 173, 111, 233, 151, 110, 187, 71, 116, 92, 199, 172, 99, 216, 111, 222, 115, 37, 197, 136, 212, 139, 153, 101, 19, 98, 63, 182, 217, 190, 65, 69, 148, 1, 197, 49, 193, 40, 176, 14, 154, 185, 135, 247, 235, 152, 15, 182, 77, 19, 186, 129, 127, 78, 31, 159, 102, 87, 105, 125, 244, 189, 18, 118, 131, 249, 36, 236, 12, 163, 88, 209, 175, 120, 185, 198, 24, 207, 228, 208, 113, 74, 13, 255, 244, 254, 84, 180, 39, 113, 9, 34, 153, 87, 68, 11, 106, 91, 7, 174, 105, 168, 52, 255, 225, 216, 27, 244, 100, 227, 228, 151, 90, 21, 126, 195, 59, 185, 63, 92, 2, 194, 178, 52, 62, 57, 107, 101, 26, 208, 70, 20, 48, 16, 180, 72, 70, 37, 222, 18, 220, 219, 197, 92, 234, 58, 152, 241, 77, 140, 189, 22, 252, 147, 198, 45, 87, 23, 91, 114, 46, 40, 59, 244, 75, 51, 61, 49, 114, 110, 170, 61, 99, 250, 126, 101, 48, 7, 78, 210, 95, 212, 117, 166, 17, 24, 105, 96, 16, 64, 195, 229, 46, 163, 46, 30, 34, 104, 8, 130, 68, 56, 144, 51, 73, 191, 85, 191, 107, 185, 230, 153, 227, 175, 79, 176, 165, 204, 225, 64, 180, 33, 27, 151, 120, 196, 103, 241, 33, 176, 163, 16, 58, 209, 91, 112, 191, 231, 24, 222, 94, 6, 17, 237, 115, 72, 77, 160, 136, 156, 201, 100, 73, 148, 138, 200, 224, 0, 175, 237, 198, 143, 92, 179, 11, 160, 162, 70, 99, 123, 7, 244, 238, 128, 154, 237, 171, 201, 83, 111, 209, 158, 104, 238, 141, 99, 99, 244, 54, 24, 252, 170, 83, 230, 136, 53, 72, 205, 206, 247, 56, 192, 88, 23, 163, 176, 74, 227, 34, 2, 159, 94, 15, 39, 157, 115, 5, 97, 201, 128, 58, 63, 133, 78, 3, 65, 78, 220, 207, 1, 100, 168, 122, 34, 54, 103, 20, 123, 49, 146, 91, 8, 232, 185, 17, 243, 69, 213, 121, 132, 68, 5, 205, 60, 176, 191, 116, 219, 115, 7, 10, 32, 214, 81, 92, 195, 108, 242, 155, 75, 162, 39, 44, 9, 18, 60, 185, 38, 126, 32, 246, 37, 44, 119, 63, 55, 239, 101, 122, 34, 245, 245, 211, 127, 166, 165, 121, 57, 213, 174, 71, 41, 210, 53, 201, 84, 12, 195, 213, 80, 223, 16, 231, 225, 172, 163, 189, 0, 152, 255, 166, 229, 36, 96, 144, 54, 124, 12, 133, 99, 226, 147, 165, 136, 252, 99, 81, 173, 254, 143, 56, 95, 28, 62, 93, 229, 140, 223, 66, 50, 79, 216, 151, 210, 120, 147, 169, 177, 247, 8, 21, 76, 153, 4, 172, 88, 234, 236, 218, 143, 216, 251, 34, 68, 20, 180, 176, 130, 124, 77, 18, 212, 226, 157, 147, 102, 14, 230, 156, 93, 211, 184, 248, 36, 217, 37, 32, 176, 22, 157, 85, 96, 18, 122, 88, 230, 183, 216, 0, 189, 209, 228, 84, 51, 112, 203, 8, 139, 172, 123, 222, 134, 98, 227, 140, 66, 239, 176, 128, 97, 58, 174, 169, 107, 137, 131, 169, 163, 59, 229, 88, 253, 76, 161, 163, 181, 188, 235, 126, 130, 110, 173, 113, 169, 68, 33, 37, 66, 71, 138, 131, 69, 110, 84, 196, 253, 251, 128, 79, 251, 31, 192, 140, 55, 64, 46, 170, 28, 86, 244, 240, 186, 45, 71, 83, 168, 126, 74, 144, 155, 120, 215, 47, 120, 107, 225, 249, 146, 225, 111, 88, 176, 247, 252, 53, 134, 2, 168, 251, 251, 41, 162, 5, 110, 244, 212, 51, 113, 215, 165, 227, 6, 248, 122, 102, 229, 26, 130, 223, 140, 173, 230, 133, 110, 86, 215, 227, 98, 72, 40, 107, 85, 207, 53, 241, 84, 74, 149, 138, 161, 171, 190, 131, 69, 0, 239, 222, 219, 82, 39, 5, 122, 238, 119, 22, 209, 2, 167, 175, 52, 162, 254, 193, 22, 68, 137, 79, 177, 228, 145, 155, 118, 110, 183, 182, 129, 252, 26, 41, 29, 244, 226, 113, 240, 245, 121, 86, 4, 97, 165, 184, 182, 116, 136, 67, 136, 41, 229, 87, 39, 218, 108, 86, 35, 6, 64, 209, 106, 38, 215, 37, 0, 91, 51, 223, 150, 127, 138, 67, 137, 17, 205, 47, 211, 141, 178, 105, 198, 183, 98, 112, 132, 125, 75, 27, 153, 184, 162, 76, 61, 214, 30, 24, 13, 110, 52, 14, 179, 169, 29, 255, 108, 32, 24, 60, 158, 229, 135, 219, 17, 188, 153, 91, 176, 113, 97, 35, 98, 156, 202, 55, 143, 76, 226, 17, 235, 246, 166, 19, 182, 59, 216, 180, 36, 51, 194, 4, 60, 76, 155, 1, 69, 80, 252, 46, 149, 65, 170, 251, 60, 227, 146, 174, 33, 229, 2, 182, 189, 23, 175, 99, 199, 37, 143, 11, 68, 12, 189, 92, 167, 101, 12, 133, 233, 189, 104, 219, 113, 54, 213, 56, 79, 62, 97, 54, 238, 117, 106, 105, 53, 46, 11, 177, 56, 204, 38, 206, 76, 50, 149, 18, 110, 164, 110, 4, 221, 100, 210, 41, 244, 59, 187, 34, 183, 236, 221, 136, 249, 51, 136, 74, 153, 247, 11, 12, 224, 174, 247, 229, 75, 95, 198, 133, 105, 68, 203, 95, 95, 157, 188, 36, 94, 118, 69, 71, 254, 14, 177, 100, 46, 242, 161, 171, 205, 207, 38, 110, 132, 58, 174, 85, 199, 32, 12, 138, 255, 79, 161, 218, 202, 232, 155, 111, 96, 189, 91, 166, 247, 117, 105, 184, 213, 147, 188, 170, 204, 84, 60, 133, 222, 36, 28, 182, 244, 133, 97, 82, 251, 248, 169, 198, 101, 75, 166, 215, 111, 127, 46, 91, 51, 26, 31, 252, 231, 251, 98, 159, 60, 4, 60, 63, 30, 213, 213, 162, 33, 142, 195, 176, 226, 159, 109, 238, 214, 249, 84, 153, 94, 112, 245, 209, 192, 103, 230, 206, 107, 80, 80, 168, 28, 164, 3, 217, 147, 43, 200, 6, 23, 164, 114, 123, 233, 152, 162, 190, 136, 247, 164, 38, 71, 163, 113, 232, 203, 106, 245, 123, 13, 85, 2, 72, 35, 48, 133, 253, 112, 69, 238, 32, 193, 90, 239, 197, 12, 104, 157, 11, 117, 192, 230, 159, 191, 125, 47, 156, 167, 101, 30, 205, 103, 170, 103, 75, 123, 204, 63, 158, 32, 36, 145, 39, 151, 182, 228, 45, 209, 23, 232, 97, 189, 82, 43, 199, 242, 183, 15, 81, 233, 106, 133, 183, 127, 228, 113, 88, 249, 255, 98, 238, 46, 99, 251, 22, 14, 31, 210, 218, 135, 97, 237, 159, 134, 73, 92, 169, 140, 88, 50, 175, 54, 187, 4, 112, 21, 231, 96, 40, 99, 229, 183, 107, 46, 232, 100, 149, 16, 10, 113, 162, 188, 180, 199, 95, 134, 112, 172, 157, 105, 8, 8, 45, 135, 56, 107, 54, 239, 159, 66, 98, 174, 67, 126, 251, 110, 176, 90, 37, 192, 22, 132, 65, 217, 222, 238, 239, 163, 239, 3, 54, 222, 132, 3, 218, 157, 21, 144, 63, 227, 93, 174, 237, 137, 150, 38, 252, 183, 7, 209, 112, 75, 204, 50, 190, 12, 33, 233, 125, 164, 66, 7, 237, 222, 234, 252, 213, 74, 171, 244, 196, 135, 55, 41, 25, 251, 99, 240, 197, 111, 70, 113, 129, 57, 43, 197, 59, 24, 149, 43, 245, 238, 98, 134, 226, 184, 139, 180, 127, 182, 155, 129, 23, 19, 191, 213, 116, 19, 79, 230, 84, 206, 224, 136, 77, 17, 195, 251, 79, 36, 13, 18, 169, 76, 80, 81, 166, 197, 170, 94, 108, 30, 58, 234, 25, 4, 73, 222, 3, 45, 87, 223, 117, 117, 242, 53, 245, 202, 104, 21, 99, 181, 16, 17, 73, 38, 160, 68, 4, 186, 25, 210, 77, 214, 226, 32, 250, 26, 78, 209, 106, 96, 177, 54, 248, 95, 114, 145, 135, 162, 151, 54, 34, 202, 225, 238, 71, 7, 131, 246, 14, 221, 22, 43, 78, 176, 185, 135, 219, 97, 100, 177, 112, 48, 7, 238, 93, 23, 247, 182, 194, 150, 236, 237, 127, 134, 162, 30, 149, 166, 142, 201, 51, 81, 44, 239, 52, 36, 58, 245, 156, 154, 173, 95, 33, 133, 83, 44, 127, 106, 28, 252, 130, 245, 18, 7, 175, 147, 252, 252, 174, 56, 59, 29, 53, 120, 37, 139, 186, 213, 6, 90, 4, 206, 103, 118, 32, 53, 250, 84, 73, 17, 76, 28, 156, 166, 96, 146, 157, 137, 33, 56, 165, 184, 245, 254, 105, 243, 38, 74, 73, 114, 147, 133, 100, 46, 151, 203, 10, 255, 235, 154, 11, 175, 47, 169, 233, 89, 204, 73, 2, 73, 37, 244, 250, 43, 23, 57, 244, 7, 236, 182, 58, 51, 163, 244, 12, 200, 91, 128, 218, 196, 188, 160, 128, 214, 171, 253, 12, 194, 155, 6, 24, 218, 96, 211, 166, 37, 134, 125, 219, 237, 41, 112, 87, 21, 51, 1, 9, 143, 165, 213, 131, 43, 195, 147, 218, 87, 191, 107, 68, 116, 195, 238, 76, 222, 124, 216, 60, 237, 55, 225, 102, 47, 111, 243, 153, 154, 122, 101, 87, 197, 188, 160, 237, 76, 45, 41, 85, 64, 30, 99, 252, 209, 195, 113, 210, 150, 150, 64, 167, 205, 8, 75, 130, 181, 66, 32, 155, 221, 98, 218, 126, 97, 54, 80, 13, 213, 6, 26, 142, 109, 23, 4, 57, 144, 148, 23, 83, 0, 237, 136, 133, 133, 125, 102, 11, 68, 211, 74, 2, 101, 155, 13, 144, 27, 116, 186, 85, 191, 188, 42, 251, 184, 10, 217, 147, 230, 132, 37, 246, 139, 251, 232, 91, 225, 180, 29, 89, 201, 20, 155, 166, 250, 54, 211, 226, 6, 109, 39, 58, 180, 221, 159, 148, 72, 56, 161, 100, 23, 248, 23, 61, 201, 235, 44, 157, 192, 155, 176, 199, 251, 248, 45, 80, 157, 27, 135, 169, 68, 230, 67, 202, 3, 223, 50, 197, 118, 191, 197, 69, 158, 190, 146, 225, 139, 158, 100, 47, 119, 204, 205, 54, 149, 105, 169, 163, 174, 52, 92, 120, 212, 170, 175, 213, 113, 92, 235, 25, 213, 28, 87, 242, 91, 84, 252, 203, 231, 2, 0, 88, 184, 159, 146, 216, 195, 109, 214, 151, 181, 54, 175, 172, 220, 47, 153, 95, 139, 234, 220, 144, 40, 153, 41, 217, 7, 121, 113, 126, 212, 85, 233, 144, 180, 108, 5, 73, 210, 163, 163, 206, 100, 226, 117, 189, 76, 232, 246, 254, 187, 56, 203, 111, 94, 202, 229, 63, 87, 24, 203, 30, 72, 119, 157, 223, 18, 163, 139, 156, 64, 77, 75, 39, 161, 229, 83, 14, 24, 114, 197, 180, 213, 7, 222, 33, 190, 47, 67, 111, 32, 177, 207, 18, 3, 151, 122, 205, 52, 188, 101, 13, 132, 214, 193, 217, 133, 23, 223, 211, 69, 156, 146, 91, 162, 187, 191, 107, 8, 211, 107, 194, 71, 232, 142, 74, 192, 13, 84, 118, 16, 24, 71, 176, 21, 114, 102, 100, 93, 85, 106, 146, 30, 241, 157, 193, 118, 143, 227, 103, 213, 127, 137, 199, 101, 9, 14, 126, 175, 12, 166, 59, 61, 57, 201, 93, 214, 235, 4, 116, 191, 170, 250, 162, 239, 29, 91, 183, 158, 182, 19, 187, 48, 59, 25, 20, 173, 58, 215, 16, 181, 3, 62, 114, 245, 105, 29, 115, 79, 158, 225, 205, 117, 207, 117, 151, 23, 200, 53, 183, 78, 121, 18, 0, 183, 230, 249, 241, 227, 254, 229, 7, 175, 39, 119, 3, 69, 251, 189, 138, 197, 15, 225, 130, 195, 210, 163, 16, 125, 121, 171, 110, 62, 17, 97, 253, 119, 160, 120, 204, 140, 60, 211, 117, 127, 64, 109, 178, 202, 247, 234, 234, 14, 104, 42, 44, 251, 211, 67, 50, 221, 254, 187, 51, 62, 41, 143, 255, 188, 198, 28, 146, 199, 47, 44, 233, 156, 113, 248, 216, 170, 185, 27, 83, 146, 20, 160, 238, 201, 208, 49, 191, 0, 207, 103, 198, 97, 14, 218, 178, 32, 213, 180, 214, 71, 150, 173, 148, 85, 2, 110, 20, 14, 22, 172, 144, 74, 91, 227, 44, 82, 61, 134, 92, 176, 78, 222, 41, 87, 144, 233, 135, 57, 32, 211, 40, 247, 209, 170, 30, 47, 63, 49, 24, 35, 117, 78, 88, 253, 29, 50, 19, 63, 220, 205, 42, 211, 204, 117, 29, 150, 207, 177, 229, 173, 224, 111, 96, 103, 102, 229, 135, 8, 84, 139, 138, 201, 142, 124, 104, 61, 148, 116, 115, 194, 148, 162, 178, 193, 156, 33, 206, 207, 62, 238, 78, 174, 148, 219, 253, 49, 115, 40, 92, 216, 97, 123, 14, 129, 125, 222, 83, 111, 76, 127, 72, 94, 20, 38, 2, 152, 136, 103, 141, 209, 191, 210, 98, 162, 28, 172, 57, 113, 221, 67, 147, 191, 146, 190, 140, 115, 230, 30, 238, 100, 44, 4, 151, 228, 78, 214, 133, 120, 95, 73, 64, 244, 255, 159, 216, 135, 45, 7, 191, 225, 143, 228, 114, 244, 131, 172, 139, 235, 52, 179, 245, 14, 161, 21, 47, 144, 89, 35, 179, 37, 151, 98, 212, 65, 8, 68, 64, 186, 35, 178, 15, 208, 223, 163, 160, 165, 241, 45, 58, 77, 116, 158, 44, 14, 250, 94, 34, 142, 72, 192, 66, 124, 59, 138, 51, 36, 205, 169, 182, 241, 220, 215, 49, 84, 0, 139, 227, 224, 43, 194, 223, 215, 5, 205, 238, 178, 211, 215, 23, 211, 153, 250, 103, 221, 97, 96, 187, 99, 51, 57, 116, 68, 187, 247, 17, 202, 193, 197, 55, 94, 50, 97, 68, 187, 230, 236, 13, 38, 54, 73, 245, 144, 41, 147, 102, 103, 38, 125, 190, 201, 174, 111, 203, 227, 142, 188, 177, 253, 128, 165, 125, 11, 129, 242, 239, 238, 219, 12, 26, 41, 152, 219, 203, 216, 103, 253, 216, 94, 230, 18, 244, 157, 146, 30, 185, 17, 189, 245, 64, 159, 27, 50, 166, 142, 110, 175, 175, 47, 187, 54, 127, 27, 149, 20, 185, 193, 8, 223, 195, 167, 5, 87, 179, 18, 75, 187, 116, 54, 172, 182, 254, 129, 11, 253, 117, 3, 131, 14, 115, 17, 175, 7, 4, 109, 162, 111, 245, 204, 182, 147, 43, 104, 187, 169, 19, 71, 102, 55, 242, 119, 150, 42, 102, 244, 98, 65, 118, 128, 110, 200, 64, 42, 175, 79, 16, 184, 251, 49, 142, 204, 255, 147, 141, 163, 247, 181, 111, 25, 86, 166, 195, 62, 227, 48, 115, 153, 122, 151, 95, 242, 22, 243, 105, 163, 182, 96, 75, 97, 43, 215, 56, 175, 140, 228, 116, 176, 253, 193, 45, 119, 16, 192, 55, 221, 233, 187, 78, 127, 20, 143, 151, 220, 101, 9, 214, 252, 9, 89, 33, 254, 159, 169, 117, 37, 86, 130, 201, 129, 211, 9, 218, 151, 123, 3, 52, 159, 229, 60, 147, 22, 115, 179, 45, 240, 97, 17, 95, 33, 137, 165, 89, 9, 177, 174, 209, 238, 59, 116, 100, 163, 189, 120, 185, 243, 107, 150, 59, 199, 4, 107, 123, 10, 156, 169, 102, 21, 90, 86, 180, 125, 243, 186, 13, 22, 39, 170, 61, 182, 133, 164, 156, 97, 8, 246, 184, 107, 164, 151, 163, 184, 51, 248, 182, 218, 32, 17, 121, 145, 112, 54, 222, 231, 239, 63, 66, 98, 210, 100, 203, 167, 113, 30, 134, 229, 85, 15, 122, 85, 207, 36, 53, 155, 190, 5, 116, 204, 46, 141, 115, 44, 240, 209, 125, 2, 149, 157, 215, 189, 181, 68, 230, 237, 35, 58, 36, 74, 225, 142, 132, 146, 241, 242, 125, 26, 71, 1, 38, 57, 23, 124, 213, 123, 216, 112, 73, 72, 74, 82, 90, 28, 193, 167, 75, 137, 114, 253, 121, 212, 0, 119, 37, 211, 195, 161, 115, 154, 230, 121, 180, 14, 242, 171, 111, 30, 206, 165, 74, 44, 147, 44, 206, 224, 156, 200, 135, 241, 86, 77, 22, 220, 188, 86, 114, 22, 237, 47, 181, 86, 175, 157, 84, 164, 251, 129, 21, 232, 231, 123, 63, 17, 118, 32, 211, 153, 146, 237, 189, 169, 34, 12, 249, 190, 249, 123, 55, 185, 148, 134, 28, 1, 164, 31, 93, 130, 80, 185, 81, 106, 15, 212, 167, 144, 163, 155, 195, 47, 78, 25, 206, 7, 174, 66, 197, 192, 112, 238, 253, 65, 251, 168, 71, 131, 239, 91, 7, 178, 95, 53, 201, 7, 250, 128, 127, 107, 156, 221, 116, 210, 205, 19, 46, 223, 99, 46, 171, 24, 136, 93, 183, 172, 171, 60, 27, 88, 78, 209, 37, 250, 242, 188, 245, 112, 73, 179, 252, 158, 49, 10, 74, 139, 18, 245, 110, 104, 154, 174, 93, 10, 68, 15, 173, 53, 3, 133, 24, 154, 246, 138, 8, 126, 153, 199, 138, 80, 131, 136, 134, 241, 216, 106, 26, 136, 221, 125, 116, 142, 57, 91, 126, 106, 39, 130, 101, 182, 141, 224, 34, 190, 31, 204, 94, 212, 145, 189, 83, 93, 221, 211, 195, 127, 94, 254, 20, 60, 98, 98, 168, 147, 63, 3, 56, 226, 233, 112, 166, 180, 227, 248, 17, 177, 172, 6, 241, 240, 52, 158, 109, 25, 124, 55, 134, 99, 254, 228, 120, 201, 62, 60, 186, 164, 24, 184, 116, 44, 138, 54, 216, 153, 24, 101, 224, 224, 58, 156, 56, 159, 135, 91, 97, 151, 90, 154, 100, 144, 171, 2, 251, 53, 133, 44, 149, 7, 228, 88, 44, 62, 82, 185, 99, 135, 80, 218, 193, 32, 102, 153, 204, 48, 49, 138, 249, 243, 155, 167, 90, 154, 33, 192, 106, 63, 252, 105, 187, 91, 86, 109, 156, 51, 98, 0, 251, 211, 79, 179, 54, 136, 236, 30, 3, 57, 135, 2, 4, 253, 136, 234, 35, 237, 121, 29, 93, 194, 43, 3, 59, 110, 71, 58, 223, 102, 176, 1, 244, 97, 159, 121, 179, 66, 156, 102, 230, 251, 184, 92, 60, 12, 225, 140, 65, 174, 102, 167, 70, 102, 133, 240, 195, 83, 200, 196, 238, 245, 241, 139, 221, 127, 94, 36, 158, 176, 126, 83, 73, 46, 5, 7, 76, 19, 47, 86, 39, 104, 161, 226, 169, 145, 59, 167, 24, 3, 2, 199, 68, 179, 65, 236, 16, 182, 116, 64, 160, 125, 143, 195, 249, 198, 108, 129, 109, 57, 25, 206, 86, 102, 243, 26, 43, 226, 12, 201, 154, 252, 92, 22, 229, 205, 45, 107, 200, 54, 28, 255, 80, 4, 166, 3, 69, 179, 189, 89, 152, 244, 145, 224, 55, 52, 121, 87, 164, 92, 208, 104, 179, 224, 3, 186, 178, 121, 144, 209, 115, 157, 96, 220, 13, 198, 236, 65, 187, 150, 251, 79, 166, 254, 51, 212, 160, 42, 64, 110, 130, 204, 36, 69, 167, 241, 66, 32, 41, 32, 73, 61, 21, 250, 235, 99, 157, 48, 85, 217, 21, 126, 235, 145, 113, 45, 56, 206, 53, 14, 20, 106, 38, 71, 71, 108, 78, 249, 245, 159, 244, 162, 65, 165, 224, 111, 16, 26, 182, 229, 137, 57, 99, 242, 51, 138, 85, 236, 11, 66, 187, 254, 146, 218, 1, 96, 190, 160, 88, 183, 117, 2, 226, 139, 175, 21, 94, 23, 38, 57, 73, 171, 255, 91, 218, 232, 113, 99, 139, 26, 31, 174, 76, 128, 92, 183, 28, 96, 18, 24, 4, 193, 126, 84, 193, 185, 30, 189, 67, 209, 215, 43, 131, 123, 8, 225, 221, 117, 69, 61, 82, 247, 35, 87, 186, 89, 36, 0, 148, 144, 29, 190, 86, 203, 248, 249, 150, 85, 21, 43, 82, 167, 245, 30, 77, 0, 168, 39, 250, 21, 76, 26, 90, 130, 72, 95, 112, 34, 124, 74, 55, 22, 54, 69, 207, 92, 142, 33, 58, 17, 85, 130, 30, 183, 214, 204, 202, 87, 28, 10, 16, 1, 218, 240, 106, 46, 246, 114, 189, 24, 170, 250, 139, 144, 133, 196, 18, 216, 72, 63, 156, 121, 132, 147, 130, 111, 44, 108, 150, 227, 242, 56, 160, 86, 13, 135, 177, 23, 213, 33, 113, 67, 82, 67, 72, 174, 216, 107, 134, 118, 169, 113, 88, 208, 82, 221, 71, 101, 102, 32, 127, 78, 114, 9, 222, 58, 5, 209, 132, 163, 243, 125, 243, 58, 229, 36, 185, 142, 175, 112, 247, 52, 120, 11, 22, 16, 4, 90, 166, 117, 183, 128, 70, 122, 94, 115, 227, 36, 182, 0, 231, 3, 145, 163, 58, 152, 98, 191, 62, 107, 136, 250, 216, 39, 30, 187, 138, 43, 202, 247, 75, 107, 121, 87, 46, 242, 22, 66, 77, 201, 130, 143, 167, 64, 203, 219, 210, 63, 190, 145, 215, 201, 23, 124, 99, 51, 193, 14, 165, 118, 26, 68, 96, 34, 59, 2, 166, 179, 202, 128, 202, 69, 167, 2, 14, 180, 250, 141, 4, 219, 215, 156, 206, 249, 251, 236, 140, 230, 122, 42, 12, 163, 45, 245, 216, 112, 233, 192, 128, 0, 125, 51, 133, 235, 63, 119, 46, 94, 16, 252, 217, 11, 110, 242, 239, 163, 32, 159, 249, 19, 242, 248, 67, 26, 79, 31, 63, 16, 213, 209, 56, 170, 228, 160, 106, 179, 146, 224, 143, 23, 229, 160, 202, 204, 228, 200, 57, 156, 123, 12, 175, 229, 97, 137, 137, 130, 104, 49, 58, 62, 66, 175, 113, 217, 164, 193, 196, 165, 173, 240, 123, 179, 147, 121, 165, 121, 129, 74, 183, 124, 160, 89, 246, 229, 125, 163, 160, 103, 225, 69, 35, 182, 86, 37, 105, 32, 9, 28, 176, 4, 132, 151, 104, 77, 182, 42, 231, 156, 215, 214, 134, 39, 37, 94, 203, 145, 32, 251, 72, 243, 75, 161, 133, 207, 208, 221, 79, 192, 25, 21, 239, 156, 111, 217, 183, 238, 65, 167, 83, 127, 77, 83, 17, 77, 244, 179, 85, 93, 217, 29, 224, 202, 158, 58, 228, 158, 241, 159, 32, 183, 61, 112, 57, 13, 167, 23, 36, 167, 114, 132, 84, 172, 247, 72, 106, 115, 51, 170, 94, 151, 28, 157, 214, 204, 13, 1, 7, 93, 237, 56, 156, 93, 183, 218, 206, 255, 90, 128, 72, 158, 15, 198, 219, 219, 242, 95, 206, 11, 175, 34, 247, 217, 167, 204, 169, 132, 199, 241, 233, 73, 222, 192, 113, 225, 6, 164, 39, 187, 188, 51, 209, 17, 80, 90, 206, 0, 226, 19, 119, 165, 95, 109, 8, 161, 101, 77, 192, 94, 154, 220, 108, 63, 53, 18, 217, 236, 193, 106, 243, 112, 69, 181, 105, 93, 99, 108, 123, 133, 167, 51, 99, 41, 149, 205, 255, 253, 214, 26, 211, 114, 107, 225, 205, 23, 197, 220, 28, 27, 183, 170, 88, 103, 119, 87, 21, 15, 37, 245, 163, 231, 65, 171, 97, 91, 42, 120, 89, 30, 138, 24, 201, 27, 78, 98, 10, 40, 85, 17, 29, 173, 28, 46, 217, 118, 160, 173, 91, 25, 193, 56, 150, 9, 130, 12, 28, 77, 181, 245, 121, 252, 123, 172, 205, 76, 129, 113, 141, 9, 47, 24, 182, 169, 228, 49, 60, 19, 194, 36, 142, 51, 4, 56, 92, 120, 190, 177, 16, 187, 240, 16, 33, 227, 170, 102, 86, 95, 215, 88, 135, 6, 174, 12, 29, 211, 155, 91, 202, 6, 68, 62, 29, 9, 25, 14, 83, 128, 184, 41, 174, 5, 224, 27, 80, 180, 187, 78, 93, 114, 8, 56, 43, 9, 127, 75, 109, 47, 65, 163, 128, 130, 128, 79, 211, 4, 6, 99, 192, 41, 73, 231, 80, 123, 86, 171, 188, 70, 15, 101, 156, 224, 203, 229, 141, 92, 172, 201, 130, 43, 174, 241, 193, 219, 115, 87, 190, 49, 55, 16, 38, 32, 29, 41, 27, 17, 218, 246, 9, 4, 176, 228, 209, 121, 162, 117, 242, 162, 103, 175, 119, 50, 1, 226, 100, 134, 14, 47, 30, 83, 204, 60, 136, 104, 54, 167, 193, 33, 59, 165, 86, 125, 1, 47, 136, 197, 20, 159, 238, 14, 105, 189, 97, 3, 21, 157, 144, 247, 2, 26, 161, 28, 7, 153, 140, 16, 51, 25, 113, 60, 187, 193, 47, 116, 67, 13, 29, 251, 3, 165, 113, 213, 187, 57, 19, 161, 177, 169, 192, 204, 119, 239, 232, 209, 10, 242, 27, 1, 1, 198, 44, 111, 89, 187, 135, 172, 231, 149, 3, 179, 54, 65, 77, 125, 120, 222, 157, 158, 61, 44, 42, 148, 111, 197, 185, 111, 240, 35, 134, 124, 168, 11, 58, 192, 24, 250, 51, 24, 91, 228, 206, 12, 32, 179, 160, 254, 57, 221, 124, 153, 124, 153, 147, 50, 60, 213, 123, 202, 139, 229, 32, 57, 19, 88, 182, 222, 39, 149, 76, 206, 154, 155, 44, 34, 167, 130, 111, 180, 32, 113, 218, 247, 16, 36, 15, 86, 180, 236, 204, 73, 123, 165, 19, 28, 123, 153, 156, 228, 51, 81, 138, 62, 49, 155, 11, 95, 66, 185, 18, 158, 240, 234, 5, 134, 131, 54, 225, 244, 203, 73, 11, 150, 69, 236, 244, 160, 10, 9, 88, 225, 68, 22, 199, 168, 73, 137, 181, 23, 231, 170, 217, 140, 252, 107, 155, 6, 240, 99, 144, 109, 224, 162, 37, 161, 75, 173, 169, 144, 9, 220, 247, 25, 73, 16, 142, 179, 245, 127, 150, 181, 169, 84, 83, 72, 52, 41, 65, 159, 153, 139, 180, 124, 201, 49, 128, 177, 176, 59, 207, 93, 214, 120, 26, 138, 157, 206, 171, 63, 226, 28, 91, 244, 39, 20, 253, 179, 40, 77, 254, 220, 136, 143, 138, 73, 142, 0, 189, 253, 211, 98, 49, 67, 71, 27, 244, 105, 15, 127, 28, 166, 238, 95, 93, 147, 30, 185, 207, 131, 1, 52, 50, 199, 15, 140, 173, 14, 93, 187, 108, 22, 30, 125, 83, 223, 73, 221, 28, 113, 21, 243, 74, 205, 198, 144, 248, 240, 5, 0, 157, 75, 85, 171, 154, 193, 152, 17, 71, 130, 94, 124, 177, 241, 26, 188, 193, 131, 90, 15, 229, 57, 53, 17, 203, 121, 34, 147, 76, 44, 189, 162, 2, 96, 189, 195, 200, 214, 205, 48, 105, 16, 221, 220, 39, 118, 131, 77, 6, 138, 226, 181, 213, 75, 66, 29, 245, 63, 247, 170, 96, 44, 18, 156, 130, 75, 66, 135, 212, 80, 153, 212, 58, 137, 129, 228, 26, 252, 144, 138, 198, 208, 74, 195, 5, 21, 54, 67, 192, 84, 111, 35, 146, 232, 209, 128, 213, 83, 177, 228, 62, 168, 2, 47, 102, 189, 224, 157, 205, 2, 227, 156, 97, 36, 49, 92, 114, 171, 33, 64, 141, 38, 199, 144, 206, 102, 86, 104, 117, 214, 140, 166, 215, 114, 83, 11, 4, 143, 126, 78, 76, 105, 225, 86, 221, 114, 0, 116, 83, 224, 139, 204, 21, 115, 153, 138, 246, 99, 192, 4, 128, 197, 137, 22, 19, 73, 246, 68, 140, 187, 91, 208, 30, 230, 254, 63, 189, 61, 82, 10, 105, 1, 113, 140, 53, 167, 18, 122, 87, 223, 140, 145, 78, 14, 3, 221, 192, 73, 236, 8, 97, 80, 206, 244, 174, 73, 216, 68, 92, 81, 190, 32, 211, 37, 126, 158, 129, 107, 128, 169, 39, 134, 208, 197, 64, 103, 181, 119, 101, 4, 245, 174, 50, 154, 198, 209, 250, 29, 126, 247, 195, 144, 215, 116, 161, 97, 57, 223, 66, 91, 106, 67, 102, 63, 156, 184, 172, 216, 228, 38, 64, 12, 12, 32, 2, 37, 104, 245, 211, 80, 141, 27, 87, 123, 121, 238, 253, 223, 144, 106, 25, 10, 201, 167, 221, 192, 170, 163, 191, 167, 244, 189, 204, 112, 193, 203, 17, 76, 83, 148, 164, 242, 250, 129, 18, 200, 68, 242, 18, 225, 144, 61, 201, 235, 222, 91, 72, 199, 255, 101, 29, 14, 173, 34, 212, 155, 99, 148, 187, 18, 37, 140, 21, 217, 200, 231, 23, 26, 5, 160, 7, 78, 94, 40, 57, 111, 27, 19, 141, 199, 119, 0, 183, 103, 31, 213, 76, 102, 75, 183, 174, 59, 80, 202, 208, 106, 250, 248, 1, 126, 125, 196, 181, 111, 149, 90, 22, 103, 170, 206, 181, 239, 195, 70, 56, 38, 117, 77, 90, 63, 93, 46, 199, 124, 127, 146, 55, 44, 100, 177, 45, 71, 92, 1, 94, 166, 66, 233, 149, 225, 193, 176, 118, 245, 41, 185, 163, 129, 178, 223, 186, 70, 54, 142, 129, 213, 178, 226, 187, 205, 0, 103, 158, 142, 255, 178, 110, 171, 56, 13, 23, 234, 102, 193, 61, 138, 110, 76, 239, 242, 139, 197, 57, 116, 141, 213, 61, 165, 98, 148, 14, 151, 243, 10, 83, 65, 9, 196, 80, 51, 9, 131, 104, 95, 77, 142, 115, 217, 122, 48, 75, 10, 105, 230, 147, 68, 147, 240, 6, 61, 131, 189, 78, 171, 127, 168, 12, 68, 80, 1, 222, 232, 201, 3, 18, 31, 190, 80, 52, 43, 39, 187, 235, 217, 175, 106, 25, 235, 63, 205, 106, 15, 93, 82, 213, 119, 175, 153, 35, 242, 39, 2, 30, 146, 157, 130, 165, 151, 163, 38, 204, 89, 19, 80, 37, 251, 104, 153, 251, 138, 48, 30, 202, 60, 134, 66, 193, 192, 15, 17, 84, 118, 165, 170, 15, 99, 167, 212, 227, 93, 219, 217, 139, 93, 136, 4, 149, 212, 78, 159, 191, 91, 58, 139, 88, 114, 224, 109, 228, 195, 251, 2, 1, 200, 102, 178, 199, 49, 7, 253, 66, 99, 77, 122, 249, 100, 184, 119, 221, 12, 59, 249, 241, 225, 72, 1, 196, 233, 247, 87, 58, 10, 58, 222, 91, 203, 158, 184, 188, 163, 92, 130, 43, 115, 237, 133, 56, 240, 69, 221, 112, 242, 64, 38, 33, 109, 91, 186, 251, 52, 66, 32, 39, 173, 47, 29, 170, 47, 119, 158, 81, 30, 18, 196, 6, 207, 212, 254, 73, 135, 94, 217, 27, 242, 179, 113, 26, 121, 61, 253, 35, 156, 61, 207, 82, 94, 226, 136, 167, 126, 45, 172, 248, 151, 168, 154, 132, 31, 67, 104, 111, 4, 234, 117, 160, 229, 181, 7, 28, 36, 115, 202, 29, 145, 120, 228, 115, 23, 125, 128, 239, 99, 41, 17, 159, 88, 62, 166, 241, 218, 173, 77, 131, 182, 213, 142, 215, 62, 138, 161, 40, 113, 218, 73, 28, 53, 229, 128, 32, 174, 183, 95, 37, 223, 7, 188, 222, 222, 207, 131, 242, 6, 208, 174, 198, 9, 68, 113, 166, 38, 179, 67, 181, 61, 119, 8, 14, 79, 18, 27, 156, 129, 158, 90, 42, 227, 223, 73, 191, 77, 26, 18, 120, 78, 26, 89, 224, 186, 202, 184, 118, 232, 162, 76, 88, 35, 157, 244, 185, 194, 223, 208, 186, 150, 184, 157, 120, 143, 148, 239, 90, 10, 182, 145, 138, 214, 150, 213, 78, 189, 46, 78, 203, 210, 190, 190, 1, 12, 178, 87, 121, 222, 159, 96, 53, 60, 169, 131, 21, 71, 128, 175, 231, 71, 231, 125, 160, 0, 32, 162, 71, 70, 193, 136, 148, 128, 219, 11, 80, 182, 155, 32, 128, 60, 138, 228, 65, 19, 23, 234, 123, 89, 81, 33, 72, 84, 49, 156, 68, 180, 108, 62, 146, 73, 35, 188, 102, 228, 85, 147, 4, 116, 219, 76, 74, 1, 14, 59, 254, 56, 46, 53, 83, 202, 224, 135, 26, 239, 47, 104, 80, 36, 197, 182, 239, 197, 153, 162, 118, 56, 97, 69, 32, 41, 13, 30, 125, 191, 220, 62, 92, 206, 169, 49, 72, 250, 122, 42, 207, 15, 187, 170, 103, 253, 199, 236, 244, 89, 115, 99, 254, 133, 233, 120, 69, 212, 153, 53, 251, 143, 81, 99, 243, 242, 220, 198, 164, 163, 215, 178, 124, 236, 39, 91, 190, 254, 90, 83, 186, 168, 129, 252, 157, 214, 224, 223, 210, 98, 20, 27, 152, 233, 212, 228, 230, 178, 0, 148, 44, 106, 169, 175, 228, 187, 193, 50, 6, 0, 214, 194, 4, 182, 90, 107, 34, 157, 211, 251, 95, 31, 68, 51, 130, 242, 20, 24, 219, 131, 174, 220, 230, 146, 107, 87, 113, 192, 53, 68, 198, 247, 90, 215, 238, 191, 108, 241, 4, 30, 188, 179, 140, 14, 186, 19, 204, 54, 208, 37, 27, 62, 9, 111, 126, 139, 206, 185, 3, 182, 164, 123, 217, 204, 215, 231, 124, 8, 228, 53, 60, 114, 76, 35, 28, 158, 83, 228, 155, 151, 145, 242, 29, 162, 77, 95, 36, 191, 62, 197, 191, 195, 234, 10, 76, 222, 59, 132, 51, 173, 139, 83, 202, 203, 35, 147, 189, 112, 160, 198, 35, 122, 216, 112, 194, 88, 160, 138, 76, 144, 182, 110, 167, 117, 61, 240, 27, 183, 226, 94, 21, 251, 85, 55, 253, 22, 37, 146, 0, 144, 56, 11, 72, 228, 222, 183, 62, 229, 160, 183, 18, 224, 152, 142, 230, 140, 104, 34, 177, 62, 222, 190, 83, 188, 234, 67, 139, 142, 57, 146, 40, 218, 138, 77, 82, 155, 84, 27, 99, 75, 52, 169, 147, 83, 143, 218, 28, 150, 18, 52, 81, 214, 83, 127, 49, 44, 214, 67, 50, 192, 110, 220, 53, 107, 37, 43, 118, 125, 157, 3, 109, 149, 187, 202, 57, 58, 64, 186, 249, 20, 94, 16, 177, 79, 140, 36, 158, 104, 42, 228, 178, 207, 160, 240, 125, 50, 67, 251, 42, 255, 42, 128, 224, 135, 82, 108, 102, 139, 207, 220, 229, 77, 187, 133, 43, 29, 221, 208, 114, 229, 237, 162, 26, 124, 126, 235, 176, 52, 133, 194, 192, 175, 188, 73, 67, 25, 65, 231, 132, 115, 57, 128, 36, 114, 31, 53, 235, 170, 188, 55, 104, 93, 39, 43, 43, 32, 199, 123, 138, 221, 234, 147, 150, 203, 138, 15, 29, 49, 84, 136, 143, 154, 196, 77, 157, 130, 17, 71, 182, 5, 5, 184, 108, 239, 237, 149, 33, 32, 28, 213, 202, 185, 36, 20, 217, 231, 190, 116, 216, 219, 255, 20, 253, 101, 37, 226, 195, 254, 27, 32, 188, 227, 141, 137, 21, 224, 94, 11, 254, 112, 248, 16, 151, 91, 18, 57, 134, 53, 232, 130, 205, 178, 76, 5, 7, 231, 55, 157, 40, 144, 76, 218, 121, 193, 148, 11, 78, 183, 253, 254, 94, 129, 9, 4, 160, 140, 167, 73, 213, 133, 201, 5, 53, 100, 116, 253, 93, 63, 169, 17, 197, 186, 156, 11, 148, 185, 155, 49, 186, 189, 247, 7, 93, 142, 181, 132, 73, 153, 33, 140, 180, 150, 58, 23, 124, 93, 101, 92, 74, 94, 114, 187, 148, 209, 203, 216, 28, 57, 20, 136, 209, 197, 229, 119, 236, 153, 170, 148, 102, 15, 52, 128, 72, 233, 123, 239, 132, 46, 28, 248, 88, 232, 202, 103, 148, 205, 192, 108, 3, 207, 92, 65, 83, 73, 154, 222, 240, 229, 160, 32, 53, 117, 49, 46, 98, 83, 116, 164, 176, 16, 97, 69, 186, 171, 153, 46, 224, 133, 149, 155, 252, 18, 95, 102, 254, 39, 177, 120, 108, 228, 13, 64, 0, 244, 36, 99, 54, 138, 236, 75, 181, 53, 86, 137, 108, 216, 37, 73, 214, 157, 14, 216, 162, 155, 142, 114, 75, 34, 93, 239, 209, 250, 101, 244, 20, 114, 155, 77, 82, 39, 196, 249, 81, 221, 225, 7, 239, 246, 175, 57, 68, 144, 97, 177, 221, 98, 95, 81, 87, 189, 247, 107, 95, 255, 8, 16, 37, 80, 126, 41, 182, 184, 11, 127, 209, 15, 149, 4, 37, 18, 35, 165, 232, 185, 67, 179, 207, 239, 90, 154, 34, 108, 144, 181, 135, 47, 216, 219, 95, 198, 161, 39, 138, 114, 112, 177, 168, 214, 68, 142, 96, 80, 224, 65, 9, 108, 225, 113, 73, 10, 15, 196, 67, 62, 164, 81, 67, 116, 255, 131, 73, 9, 68, 81, 83, 110, 49, 113, 61, 235, 152, 245, 70, 208, 163, 98, 247, 90, 243, 83, 70, 195, 79, 134, 220, 132, 118, 217, 205, 162, 249, 145, 143, 110, 154, 159, 137, 66, 231, 91, 152, 239, 188, 219, 75, 67, 215, 145, 157, 29, 220, 139, 116, 65, 215, 117, 162, 112, 112, 34, 106, 19, 93, 237, 155, 74, 139, 243, 169, 111, 175, 117, 125, 253, 159, 179, 225, 52, 109, 211, 224, 34, 68, 187, 90, 114, 133, 197, 80, 211, 137, 70, 78, 6, 117, 94, 203, 158, 24, 145, 155, 138, 253, 239, 114, 6, 41, 120, 127, 186, 92, 17, 81, 162, 222, 176, 225, 135, 160, 24, 227, 41, 146, 249, 111, 112, 106, 236, 107, 103, 95, 1, 51, 106, 11, 25, 168, 171, 86, 74, 62, 253, 157, 244, 14, 191, 71, 78, 225, 149, 8, 25, 121, 252, 139, 44, 51, 43, 7, 167, 226, 21, 250, 50, 39, 36, 169, 152, 75, 209, 101, 2, 15, 192, 186, 166, 186, 239, 49, 225, 196, 53, 189, 187, 6, 137, 180, 147, 42, 75, 79, 203, 63, 151, 68, 5, 143, 94, 105, 161, 30, 103, 143, 251, 48, 142, 128, 214, 136, 150, 163, 88, 138, 224, 141, 220, 107, 136, 80, 14, 192, 236, 120, 61, 208, 34, 179, 238, 119, 231, 58, 190, 41, 40, 158, 199, 172, 173, 102, 54, 3, 76, 211, 104, 186, 248, 150, 169, 72, 83, 136, 141, 10, 189, 198, 108, 151, 206, 95, 24, 202, 213, 41, 159, 148, 121, 199, 137, 147, 68, 97, 233, 201, 249, 197, 101, 87, 142, 120, 90, 68, 191, 114, 141, 162, 154, 8, 224, 124, 243, 86, 226, 251, 75, 13, 230, 240, 249, 124, 81, 62, 135, 187, 98, 2, 157, 213, 98, 54, 28, 50, 18, 201, 175, 140, 153, 156, 214, 5, 0, 164, 5, 78, 160, 254, 124, 50, 153, 230, 72, 79, 74, 41, 192, 120, 130, 238, 213, 122, 192, 93, 50, 144, 205, 219, 75, 204, 30, 249, 180, 246, 20, 213, 152, 160, 82, 180, 185, 69, 59, 176, 215, 152, 22, 250, 180, 136, 14, 6, 187, 179, 94, 82, 49, 62, 65, 47, 187, 233, 37, 117, 77, 75, 122, 68, 64, 40, 118, 6, 202, 186, 203, 237, 27, 243, 9, 76, 16, 125, 160, 172, 34, 56, 107, 84, 139, 249, 219, 113, 119, 167, 50, 187, 236, 232, 138, 176, 252, 75, 104, 162, 225, 73, 54, 208, 113, 164, 138, 131, 76, 178, 254, 160, 114, 238, 196, 227, 79, 185, 206, 217, 67, 168, 7, 129, 145, 69, 27, 95, 216, 173, 67, 245, 136, 47, 222, 123, 145, 86, 227, 120, 35, 218, 160, 93, 103, 43, 116, 69, 101, 38, 191, 92, 52, 176, 250, 136, 42, 196, 188, 159, 238, 161, 182, 139, 107, 99, 206, 19, 223, 51, 4, 25, 138, 18, 217, 117, 142, 164, 69, 247, 137, 133, 167, 69, 37, 206, 38, 72, 107, 6, 208, 239, 237, 173, 28, 248, 41, 57, 221, 178, 0, 229, 113, 174, 212, 89, 64, 71, 92, 187, 142, 25, 100, 236, 39, 63, 196, 186, 123, 216, 104, 135, 57, 2, 121, 40, 13, 87, 75, 151, 12, 158, 181, 196, 197, 208, 230, 110, 28, 206, 66, 123, 246, 243, 106, 88, 240, 82, 60, 152, 144, 211, 90, 134, 143, 101, 152, 114, 124, 68, 52, 47, 172, 93, 194, 196, 136, 184, 225, 50, 140, 28, 125, 74, 80, 199, 29, 212, 196, 161, 178, 222, 88, 72, 60, 85, 128, 182, 82, 227, 160, 10, 221, 13, 191, 97, 210, 9, 59, 12, 65, 210, 75, 228, 164, 120, 69, 109, 179, 134, 160, 96, 15, 207, 131, 130, 95, 93, 255, 167, 186, 206, 242, 212, 229, 232, 40, 134, 223, 184, 153, 183, 158, 54, 80, 151, 97, 247, 210, 7, 141, 208, 114, 95, 106, 212, 200, 111, 4, 136, 248, 24, 173, 141, 251, 99, 110, 94, 124, 246, 159, 153, 102, 102, 116, 185, 178, 195, 29, 177, 174, 80, 23, 179, 140, 205, 84, 88, 127, 126, 15, 90, 202, 178, 27, 161, 248, 160, 1, 168, 197, 142, 179, 206, 191, 29, 230, 106, 25, 54, 171, 42, 1, 19, 229, 88, 255, 153, 153, 84, 225, 19, 223, 134, 222, 7, 24, 125, 47, 126, 96, 128, 161, 74, 130, 75, 136, 148, 243, 76, 183, 78, 166, 31, 28, 33, 124, 212, 179, 63, 70, 156, 205, 169, 120, 39, 194, 212, 4, 172, 185, 219, 8, 12, 43, 171, 143, 89, 222, 220, 14, 8, 128, 145, 216, 81, 122, 25, 91, 17, 83, 222, 64, 143, 197, 149, 176, 106, 18, 238, 234, 23, 118, 253, 49, 158, 50, 71, 15, 255, 59, 19, 236, 43, 68, 107, 250, 216, 44, 202, 6, 142, 204, 204, 193, 192, 73, 22, 217, 132, 73, 216, 126, 32, 156, 83, 66, 247, 190, 209, 28, 52, 51, 23, 31, 97, 31, 227, 57, 174, 63, 226, 78, 72, 75, 250, 244, 251, 162, 98, 85, 175, 245, 50, 68, 139, 86, 227, 121, 253, 209, 115, 156, 107, 35, 29, 108, 83, 35, 42, 21, 111, 89, 62, 14, 205, 102, 46, 216, 133, 223, 190, 226, 235, 13, 158, 162, 197, 23, 92, 79, 229, 46, 98, 84, 45, 136, 235, 82, 160, 140, 123, 80, 158, 26, 140, 135, 49, 92, 254, 70, 164, 196, 154, 88, 18, 183, 65, 23, 81, 239, 60, 135, 5, 229, 67, 154, 45, 189, 235, 153, 194, 1, 157, 99, 144, 121, 185, 253, 125, 173, 159, 159, 186, 73, 56, 197, 68, 152, 25, 37, 96, 248, 31, 162, 10, 198, 96, 60, 245, 33, 235, 39, 55, 148, 150, 19, 234, 237, 124, 166, 33, 249, 214, 94, 161, 224, 163, 222, 149, 170, 199, 30, 178, 250, 176, 96, 100, 112, 22, 154, 101, 89, 38, 202, 236, 89, 66, 206, 95, 123, 180, 245, 160, 36, 197, 132, 86, 103, 192, 222, 243, 230, 31, 42, 243, 19, 141, 231, 230, 227, 194, 89, 118, 162, 125, 168, 176, 86, 214, 173, 28, 109, 36, 159, 110, 57, 93, 12, 89, 147, 175, 109, 165, 59, 127, 170, 235, 126, 35, 19, 218, 34, 41, 13, 193, 242, 121, 222, 152, 84, 214, 213, 31, 19, 24, 161, 161, 106, 130, 190, 66, 10, 128, 74, 81, 184, 231, 91, 212, 29, 233, 230, 205, 37, 180, 129, 198, 116, 189, 168, 253, 165, 17, 193, 40, 177, 60, 75, 162, 103, 71, 46, 137, 75, 196, 30, 194, 113, 118, 129, 103, 207, 227, 172, 164, 186, 61, 231, 73, 235, 182, 209, 23, 141, 187, 116, 2, 128, 69, 92, 239, 135, 159, 203, 105, 12, 242, 185, 147, 208, 76, 109, 241, 153, 226, 112, 148, 143, 124, 42, 199, 57, 120, 26, 3, 124, 181, 177, 160, 193, 182, 237, 128, 153, 150, 40, 181, 87, 207, 178, 35, 10, 178, 15, 144, 54, 68, 205, 104, 212, 173, 226, 20, 57, 181, 17, 106, 207, 171, 203, 178, 90, 176, 86, 2, 73, 43, 119, 53, 171, 205, 120, 157, 147, 148, 35, 52, 7, 173, 244, 228, 18, 108, 187, 166, 133, 18, 74, 127, 99, 153, 153, 93, 115, 245, 188, 140, 52, 150, 122, 56, 226, 34, 210, 113, 93, 194, 18, 125, 63, 64, 221, 58, 136, 1, 63, 126, 60, 139, 87, 214, 13, 80, 80, 51, 149, 239, 148, 229, 68, 237, 0, 55, 51, 152, 19, 249, 143, 129, 229, 3, 154, 48, 103, 48, 144, 205, 203, 180, 8, 80, 32, 30, 35, 233, 192, 165, 97, 220, 99, 203, 91, 13, 41, 14, 196, 164, 122, 67, 5, 143, 60, 190, 213, 124, 96, 80, 12, 158, 234, 100, 236, 106, 179, 163, 154, 27, 149, 40, 61, 237, 56, 46, 132, 241, 136, 15, 247, 83, 106, 119, 0, 207, 5, 185, 213, 59, 37, 222, 21, 215, 46, 23, 60, 200, 0, 165, 223, 157, 193, 182, 43, 6, 125, 232, 180, 158, 190, 170, 165, 130, 173, 0, 89, 204, 88, 212, 219, 19, 234, 235, 99, 144, 66, 105, 222, 9, 208, 167, 56, 108, 235, 9, 34, 2, 198, 29, 29, 137, 3, 130, 218, 25, 134, 116, 243, 37, 207, 136, 50, 179, 253, 251, 35, 95, 108, 157, 20, 221, 193, 1, 241, 178, 173, 39, 185, 138, 188, 72, 92, 64, 15, 126, 30, 65, 206, 62, 47, 54, 244, 58, 88, 176, 254, 30, 163, 140, 91, 102, 222, 62, 194, 1, 229, 189, 34, 53, 162, 118, 127, 74, 9, 178, 38, 43, 255, 153, 210, 202, 240, 173, 152, 98, 149, 194, 52, 34, 220, 7, 142, 12, 203, 156, 50, 159, 144, 204, 132, 44, 72, 20, 30, 167, 232, 250, 113, 35, 174, 16, 97, 32, 45, 55, 204, 10, 148, 87, 31, 195, 63, 198, 193, 248, 63, 9, 20, 189, 243, 205, 64, 160, 104, 182, 117, 142, 205, 200, 45, 83, 239, 0, 115, 103, 2, 211, 236, 116, 8, 127, 253, 187, 215, 223, 43, 38, 184, 62, 66, 84, 167, 220, 52, 239, 58, 132, 153, 15, 132, 82, 36, 110, 114, 154, 196, 106, 90, 175, 80, 219, 86, 31, 40, 28, 97, 54, 203, 86, 193, 24, 8, 39, 244, 159, 242, 57, 74, 83, 181, 238, 171, 160, 249, 192, 115, 233, 93, 194, 242, 246, 188, 111, 175, 120, 50, 147, 223, 69, 2, 108, 202, 205, 113, 125, 61, 102, 82, 243, 23, 115, 173, 250, 242, 206, 30, 121, 54, 213, 122, 221, 28, 178, 209, 197, 100, 56, 19, 72, 68, 7, 203, 2, 98, 91, 68, 230, 39, 127, 97, 71, 230, 37, 178, 111, 48, 246, 98, 190, 167, 177, 62, 190, 103, 223, 28, 98, 83, 212, 74, 244, 54, 146, 195, 62, 73, 150, 127, 171, 127, 84, 72, 56, 190, 50, 226, 240, 40, 88, 205, 96, 230, 69, 177, 128, 61, 229, 230, 229, 218, 1, 129, 98, 181, 40, 90, 252, 250, 197, 247, 86, 55, 61, 59, 175, 99, 15, 8, 195, 56, 174, 79, 19, 64, 70, 209, 22, 63, 212, 88, 226, 10, 64, 67, 199, 36, 212, 208, 5, 97, 113, 203, 156, 6, 12, 179, 187, 49, 188, 242, 15, 80, 91, 28, 95, 69, 236, 56, 172, 96, 255, 38, 187, 189, 110, 153, 119, 26, 72, 68, 205, 69, 95, 69, 43, 161, 100, 180, 49, 248, 182, 207, 67, 250, 44, 123, 97, 225, 209, 54, 225, 59, 255, 114, 182, 127, 12, 22, 76, 167, 190, 129, 155, 224, 153, 88, 207, 44, 59, 250, 221, 224, 255, 115, 63, 184, 52, 43, 203, 188, 77, 157, 131, 224, 94, 52, 146, 14, 3, 241, 84, 75, 179, 93, 175, 6, 86, 32, 70, 12, 151, 44, 87, 228, 236, 84, 54, 104, 246, 129, 108, 115, 29, 157, 87, 54, 4, 211, 57, 230, 169, 183, 255, 180, 95, 51, 41, 107, 151, 100, 188, 150, 119, 233, 114, 224, 205, 244, 234, 48, 20, 203, 61, 229, 35, 95, 213, 197, 51, 57, 90, 174, 166, 59, 71, 190, 251, 137, 50, 199, 149, 173, 119, 30, 19, 44, 89, 76, 48, 14, 185, 134, 4, 164, 9, 248, 39, 199, 241, 17, 53, 140, 215, 109, 142, 165, 126, 180, 208, 71, 17, 42, 185, 186, 238, 234, 128, 38, 120, 16, 243, 151, 70, 125, 202, 108, 8, 227, 168, 189, 249, 175, 3, 252, 15, 43, 0, 121, 52, 252, 113, 131, 60, 150, 249, 109, 137, 210, 116, 44, 169, 243, 154, 188, 198, 107, 190, 167, 45, 44, 157, 70, 185, 34, 47, 66, 127, 252, 74, 240, 4, 162, 192, 157, 246, 34, 107, 251, 221, 79, 53, 78, 208, 198, 138, 109, 227, 69, 120, 14, 0, 164, 181, 117, 167, 158, 207, 53, 180, 12, 76, 168, 82, 217, 45, 134, 169, 242, 128, 75, 25, 60, 35, 56, 204, 197, 146, 187, 120, 255, 180, 156, 88, 34, 125, 234, 47, 217, 34, 114, 92, 255, 75, 94, 129, 27, 119, 161, 199, 156, 106, 30, 129, 53, 152, 54, 1, 181, 24, 8, 247, 7, 150, 83, 142, 101, 32, 176, 101, 213, 113, 22, 226, 159, 142, 162, 97, 138, 158, 97, 66, 23, 53, 22, 38, 204, 211, 160, 149, 243, 34, 80, 226, 208, 47, 80, 41, 211, 21, 82, 121, 189, 203, 232, 227, 205, 72, 237, 219, 29, 152, 132, 153, 138, 238, 64, 216, 202, 225, 164, 98, 213, 214, 147, 184, 49, 73, 55, 32, 196, 15, 226, 109, 226, 177, 193, 0, 18, 57, 157, 53, 53, 50, 179, 175, 125, 60, 178, 151, 214, 52, 248, 238, 181, 81, 148, 167, 49, 203, 102, 151, 122, 248, 246, 250, 64, 4, 16, 65, 64, 15, 49, 28, 135, 198, 240, 5, 224, 155, 0, 35, 190, 33, 130, 99, 156, 68, 6, 79, 252, 213, 252, 14, 119, 86, 81, 16, 106, 52, 19, 64, 218, 68, 215, 99, 51, 62, 208, 101, 51, 49, 178, 237, 169, 43, 32, 116, 246, 1, 198, 1, 137, 211, 245, 241, 64, 241, 232, 37, 36, 224, 47, 176, 104, 62, 55, 9, 52, 22, 154, 180, 234, 87, 32, 183, 146, 242, 221, 141, 115, 27, 112, 76, 156, 13, 214, 28, 223, 175, 164, 72, 197, 63, 232, 125, 171, 28, 178, 55, 254, 169, 11, 182, 51, 247, 188, 235, 74, 60, 107, 145, 164, 208, 72, 123, 89, 200, 161, 9, 98, 32, 22, 30, 59, 39, 121, 76, 158, 244, 82, 246, 207, 168, 49, 248, 96, 201, 6, 202, 93, 133, 69, 225, 102, 246, 190, 111, 28, 20, 135, 31, 88, 158, 131, 247, 79, 5, 240, 181, 171, 13, 199, 79, 140, 44, 96, 59, 216, 78, 202, 167, 124, 243, 3, 86, 185, 17, 101, 102, 13, 169, 227, 48, 11, 86, 221, 48, 205, 210, 219, 84, 227, 188, 173, 144, 169, 124, 205, 107, 167, 21, 152, 146, 247, 48, 239, 235, 8, 85, 130, 128, 157, 3, 108, 123, 39, 26, 187, 234, 15, 9, 229, 86, 196, 199, 64, 140, 179, 150, 84, 200, 221, 150, 204, 33, 243, 119, 165, 200, 151, 84, 151, 10, 114, 6, 97, 182, 194, 41, 218, 15, 199, 243, 84, 200, 86, 168, 121, 161, 5, 233, 13, 162, 104, 242, 198, 106, 20, 135, 177, 143, 206, 180, 120, 193, 207, 100, 117, 44, 2, 109, 86, 163, 111, 151, 118, 149, 139, 190, 145, 4, 175, 184, 154, 155, 63, 126, 151, 82, 48, 240, 28, 186, 184, 126, 227, 240, 111, 231, 172, 116, 131, 58, 44, 230, 52, 232, 199, 222, 194, 36, 115, 68, 50, 30, 166, 134, 186, 73, 225, 72, 58, 0, 237, 223, 87, 123, 38, 86, 11, 68, 93, 112, 124, 168, 108, 88, 47, 113, 16, 108, 13, 179, 151, 173, 50, 188, 106, 25, 184, 172, 173, 251, 233, 71, 66, 96, 108, 102, 183, 69, 13, 73, 119, 1, 202, 105, 223, 216, 160, 89, 1, 176, 102, 173, 220, 165, 64, 46, 125, 149, 56, 202, 169, 74, 156, 114, 218, 49, 223, 183, 43, 112, 176, 58, 197, 55, 59, 18, 11, 42, 147, 61, 31, 36, 218, 53, 190, 7, 130, 200, 5, 147, 24, 153, 147, 205, 123, 4, 54, 225, 33, 210, 193, 123, 236, 209, 63, 6, 24, 112, 204, 8, 83, 175, 146, 46, 222, 157, 36, 156, 20, 163, 47, 222, 245, 49, 88, 117, 83, 219, 144, 91, 222, 8, 250, 11, 210, 90, 206, 253, 167, 4, 98, 160, 146, 197, 202, 151, 46, 35, 58, 197, 43, 163, 75, 234, 106, 34, 245, 182, 99, 195, 201, 185, 199, 115, 41, 107, 84, 18, 1, 72, 3, 65, 211, 251, 239, 112, 117, 191, 121, 27, 253, 152, 17, 224, 152, 207, 111, 190, 188, 24, 225, 15, 224, 66, 17, 186, 41, 74, 243, 30, 124, 43, 144, 119, 117, 127, 58, 161, 98, 238, 208, 243, 232, 125, 1, 14, 227, 244, 8, 231, 135, 193, 148, 36, 225, 229, 142, 34, 109, 177, 237, 165, 172, 108, 101, 59, 102, 92, 198, 60, 170, 150, 161, 158, 159, 120, 106, 106, 196, 138, 112, 74, 97, 48, 252, 241, 192, 183, 100, 20, 8, 61, 144, 192, 209, 172, 230, 114, 75, 37, 26, 216, 162, 55, 199, 201, 163, 76, 54, 122, 125, 42, 116, 86, 235, 42, 139, 122, 98, 42, 52, 182, 11, 218, 140, 79, 9, 191, 36, 79, 203, 112, 6, 46, 208, 73, 81, 146, 115, 236, 180, 110, 104, 202, 140, 20, 50, 55, 255, 65, 94, 72, 67, 207, 204, 204, 177, 49, 207, 36, 112, 251, 140, 178, 84, 63, 160, 246, 234, 173, 146, 235, 24, 97, 105, 78, 199, 10, 66, 131, 155, 116, 207, 151, 133, 51, 177, 15, 226, 178, 100, 255, 100, 4, 105, 128, 28, 39, 214, 92, 174, 141, 45, 51, 95, 79, 175, 119, 38, 133, 158, 4, 216, 69, 230, 178, 84, 196, 8, 117, 233, 164, 28, 163, 61, 146, 232, 184, 130, 245, 226, 176, 111, 25, 148, 169, 120, 156, 199, 249, 86, 64, 254, 93, 201, 17, 221, 180, 61, 124, 224, 106, 66, 120, 154, 127, 85, 219, 192, 61, 189, 196, 90, 230, 113, 209, 20, 85, 239, 138, 247, 221, 147, 119, 69, 253, 123, 179, 177, 114, 190, 198, 251, 65, 239, 222, 140, 143, 69, 207, 161, 25, 21, 192, 165, 47, 158, 81, 89, 0, 78, 178, 79, 65, 21, 62, 165, 126, 43, 105, 116, 93, 79, 217, 129, 191, 117, 161, 142, 32, 210, 204, 26, 122, 118, 128, 93, 248, 7, 81, 73, 119, 126, 39, 223, 87, 10, 58, 210, 121, 226, 213, 96, 146, 78, 102, 187, 10, 181, 206, 242, 7, 54, 120, 241, 224, 139, 114, 152, 240, 103, 104, 22, 224, 83, 183, 199, 84, 116, 228, 136, 122, 170, 208, 182, 205, 174, 190, 208, 140, 7, 152, 197, 145, 126, 111, 33, 98, 50, 217, 92, 190, 220, 38, 98, 134, 100, 154, 202, 200, 28, 199, 169, 79, 86, 236, 22, 75, 73, 158, 228, 157, 15, 134, 205, 213, 76, 35, 205, 251, 108, 87, 235, 104, 12, 115, 60, 107, 82, 237, 242, 0, 225, 177, 75, 98, 207, 114, 205, 6, 249, 86, 6, 255, 148, 133, 66, 247, 73, 138, 190, 185, 243, 215, 136, 156, 15, 11, 132, 249, 255, 9, 176, 1, 197, 204, 244, 249, 118, 64, 107, 199, 234, 80, 173, 1, 23, 162, 65, 122, 78, 143, 88, 231, 210, 55, 173, 220, 254, 252, 135, 3, 29, 124, 238, 176, 155, 156, 21, 29, 25, 36, 133, 164, 57, 50, 185, 245, 192, 204, 119, 195, 166, 103, 235, 142, 65, 245, 24, 113, 79, 173, 21, 219, 19, 231, 92, 161, 50, 159, 102, 247, 214, 231, 173, 161, 79, 214, 248, 165, 141, 10, 17, 13, 16, 86, 87, 255, 235, 145, 239, 217, 245, 251, 34, 153, 28, 27, 57, 62, 122, 250, 13, 149, 6, 200, 163, 174, 222, 160, 32, 52, 6, 26, 2, 160, 64, 38, 140, 135, 146, 170, 24, 19, 239, 91, 112, 95, 5, 3, 86, 17, 174, 15, 174, 5, 224, 90, 191, 165, 208, 178, 199, 38, 29, 226, 234, 133, 160, 69, 112, 220, 239, 130, 180, 196, 91, 185, 88, 207, 98, 180, 240, 170, 9, 35, 2, 223, 193, 107, 80, 215, 91, 12, 142, 201, 141, 250, 217, 68, 224, 95, 27, 232, 62, 156, 132, 112, 166, 10, 43, 107, 33, 94, 153, 238, 49, 31, 252, 120, 95, 39, 237, 138, 106, 51, 85, 23, 150, 105, 65, 252, 201, 31, 111, 12, 91, 184, 143, 184, 4, 44, 90, 28, 54, 255, 40, 204, 17, 106, 18, 3, 193, 184, 73, 219, 82, 37, 84, 121, 130, 42, 141, 107, 231, 182, 245, 185, 252, 132, 164, 166, 126, 152, 21, 225, 81, 255, 136, 97, 45, 9, 80, 102, 12, 228, 104, 174, 194, 134, 142, 128, 38, 225, 124, 204, 187, 142, 13, 150, 245, 87, 59, 137, 147, 87, 180, 170, 165, 144, 213, 238, 126, 229, 72, 246, 44, 18, 214, 61, 143, 212, 133, 87, 54, 98, 136, 122, 183, 210, 135, 214, 208, 7, 40, 156, 150, 152, 193, 7, 172, 120, 6, 88, 46, 210, 167, 188, 49, 65, 58, 25, 224, 242, 109, 243, 120, 180, 178, 148, 80, 233, 11, 252, 186, 135, 161, 182, 56, 124, 114, 43, 79, 127, 72, 200, 162, 92, 252, 213, 100, 143, 171, 46, 82, 167, 230, 3, 146, 34, 206, 82, 57, 167, 186, 93, 80, 86, 1, 88, 200, 90, 160, 183, 165, 68, 224, 176, 78, 202, 185, 136, 76, 56, 162, 255, 138, 67, 110, 64, 7, 233, 6, 225, 206, 30, 14, 232, 82, 89, 128, 248, 23, 36, 249, 16, 242, 132, 10, 131, 236, 123, 250, 97, 198, 20, 89, 64, 107, 139, 232, 202, 21, 68, 69, 75, 19, 6, 160, 80, 31, 222, 190, 107, 246, 104, 187, 103, 108, 229, 97, 78, 232, 67, 178, 153, 159, 101, 28, 76, 200, 6, 39, 180, 12, 3, 151, 125, 158, 238, 216, 39, 206, 153, 129, 162, 175, 201, 181, 225, 38, 164, 120, 25, 40, 114, 83, 33, 96, 128, 82, 195, 82, 95, 202, 61, 23, 208, 15, 100, 150, 77, 213, 186, 247, 195, 104, 42, 185, 104, 113, 4, 132, 115, 181, 58, 185, 55, 157, 80, 191, 97, 200, 139, 187, 201, 227, 185, 134, 149, 220, 254, 4, 31, 45, 25, 158, 90, 100, 238, 181, 160, 76, 100, 225, 170, 74, 7, 88, 92, 106, 12, 23, 126, 1, 53, 88, 135, 159, 210, 157, 75, 54, 48, 207, 145, 110, 66, 28, 122, 30, 208, 177, 33, 171, 155, 41, 18, 46, 106, 183, 201, 79, 194, 15, 52, 53, 178, 127, 244, 212, 72, 162, 15, 57, 92, 153, 204, 235, 148, 176, 71, 172, 16, 9, 187, 32, 164, 96, 109, 208, 55, 43, 121, 19, 245, 116, 107, 124, 117, 191, 151, 0, 229, 37, 220, 174, 130, 92, 40, 126, 229, 29, 196, 95, 140, 168, 21, 137, 16, 15, 62, 134, 208, 189, 77, 244, 115, 67, 146, 229, 183, 229, 222, 98, 162, 212, 143, 81, 147, 154, 0, 243, 245, 33, 85, 3, 70, 154, 160, 246, 247, 114, 107, 109, 97, 117, 113, 171, 78, 202, 169, 224, 116, 60, 94, 201, 178, 158, 145, 88, 255, 3, 249, 168, 210, 119, 46, 222, 108, 165, 235, 119, 98, 141, 13, 153, 147, 156, 82, 101, 221, 127, 177, 16, 147, 224, 211, 89, 91, 127, 159, 97, 41, 89, 126, 207, 241, 66, 62, 170, 155, 31, 109, 68, 154, 105, 31, 163, 250, 169, 117, 195, 205, 205, 72, 135, 93, 237, 47, 214, 70, 40, 239, 154, 175, 204, 101, 64, 74, 90, 255, 30, 188, 79, 83, 143, 189, 170, 37, 87, 235, 236, 31, 42, 171, 33, 78, 34, 248, 139, 192, 244, 0, 202, 139, 78, 106, 182, 82, 234, 197, 126, 82, 243, 172, 111, 178, 94, 221, 69, 17, 166, 107, 54, 195, 89, 217, 129, 108, 55, 13, 185, 43, 172, 150, 120, 164, 96, 175, 74, 93, 195, 118, 238, 103, 139, 41, 171, 166, 30, 187, 165, 157, 66, 35, 175, 199, 65, 236, 22, 169, 150, 132, 214, 130, 90, 99, 247, 89, 241, 203, 247, 119, 169, 33, 251, 245, 205, 104, 169, 222, 171, 255, 121, 255, 73, 124, 149, 234, 136, 173, 110, 128, 176, 252, 24, 208, 23, 67, 155, 107, 159, 156, 59, 238, 66, 31, 132, 110, 201, 211, 2, 181, 93, 159, 185, 70, 243, 106, 127, 36, 236, 189, 254, 231, 206, 83, 255, 1, 12, 207, 152, 49, 245, 122, 234, 202, 186, 224, 134, 154, 143, 100, 52, 40, 82, 242, 252, 255, 33, 84, 150, 87, 212, 181, 89, 225, 173, 245, 78, 136, 151, 148, 145, 223, 99, 237, 104, 2, 174, 168, 196, 206, 115, 232, 105, 37, 185, 153, 127, 244, 104, 219, 44, 122, 130, 180, 23, 201, 58, 56, 113, 139, 209, 31, 95, 48, 70, 164, 140, 149, 193, 167, 61, 100, 16, 104, 34, 154, 232, 158, 145, 145, 125, 215, 199, 237, 15, 128, 37, 251, 105, 21, 87, 13, 137, 145, 3, 24, 118, 69, 194, 191, 197, 166, 208, 166, 29, 8, 49, 192, 124, 193, 204, 232, 0, 101, 41, 33, 149, 125, 192, 60, 11, 108, 9, 19, 42, 250, 214, 204, 2, 194, 26, 219, 98, 62, 251, 62, 206, 175, 204, 18, 166, 220, 9, 6, 110, 243, 99, 26, 98, 34, 37, 50, 232, 219, 13, 108, 138, 80, 220, 225, 126, 171, 134, 89, 117, 100, 247, 116, 219, 133, 31, 255, 203, 81, 102, 136, 5, 83, 213, 87, 144, 48, 15, 82, 70, 69, 154, 4, 82, 41, 136, 74, 37, 206, 225, 157, 195, 200, 88, 155, 111, 236, 217, 44, 243, 215, 104, 150, 3, 95, 90, 122, 140, 136, 7, 42, 192, 3, 122, 115, 202, 219, 164, 68, 111, 226, 0, 18, 149, 210, 56, 27, 249, 43, 203, 59, 8, 143, 171, 213, 92, 47, 85, 65, 36, 164, 115, 209, 116, 129, 108, 110, 48, 238, 228, 144, 128, 81, 137, 188, 50, 231, 101, 157, 191, 161, 31, 79, 254, 212, 21, 94, 112, 57, 47, 212, 190, 70, 100, 70, 129, 203, 208, 217, 69, 187, 30, 21, 131, 212, 70, 122, 191, 170, 32, 155, 255, 249, 9, 76, 244, 171, 29, 7, 182, 238, 40, 18, 11, 154, 193, 14, 188, 249, 173, 117, 55, 18, 222, 134, 191, 107, 153, 215, 211, 3, 235, 93, 49, 254, 42, 44, 105, 34, 193, 219, 19, 237, 239, 32, 207, 242, 227, 252, 225, 157, 62, 203, 76, 79, 137, 196, 213, 134, 224, 115, 76, 31, 66, 246, 199, 14, 144, 61, 213, 240, 69, 201, 238, 221, 53, 108, 116, 208, 22, 202, 3, 48, 210, 118, 24, 211, 133, 163, 235, 202, 188, 221, 180, 225, 26, 190, 47, 116, 221, 217, 208, 27, 10, 204, 214, 11, 83, 238, 113, 129, 73, 119, 90, 138, 104, 73, 25, 240, 149, 161, 167, 198, 150, 210, 73, 158, 3, 136, 249, 47, 33, 42, 209, 111, 87, 59, 113, 52, 83, 62, 41, 169, 101, 169, 123, 45, 214, 204, 94, 29, 88, 147, 157, 146, 131, 199, 240, 43, 5, 64, 214, 130, 150, 130, 80, 235, 194, 245, 88, 59, 75, 202, 130, 113, 4, 1, 124, 250, 5, 161, 228, 240, 161, 114, 187, 128, 130, 190, 75, 190, 195, 63, 112, 169, 10, 215, 176, 142, 197, 171, 63, 100, 143, 105, 6, 130, 216, 253, 189, 194, 227, 235, 174, 81, 186, 7, 26, 74, 29, 209, 17, 188, 5, 22, 222, 89, 162, 217, 103, 222, 175, 48, 238, 162, 192, 211, 121, 164, 212, 2, 194, 154, 18, 209, 215, 26, 128, 44, 235, 6, 189, 234, 210, 152, 14, 36, 6, 126, 13, 125, 35, 110, 63, 22, 82, 20, 203, 54, 123, 45, 182, 129, 148, 207, 66, 18, 54, 113, 18, 158, 110, 225, 85, 56, 113, 21, 191, 203, 85, 187, 193, 17, 252, 91, 51, 253, 253, 83, 249, 129, 94, 134, 62, 226, 136, 5, 39, 105, 213, 110, 229, 73, 88, 95, 66, 76, 115, 204, 190, 152, 9, 223, 62, 190, 13, 111, 140, 166, 186, 91, 68, 245, 15, 127, 6, 220, 223, 94, 10, 198, 23, 184, 7, 180, 121, 104, 180, 157, 28, 110, 55, 220, 99, 32, 227, 28, 239, 68, 88, 253, 56, 61, 195, 187, 147, 222, 150, 140, 171, 95, 95, 100, 217, 102, 66, 5, 211, 254, 39, 59, 4, 35, 213, 98, 180, 194, 99, 42, 218, 125, 48, 71, 41, 218, 24, 226, 37, 85, 232, 233, 54, 57, 189, 217, 129, 166, 25, 39, 174, 100, 161, 108, 24, 9, 139, 125, 19, 204, 163, 99, 207, 19, 52, 224, 246, 126, 20, 128, 39, 103, 190, 127, 172, 120, 244, 114, 53, 100, 250, 30, 237, 32, 131, 24, 205, 45, 62, 255, 146, 159, 47, 205, 11, 47, 123, 211, 50, 222, 221, 67, 241, 28, 61, 82, 240, 106, 111, 145, 96, 169, 164, 152, 34, 16, 202, 52, 168, 97, 21, 146, 11, 222, 58, 1, 188, 130, 51, 194, 191, 66, 233, 253, 222, 87, 226, 250, 63, 5, 252, 113, 249, 42, 208, 110, 97, 148, 232, 58, 88, 251, 29, 47, 202, 254, 177, 57, 255, 72, 177, 121, 156, 172, 149, 152, 98, 86, 81, 206, 239, 235, 45, 188, 12, 204, 248, 104, 238, 139, 254, 180, 27, 43, 65, 96, 37, 46, 167, 230, 109, 248, 45, 130, 176, 104, 51, 130, 44, 196, 3, 204, 136, 139, 118, 12, 28, 47, 170, 153, 151, 77, 220, 142, 229, 104, 133, 187, 1, 155, 169, 133, 230, 229, 221, 31, 200, 244, 5, 253, 178, 115, 231, 118, 19, 106, 171, 97, 134, 27, 105, 182, 47, 57, 143, 66, 175, 32, 77, 93, 108, 171, 216, 139, 167, 119, 33, 151, 130, 82, 151, 52, 16, 206, 71, 225, 125, 65, 93, 203, 220, 200, 86, 57, 161, 246, 162, 136, 158, 149, 115, 123, 57, 66, 31, 46, 59, 214, 16, 48, 249, 165, 77, 156, 88, 142, 13, 101, 30, 26, 62, 213, 23, 162, 212, 68, 46, 184, 167, 244, 106, 66, 51, 161, 88, 248, 143, 233, 144, 220, 84, 68, 144, 114, 219, 144, 79, 99, 9, 203, 149, 89, 192, 146, 197, 217, 73, 172, 204, 155, 129, 206, 182, 155, 233, 248, 200, 197, 136, 252, 224, 66, 255, 191, 78, 232, 166, 228, 234, 24, 180, 198, 71, 171, 6, 37, 187, 236, 96, 233, 168, 10, 223, 32, 152, 47, 154, 156, 162, 184, 80, 5, 191, 238, 132, 124, 255, 176, 191, 10, 108, 73, 131, 2, 182, 184, 220, 178, 65, 191, 192, 202, 49, 170, 139, 87, 182, 20, 110, 223, 3, 15, 156, 81, 185, 149, 102, 242, 53, 40, 203, 168, 242, 75, 185, 208, 66, 154, 199, 32, 175, 78, 219, 57, 60, 222, 92, 43, 7, 113, 110, 51, 254, 150, 118, 114, 131, 134, 149, 56, 87, 100, 152, 51, 226, 18, 85, 49, 130, 187, 215, 154, 195, 26, 254, 187, 181, 218, 54, 54, 77, 178, 20, 12, 152, 157, 180, 133, 86, 52, 48, 172, 37, 49, 117, 183, 71, 235, 13, 151, 90, 192, 119, 140, 36, 15, 192, 103, 11, 95, 5, 138, 239, 65, 152, 161, 41, 165, 210, 48, 96, 230, 96, 196, 9, 234, 29, 243, 170, 220, 42, 27, 86, 16, 213, 139, 82, 229, 246, 19, 83, 184, 248, 157, 199, 160, 238, 95, 174, 178, 136, 241, 61, 154, 99, 41, 89, 1, 156, 20, 53, 4, 193, 151, 145, 131, 72, 14, 220, 213, 230, 231, 82, 123, 249, 9, 68, 144, 51, 141, 25, 79, 210, 195, 238, 134, 206, 105, 12, 81, 173, 134, 6, 134, 8, 226, 21, 171, 219, 47, 227, 24, 31, 133, 181, 112, 138, 42, 234, 94, 39, 61, 84, 199, 207, 225, 107, 114, 214, 100, 8, 196, 68, 87, 138, 25, 32, 110, 180, 103, 225, 254, 249, 229, 128, 32, 66, 144, 202, 253, 46, 2, 195, 238, 37, 157, 18, 96, 57, 175, 42, 31, 125, 50, 2, 63, 209, 147, 162, 92, 163, 185, 240, 187, 162, 234, 112, 14, 189, 42, 76, 193, 168, 128, 251, 56, 251, 102, 156, 10, 132, 176, 16, 183, 139, 85, 94, 13, 190, 128, 213, 29, 168, 199, 232, 226, 104, 91, 0, 1, 69, 138, 191, 106, 64, 31, 79, 44, 231, 31, 167, 129, 172, 22, 6, 13, 98, 128, 63, 209, 221, 27, 59, 107, 81, 25, 189, 107, 208, 240, 84, 72, 82, 11, 57, 117, 146, 21, 63, 91, 2, 97, 60, 133, 157, 230, 74, 163, 245, 111, 95, 126, 188, 97, 89, 215, 35, 67, 13, 79, 15, 16, 175, 245, 239, 188, 233, 180, 127, 37, 236, 61, 56, 165, 45, 184, 220, 91, 76, 97, 100, 129, 241, 3, 3, 51, 25, 65, 210, 180, 191, 116, 105, 254, 139, 174, 220, 204, 181, 204, 216, 86, 228, 249, 122, 57, 143, 210, 48, 27, 249, 7, 165, 189, 143, 233, 163, 210, 249, 96, 86, 240, 43, 14, 132, 201, 92, 93, 160, 209, 85, 247, 104, 93, 33, 31, 101, 68, 35, 187, 172, 54, 130, 81, 51, 158, 209, 5, 149, 137, 248, 230, 72, 21, 58, 116, 189, 204, 204, 154, 6, 120, 178, 90, 155, 167, 104, 117, 137, 180, 135, 80, 3, 35, 108, 53, 225, 231, 4, 6, 112, 152, 80, 125, 85, 60, 150, 169, 0, 19, 217, 235, 149, 189, 143, 7, 194, 139, 224, 136, 163, 85, 119, 161, 222, 167, 147, 6, 85, 170, 204, 33, 12, 222, 209, 44, 128, 67, 90, 74, 110, 98, 184, 163, 124, 50, 147, 39, 237, 7, 99, 200, 202, 42, 193, 106, 235, 76, 194, 121, 96, 139, 31, 182, 213, 49, 169, 165, 93, 49, 207, 32, 97, 235, 65, 225, 234, 116, 30, 128, 182, 114, 45, 198, 74, 133, 55, 3, 159, 150, 124, 102, 153, 218, 185, 7, 146, 192, 187, 58, 83, 244, 251, 77, 87, 196, 181, 161, 30, 65, 247, 240, 143, 71, 75, 39, 147, 222, 201, 152, 139, 157, 180, 23, 43, 142, 215, 115, 223, 150, 194, 150, 201, 134, 188, 46, 23, 7, 195, 14, 106, 178, 92, 96, 128, 44, 167, 232, 22, 130, 186, 175, 136, 163, 52, 188, 168, 51, 135, 203, 70, 193, 191, 125, 163, 146, 188, 116, 141, 204, 62, 32, 192, 9, 133, 165, 59, 126, 159, 66, 29, 118, 187, 66, 218, 185, 215, 45, 187, 253, 100, 179, 162, 68, 134, 80, 193, 213, 172, 141, 73, 25, 81, 213, 135, 198, 111, 152, 14, 212, 92, 189, 191, 252, 152, 227, 88, 175, 203, 105, 139, 10, 3, 218, 190, 224, 113, 37, 255, 54, 39, 76, 211, 17, 250, 109, 2, 235, 55, 67, 224, 129, 134, 212, 57, 202, 133, 32, 249, 56, 246, 123, 14, 14, 158, 56, 242, 167, 6, 85, 107, 96, 64, 92, 30, 164, 60, 116, 190, 112, 203, 121, 143, 110, 178, 241, 231, 135, 250, 27, 91, 98, 139, 178, 43, 254, 68, 159, 42, 137, 208, 138, 85, 92, 242, 240, 17, 194, 208, 247, 242, 53, 145, 20, 179, 1, 40, 12, 171, 34, 58, 119, 79, 112, 193, 109, 127, 128, 121, 144, 254, 27, 161, 145, 192, 88, 65, 102, 109, 133, 9, 232, 36, 179, 53, 226, 81, 124, 164, 183, 51, 133, 243, 213, 174, 52, 21, 20, 27, 38, 4, 226, 75, 241, 131, 8, 192, 227, 79, 140, 72, 76, 234, 242, 82, 56, 178, 157, 184, 187, 179, 27, 184, 118, 4, 45, 115, 124, 140, 46, 130, 55, 94, 166, 75, 12, 44, 24, 225, 215, 62, 110, 23, 4, 153, 255, 109, 55, 255, 206, 240, 61, 125, 153, 43, 187, 204, 136, 154, 214, 109, 99, 127, 178, 212, 112, 50, 220, 230, 244, 163, 205, 166, 179, 205, 15, 91, 25, 2, 58, 116, 83, 106, 231, 108, 133, 49, 86, 136, 202, 154, 230, 211, 231, 201, 91, 91, 32, 169, 68, 17, 42, 49, 129, 35, 106, 211, 35, 197, 114, 66, 71, 221, 221, 147, 248, 112, 169, 75, 203, 63, 221, 7, 148, 220, 232, 222, 120, 212, 147, 27, 209, 187, 76, 22, 248, 27, 238, 133, 59, 124, 199, 254, 184, 23, 164, 146, 12, 173, 16, 39, 207, 220, 209, 54, 55, 157, 207, 238, 187, 66, 222, 131, 205, 218, 183, 223, 173, 171, 173, 41, 247, 219, 106, 62, 155, 131, 120, 246, 250, 57, 222, 20, 65, 136, 92, 71, 230, 157, 224, 42, 209, 120, 4, 158, 196, 246, 10, 218, 143, 8, 41, 37, 31, 51, 205, 230, 223, 100, 246, 131, 148, 198, 188, 177, 133, 235, 148, 91, 207, 91, 69, 225, 252, 116, 253, 125, 125, 35, 224, 127, 68, 38, 67, 228, 183, 6, 108, 130, 172, 19, 16, 118, 144, 69, 93, 70, 182, 87, 152, 207, 191, 32, 22, 42, 114, 203, 106, 4, 179, 144, 92, 21, 79, 13, 226, 187, 206, 158, 57, 82, 122, 48, 127, 214, 28, 104, 146, 135, 117, 194, 11, 199, 234, 52, 209, 11, 162, 171, 171, 75, 49, 18, 91, 82, 143, 181, 16, 71, 103, 0, 173, 10, 4, 124, 218, 85, 193, 107, 118, 172, 14, 103, 60, 180, 250, 30, 255, 114, 177, 5, 217, 132, 125, 10, 159, 165, 137, 255, 153, 233, 163, 88, 150, 185, 218, 178, 141, 2, 175, 8, 175, 44, 191, 242, 59, 15, 191, 100, 31, 84, 167, 10, 172, 217, 42, 44, 230, 169, 58, 80, 94, 29, 232, 73, 98, 217, 29, 217, 207, 255, 27, 54, 19, 234, 191, 125, 54, 82, 210, 195, 115, 70, 103, 160, 85, 222, 190, 47, 63, 86, 138, 90, 77, 75, 146, 73, 106, 33, 117, 164, 150, 149, 111, 63, 236, 123, 33, 240, 113, 252, 161, 30, 44, 225, 104, 98, 94, 49, 60, 34, 51, 243, 86, 72, 126, 194, 235, 176, 145, 5, 221, 226, 45, 80, 134, 59, 235, 202, 5, 247, 2, 164, 23, 195, 232, 125, 155, 177, 87, 160, 94, 33, 212, 135, 55, 255, 116, 170, 207, 173, 148, 234, 51, 152, 213, 158, 175, 35, 122, 190, 64, 92, 122, 144, 243, 201, 230, 191, 252, 190, 250, 70, 198, 193, 180, 25, 205, 75, 210, 78, 81, 198, 94, 254, 220, 162, 189, 212, 239, 209, 149, 213, 91, 255, 105, 145, 136, 210, 118, 119, 173, 98, 13, 87, 91, 3, 113, 45, 7, 20, 153, 163, 169, 45, 188, 216, 174, 140, 168, 110, 136, 10, 155, 116, 218, 132, 94, 18, 78, 15, 117, 47, 98, 130, 93, 80, 219, 107, 184, 10, 138, 184, 180, 89, 154, 43, 13, 143, 179, 140, 23, 160, 224, 59, 113, 79, 126, 219, 144, 94, 13, 153, 245, 8, 215, 121, 206, 251, 141, 16, 167, 159, 198, 190, 226, 247, 4, 120, 253, 39, 147, 173, 68, 226, 152, 27, 137, 161, 131, 59, 86, 6, 90, 227, 103, 4, 96, 27, 76, 28, 201, 146, 42, 77, 253, 104, 49, 219, 196, 106, 199, 107, 47, 157, 53, 191, 67, 219, 159, 68, 183, 39, 233, 130, 24, 85, 188, 201, 200, 249, 131, 197, 246, 97, 213, 158, 173, 156, 19, 171, 121, 122, 147, 72, 40, 251, 97, 158, 175, 115, 171, 151, 254, 53, 163, 35, 142, 5, 14, 12, 15, 224, 154, 187, 134, 78, 187, 223, 237, 147, 124, 33, 113, 221, 135, 150, 33, 20, 71, 134, 89, 70, 2, 161, 101, 100, 13, 29, 144, 201, 99, 24, 224, 204, 35, 245, 197, 47, 65, 25, 2, 62, 43, 177, 55, 124, 236, 10, 140, 249, 23, 11, 69, 196, 174, 189, 132, 100, 9, 44, 30, 54, 167, 131, 191, 199, 181, 16, 250, 56, 4, 62, 114, 93, 122, 118, 75, 231, 138, 41, 85, 187, 58, 209, 249, 63, 94, 34, 227, 10, 153, 12, 98, 3, 135, 248, 68, 139, 231, 83, 221, 77, 248, 147, 94, 21, 151, 168, 230, 115, 4, 69, 34, 202, 71, 102, 32, 88, 28, 6, 250, 115, 236, 28, 0, 177, 188, 252, 209, 194, 165, 221, 8, 199, 180, 72, 169, 23, 14, 29, 14, 227, 68, 148, 5, 137, 60, 39, 115, 136, 90, 28, 228, 189, 39, 17, 102, 196, 68, 121, 161, 90, 70, 62, 141, 12, 52, 161, 17, 246, 128, 37, 170, 189, 213, 49, 97, 67, 227, 60, 26, 60, 113, 198, 247, 49, 132, 169, 7, 220, 219, 47, 112, 74, 48, 230, 203, 212, 198, 83, 214, 12, 173, 206, 159, 243, 171, 255, 246, 239, 66, 24, 111, 39, 235, 73, 248, 174, 247, 153, 238, 86, 202, 109, 189, 105, 80, 232, 21, 12, 198, 133, 125, 207, 44, 118, 99, 190, 57, 185, 152, 2, 122, 20, 86, 170, 244, 61, 165, 31, 36, 117, 109, 62, 207, 119, 205, 2, 105, 25, 141, 15, 81, 76, 230, 18, 165, 78, 189, 100, 238, 13, 234, 219, 207, 126, 167, 139, 202, 194, 157, 106, 112, 61, 224, 158, 104, 239, 201, 149, 223, 79, 226, 196, 0, 177, 23, 140, 251, 48, 154, 51, 4, 27, 156, 151, 178, 79, 216, 70, 141, 124, 249, 188, 91, 114, 206, 69, 26, 81, 176, 123, 176, 219, 121, 102, 170, 243, 27, 216, 142, 116, 141, 246, 225, 28, 196, 137, 153, 33, 14, 173, 139, 198, 127, 142, 39, 183, 224, 113, 150, 246, 18, 165, 8, 185, 30, 105, 223, 209, 71, 162, 207, 186, 8, 206, 211, 232, 249, 43, 59, 127, 42, 233, 211, 75, 5, 165, 70, 51, 101, 2, 117, 82, 91, 92, 49, 45, 169, 132, 101, 154, 91, 97, 210, 19, 238, 187, 254, 126, 87, 187, 48, 52, 2, 74, 208, 60, 151, 102, 83, 87, 157, 93, 65, 151, 48, 134, 244, 172, 112, 58, 18, 129, 87, 85, 34, 110, 21, 69, 119, 104, 76, 25, 252, 213, 130, 199, 220, 125, 8, 147, 4, 70, 88, 172, 121, 213, 232, 58, 86, 161, 182, 108, 148, 112, 77, 214, 114, 209, 153, 110, 249, 1, 155, 248, 182, 58, 129, 234, 29, 214, 15, 202, 85, 222, 7, 12, 89, 8, 207, 124, 234, 188, 212, 15, 117, 71, 128, 202, 164, 48, 120, 85, 59, 128, 234, 77, 227, 229, 124, 191, 16, 114, 41, 166, 212, 4, 84, 112, 139, 44, 68, 209, 82, 149, 13, 219, 160, 136, 150, 219, 198, 20, 159, 17, 222, 54, 40, 34, 161, 91, 40, 193, 119, 177, 190, 222, 3, 9, 90, 234, 242, 69, 141, 127, 247, 154, 227, 200, 116, 147, 107, 115, 73, 198, 159, 68, 194, 238, 146, 101, 232, 154, 226, 253, 218, 249, 5, 137, 54, 92, 115, 87, 154, 69, 56, 25, 162, 112, 239, 237, 200, 9, 172, 39, 208, 18, 146, 34, 43, 89, 82, 249, 234, 35, 41, 238, 44, 223, 196, 219, 190, 7, 240, 133, 61, 180, 175, 200, 115, 115, 18, 193, 146, 58, 138, 58, 30, 127, 101, 211, 192, 136, 163, 125, 33, 63, 120, 204, 135, 135, 83, 121, 144, 68, 157, 191, 237, 101, 84, 63, 226, 227, 122, 73, 254, 194, 104, 172, 145, 89, 215, 234, 161, 70, 36, 234, 196, 51, 193, 189, 81, 117, 56, 185, 233, 75, 158, 226, 30, 42, 89, 228, 7, 221, 208, 201, 99, 84, 217, 112, 231, 73, 227, 250, 249, 199, 4, 161, 241, 62, 21, 91, 68, 87, 252, 205, 203, 106, 33, 65, 210, 251, 71, 13, 48, 131, 59, 185, 233, 47, 1, 198, 234, 246, 48, 92, 103, 215, 114, 101, 8, 171, 70, 138, 7, 71, 18, 58, 94, 226, 145, 4, 255, 124, 210, 0, 164, 227, 194, 241, 124, 212, 155, 78, 48, 127, 183, 49, 222, 4, 191, 195, 108, 50, 191, 92, 161, 14, 130, 156, 184, 218, 15, 235, 4, 165, 17, 0, 122, 46, 115, 1, 86, 205, 149, 64, 252, 190, 54, 28, 142, 46, 18, 8, 128, 226, 58, 207, 160, 172, 67, 155, 18, 98, 187, 223, 32, 165, 87, 171, 252, 69, 229, 176, 132, 240, 73, 182, 255, 171, 199, 18, 195, 157, 165, 221, 183, 220, 98, 254, 194, 115, 105, 93, 35, 116, 148, 57, 58, 101, 158, 16, 100, 97, 245, 21, 4, 86, 234, 63, 100, 91, 122, 243, 141, 89, 205, 103, 221, 33, 137, 12, 56, 3, 255, 184, 215, 214, 142, 223, 64, 46, 144, 84, 118, 115, 79, 78, 86, 60, 172, 184, 73, 253, 105, 254, 102, 16, 49, 22, 10, 219, 26, 101, 240, 193, 56, 137, 117, 72, 85, 148, 130, 34, 51, 141, 2, 137, 142, 88, 62, 4, 27, 28, 135, 114, 224, 230, 229, 4, 90, 173, 104, 197, 43, 85, 97, 36, 173, 99, 75, 34, 121, 34, 187, 97, 158, 171, 208, 146, 83, 200, 5, 66, 45, 181, 72, 126, 79, 226, 184, 4, 33, 42, 99, 11, 89, 15, 75, 34, 193, 62, 59, 183, 98, 148, 199, 53, 4, 169, 198, 133, 156, 240, 176, 39, 51, 49, 145, 67, 123, 198, 45, 27, 19, 128, 174, 162, 168, 84, 176, 90, 23, 104, 210, 247, 133, 214, 140, 247, 228, 0, 212, 238, 161, 27, 116, 249, 0, 19, 94, 156, 221, 176, 246, 207, 82, 140, 113, 135, 149, 92, 193, 45, 45, 197, 221, 43, 175, 71, 158, 223, 209, 219, 95, 212, 240, 125, 103, 3, 225, 108, 133, 179, 59, 171, 170, 181, 119, 158, 174, 108, 238, 211, 127, 9, 3, 124, 103, 168, 216, 174, 93, 22, 119, 3, 133, 164, 93, 119, 185, 52, 251, 248, 79, 30, 44, 15, 107, 20, 248, 156, 155, 86, 147, 175, 38, 85, 110, 17, 91, 68, 154, 15, 46, 182, 112, 125, 4, 219, 164, 156, 105, 105, 208, 142, 53, 88, 147, 15, 163, 70, 237, 27, 247, 188, 162, 254, 149, 149, 92, 152, 184, 27, 189, 250, 216, 250, 169, 244, 72, 186, 121, 236, 248, 23, 198, 255, 6, 255, 188, 7, 12, 59, 54, 143, 247, 109, 132, 173, 52, 16, 235, 157, 234, 118, 60, 55, 160, 30, 36, 105, 80, 95, 121, 70, 99, 220, 24, 215, 173, 177, 3, 253, 191, 138, 188, 161, 106, 236, 199, 218, 54, 240, 240, 115, 99, 40, 5, 55, 125, 109, 238, 251, 52, 87, 210, 73, 226, 10, 176, 152, 5, 223, 254, 111, 10, 149, 158, 134, 53, 88, 1, 108, 74, 168, 102, 73, 39, 184, 52, 82, 250, 158, 219, 170, 172, 218, 129, 228, 246, 23, 87, 115, 135, 94, 5, 130, 203, 97, 76, 56, 164, 114, 71, 57, 241, 165, 4, 146, 237, 46, 80, 21, 222, 100, 45, 195, 74, 161, 157, 241, 183, 199, 70, 223, 167, 172, 227, 92, 66, 245, 171, 14, 136, 4, 50, 190, 52, 29, 194, 32, 232, 149, 59, 11, 248, 175, 0, 58, 192, 49, 122, 163, 150, 219, 89, 167, 252, 186, 231, 45, 69, 58, 172, 134, 132, 171, 66, 174, 47, 95, 169, 233, 15, 230, 81, 158, 190, 85, 223, 12, 46, 131, 51, 122, 149, 217, 69, 237, 100, 216, 220, 20, 79, 242, 50, 76, 183, 86, 56, 12, 231, 32, 129, 26, 26, 186, 63, 105, 152, 179, 194, 68, 57, 0, 124, 217, 193, 191, 47, 73, 165, 88, 153, 21, 74, 69, 227, 112, 49, 195, 44, 153, 16, 211, 228, 13, 217, 186, 122, 184, 137, 237, 204, 224, 21, 202, 182, 120, 55, 172, 154, 216, 209, 30, 209, 62, 4, 122, 31, 184, 62, 160, 238, 170, 243, 203, 189, 221, 195, 140, 136, 249, 60, 103, 84, 216, 27, 5, 199, 122, 123, 76, 212, 40, 189, 104, 138, 112, 64, 109, 56, 194, 113, 86, 95, 159, 155, 1, 34, 106, 147, 28, 186, 55, 60, 211, 160, 20, 45, 192, 220, 84, 230, 34, 126, 71, 196, 123, 148, 49, 167, 87, 51, 188, 43, 228, 86, 144, 79, 175, 81, 198, 41, 183, 126, 7, 196, 66, 138, 143, 60, 41, 188, 193, 159, 161, 75, 198, 227, 241, 84, 61, 228, 150, 51, 8, 168, 173, 222, 53, 163, 227, 46, 186, 60, 163, 90, 137, 132, 246, 83, 70, 31, 50, 100, 75, 60, 250, 90, 37, 134, 155, 89, 198, 94, 86, 89, 254, 26, 35, 66, 5, 11, 120, 198, 204, 223, 114, 121, 63, 81, 117, 247, 200, 118, 26, 181, 230, 146, 231, 66, 42, 82, 239, 155, 83, 34, 62, 39, 86, 141, 4, 5, 249, 156, 221, 29, 245, 145, 116, 160, 248, 212, 84, 107, 161, 233, 213, 92, 54, 55, 67, 176, 126, 190, 85, 82, 254, 119, 248, 0, 207, 82, 67, 3, 64, 19, 1, 164, 62, 194, 7, 252, 93, 87, 185, 160, 255, 80, 83, 20, 104, 25, 251, 145, 153, 186, 8, 250, 210, 131, 2, 67, 33, 41, 151, 178, 97, 19, 180, 180, 13, 181, 111, 252, 70, 71, 101, 223, 92, 191, 234, 8, 191, 12, 141, 180, 27, 63, 187, 130, 202, 4, 241, 42, 49, 172, 103, 220, 81, 248, 194, 232, 159, 30, 253, 130, 166, 43, 221, 190, 13, 62, 198, 237, 247, 176, 102, 172, 218, 94, 64, 39, 142, 215, 12, 213, 103, 111, 42, 251, 143, 126, 8, 135, 182, 46, 209, 65, 124, 38, 67, 74, 141, 150, 193, 118, 9, 72, 92, 24, 2, 188, 151, 233, 114, 229, 0, 174, 167, 165, 131, 234, 123, 140, 3, 6, 78, 210, 106, 228, 55, 133, 164, 75, 53, 72, 85, 192, 175, 163, 254, 231, 168, 252, 51, 126, 165, 91, 242, 95, 111, 36, 180, 195, 145, 133, 80, 125, 61, 180, 130, 79, 4, 50, 212, 106, 253, 249, 209, 28, 237, 253, 2, 190, 140, 24, 56, 46, 186, 164, 39, 168, 214, 113, 48, 114, 22, 45, 96, 178, 177, 188, 250, 215, 115, 143, 33, 79, 167, 52, 155, 57, 234, 40, 116, 10, 35, 121, 0, 40, 182, 33, 192, 162, 69, 167, 78, 243, 167, 176, 246, 243, 255, 218, 9, 137, 235, 6, 46, 64, 219, 219, 205, 37, 246, 55, 188, 96, 240, 21, 31, 41, 111, 174, 98, 165, 59, 242, 197, 239, 228, 191, 131, 202, 248, 164, 11, 181, 157, 39, 141, 183, 180, 186, 121, 228, 70, 1, 201, 175, 195, 128, 40, 146, 76, 172, 24, 75, 107, 126, 207, 96, 165, 240, 224, 235, 178, 63, 246, 40, 0, 116, 172, 186, 250, 178, 176, 17, 149, 251, 217, 129, 252, 224, 227, 126, 203, 170, 138, 164, 210, 222, 223, 156, 81, 219, 163, 89, 241, 0, 246, 98, 16, 19, 180, 181, 111, 139, 54, 103, 149, 110, 138, 195, 82, 186, 254, 112, 142, 245, 12, 45, 215, 184, 131, 81, 166, 66, 18, 11, 255, 6, 37, 62, 218, 254, 185, 69, 231, 5, 169, 159, 56, 97, 118, 214, 10, 131, 139, 102, 60, 105, 76, 209, 239, 195, 214, 47, 172, 73, 247, 51, 115, 174, 50, 29, 157, 206, 130, 210, 13, 43, 234, 183, 95, 129, 183, 0, 68, 25, 146, 252, 29, 132, 91, 140, 145, 192, 34, 61, 178, 179, 160, 74, 190, 107, 1, 132, 169, 0, 6, 63, 58, 31, 246, 53, 142, 123, 19, 218, 132, 51, 123, 35, 238, 143, 201, 4, 118, 32, 155, 217, 13, 18, 85, 164, 24, 75, 109, 116, 220, 167, 185, 189, 132, 124, 163, 168, 201, 102, 117, 218, 149, 82, 137, 36, 158, 77, 171, 169, 51, 32, 11, 88, 71, 209, 76, 105, 243, 159, 158, 248, 66, 65, 178, 9, 197, 171, 134, 36, 176, 183, 84, 184, 13, 229, 33, 30, 158, 67, 59, 226, 14, 220, 47, 95, 219, 18, 19, 110, 185, 163, 226, 9, 104, 192, 179, 201, 117, 0, 243, 172, 112, 105, 96, 218, 123, 119, 99, 168, 142, 11, 61, 153, 52, 59, 42, 42, 60, 75, 185, 101, 231, 24, 43, 58, 149, 189, 167, 95, 122, 252, 51, 5, 128, 100, 235, 170, 105, 216, 17, 49, 28, 120, 208, 83, 19, 4, 192, 96, 81, 231, 97, 218, 139, 235, 83, 65, 84, 203, 152, 84, 33, 184, 233, 43, 254, 230, 253, 142, 14, 246, 4, 197, 209, 235, 244, 87, 179, 44, 196, 195, 42, 250, 160, 48, 5, 62, 136, 177, 105, 101, 186, 156, 133, 94, 236, 127, 204, 70, 110, 70, 235, 182, 102, 66, 128, 43, 76, 215, 168, 12, 151, 169, 89, 34, 245, 159, 89, 73, 237, 110, 85, 55, 104, 23, 157, 88, 56, 40, 8, 1, 186, 210, 140, 221, 202, 227, 191, 132, 89, 146, 98, 14, 0, 211, 15, 187, 118, 190, 40, 180, 120, 91, 230, 156, 155, 66, 79, 65, 33, 87, 32, 216, 114, 60, 61, 167, 59, 36, 14, 89, 59, 167, 171, 247, 225, 173, 134, 28, 244, 250, 128, 193, 75, 54, 245, 88, 121, 189, 196, 75, 65, 239, 153, 60, 128, 7, 213, 165, 112, 50, 198, 255, 207, 132, 170, 235, 82, 77, 188, 120, 191, 37, 177, 46, 128, 212, 65, 174, 84, 59, 82, 252, 137, 40, 3, 175, 105, 153, 198, 171, 141, 15, 164, 62, 205, 174, 75, 58, 44, 140, 199, 0, 61, 223, 109, 104, 62, 134, 116, 72, 239, 26, 9, 54, 132, 143, 192, 82, 112, 47, 215, 92, 25, 159, 50, 98, 209, 156, 62, 179, 89, 92, 143, 125, 184, 249, 69, 15, 120, 164, 185, 157, 122, 120, 149, 92, 10, 70, 38, 88, 30, 170, 15, 33, 161, 162, 216, 18, 15, 2, 128, 34, 38, 45, 236, 238, 101, 101, 137, 2, 15, 58, 126, 40, 202, 207, 125, 166, 0, 85, 100, 227, 59, 197, 136, 154, 120, 95, 219, 139, 221, 216, 155, 212, 183, 176, 69, 110, 35, 116, 147, 63, 237, 67, 84, 145, 109, 219, 170, 14, 47, 219, 73, 237, 154, 88, 145, 10, 230, 207, 127, 196, 227, 82, 158, 210, 99, 98, 127, 138, 25, 220, 59, 208, 33, 159, 14, 219, 242, 147, 162, 178, 170, 115, 10, 123, 49, 59, 49, 113, 124, 96, 220, 162, 154, 52, 20, 32, 108, 200, 87, 214, 140, 224, 65, 50, 196, 37, 31, 9, 197, 196, 30, 211, 12, 194, 67, 26, 90, 240, 105, 44, 198, 73, 233, 216, 93, 13, 189, 177, 212, 36, 214, 141, 3, 43, 246, 78, 141, 85, 175, 139, 194, 139, 119, 248, 204, 34, 56, 142, 91, 116, 92, 141, 146, 232, 26, 49, 172, 56, 212, 155, 253, 192, 12, 178, 103, 52, 171, 94, 200, 48, 132, 19, 254, 254, 213, 199, 175, 191, 178, 253, 82, 70, 179, 124, 112, 192, 208, 184, 127, 138, 207, 47, 121, 217, 176, 219, 125, 104, 13, 88, 190, 65, 20, 244, 108, 128, 97, 86, 67, 194, 172, 124, 74, 79, 87, 190, 9, 3, 76, 213, 149, 136, 188, 119, 1, 103, 250, 207, 58, 24, 133, 18, 212, 134, 8, 33, 248, 233, 229, 176, 252, 166, 87, 44, 223, 81, 231, 252, 135, 178, 152, 147, 243, 244, 28, 153, 153, 34, 72, 83, 80, 112, 222, 243, 133, 242, 170, 84, 73, 97, 209, 6, 157, 198, 23, 202, 1, 162, 204, 26, 202, 201, 245, 138, 193, 217, 163, 57, 245, 108, 247, 236, 172, 229, 90, 190, 133, 95, 194, 46, 233, 125, 50, 24, 154, 248, 188, 102, 171, 7, 174, 54, 133, 93, 219, 99, 184, 107, 42, 47, 39, 95, 25, 125, 27, 6, 1, 142, 248, 37, 55, 178, 25, 206, 189, 76, 230, 41, 241, 37, 197, 24, 236, 42, 156, 245, 162, 167, 126, 145, 74, 55, 170, 190, 151, 155, 221, 141, 141, 20, 207, 2, 234, 116, 64, 199, 134, 61, 91, 210, 72, 194, 249, 185, 186, 66, 18, 35, 99, 149, 191, 72, 219, 237, 44, 178, 137, 150, 74, 68, 11, 28, 36, 249, 198, 188, 29, 132, 116, 133, 101, 21, 82, 122, 50, 219, 52, 32, 165, 240, 249, 89, 70, 12, 90, 98, 220, 164, 105, 3, 204, 61, 89, 151, 145, 251, 36, 227, 158, 124, 98, 111, 65, 229, 67, 149, 2, 149, 180, 189, 109, 50, 226, 148, 215, 128, 50, 115, 64, 200, 89, 243, 118, 224, 56, 72, 201, 146, 203, 202, 203, 113, 75, 12, 92, 72, 213, 240, 118, 222, 130, 118, 39, 78, 74, 30, 36, 16, 45, 70, 126, 110, 34, 62, 158, 113, 34, 75, 217, 9, 222, 228, 66, 225, 112, 102, 5, 10, 73, 139, 57, 236, 188, 70, 176, 101, 132, 74, 61, 31, 197, 250, 223, 98, 145, 244, 237, 149, 125, 42, 63, 215, 51, 244, 196, 138, 191, 139, 159, 137, 113, 232, 36, 139, 25, 6, 99, 114, 206, 228, 40, 224, 234, 91, 132, 80, 63, 47, 81, 123, 202, 226, 162, 248, 155, 179, 177, 109, 46, 119, 177, 61, 74, 68, 17, 30, 127, 67, 87, 72, 253, 15, 222, 31, 240, 114, 205, 5, 104, 232, 104, 41, 9, 237, 172, 250, 196, 194, 38, 109, 122, 235, 51, 29, 92, 117, 73, 239, 182, 115, 81, 71, 171, 220, 226, 228, 17, 172, 167, 179, 149, 5, 142, 168, 187, 59, 67, 146, 74, 135, 185, 6, 199, 67, 39, 196, 123, 108, 8, 150, 83, 137, 22, 71, 110, 69, 148, 45, 12, 44, 180, 225, 107, 106, 54, 186, 176, 18, 120, 127, 203, 54, 92, 191, 111, 186, 210, 91, 231, 97, 144, 102, 1, 100, 50, 25, 141, 153, 188, 29, 251, 223, 120, 213, 56, 56, 66, 8, 75, 221, 73, 55, 200, 241, 32, 146, 81, 191, 155, 212, 167, 132, 194, 212, 255, 0, 98, 163, 193, 159, 9, 191, 4, 81, 27, 48, 145, 179, 69, 190, 178, 238, 175, 212, 100, 105, 3, 246, 30, 82, 123, 16, 246, 212, 173, 197, 67, 127, 11, 65, 94, 10, 54, 172, 85, 88, 214, 219, 186, 152, 112, 83, 193, 224, 174, 107, 246, 176, 167, 35, 232, 102, 216, 112, 77, 132, 212, 146, 64, 218, 14, 9, 46, 219, 28, 130, 23, 23, 50, 20, 68, 211, 179, 27, 217, 158, 195, 209, 232, 67, 3, 20, 254, 90, 233, 162, 95, 195, 23, 231, 136, 141, 16, 163, 2, 240, 232, 38, 249, 15, 139, 34, 183, 55, 97, 93, 131, 223, 101, 253, 74, 159, 130, 182, 44, 153, 112, 233, 213, 205, 75, 97, 59, 122, 65, 198, 204, 163, 162, 144, 111, 199, 247, 132, 244, 111, 206, 45, 55, 114, 117, 124, 0, 6, 76, 173, 54, 166, 205, 229, 212, 94, 138, 62, 109, 120, 28, 234, 162, 82, 218, 124, 194, 245, 237, 206, 144, 155, 153, 211, 251, 94, 193, 10, 147, 247, 197, 170, 55, 251, 126, 154, 148, 8, 18, 255, 131, 196, 126, 166, 198, 137, 165, 87, 20, 42, 6, 83, 218, 237, 225, 211, 226, 135, 149, 3, 174, 88, 216, 227, 241, 68, 208, 112, 8, 235, 116, 37, 35, 105, 164, 84, 65, 122, 129, 229, 77, 124, 22, 209, 153, 170, 223, 136, 131, 184, 30, 146, 167, 95, 198, 60, 130, 3, 33, 183, 4, 100, 49, 247, 120, 191, 75, 248, 50, 89, 78, 186, 214, 172, 166, 38, 93, 163, 58, 160, 211, 121, 36, 98, 221, 108, 177, 154, 106, 241, 113, 63, 250, 234, 230, 168, 36, 144, 218, 95, 49, 98, 93, 55, 105, 34, 106, 37, 188, 157, 16, 252, 121, 55, 68, 247, 172, 151, 164, 236, 184, 71, 184, 161, 0, 185, 193, 191, 223, 206, 213, 224, 82, 117, 38, 98, 178, 41, 195, 85, 153, 212, 205, 184, 22, 187, 170, 97, 158, 115, 11, 82, 8, 88, 55, 183, 87, 131, 61, 128, 194, 227, 158, 135, 249, 196, 157, 141, 246, 132, 240, 151, 236, 33, 112, 148, 115, 2, 222, 74, 65, 108, 43, 94, 69, 220, 235, 243, 106, 107, 203, 170, 233, 135, 98, 35, 70, 146, 197, 41, 159, 212, 197, 11, 117, 206, 114, 43, 146, 20, 155, 246, 43, 8, 43, 107, 189, 2, 154, 243, 189, 254, 196, 217, 204, 49, 139, 221, 237, 120, 149, 125, 120, 162, 146, 253, 144, 38, 253, 226, 161, 84, 6, 159, 86, 255, 125, 153, 96, 241, 21, 191, 169, 172, 110, 70, 203, 70, 192, 15, 221, 248, 45, 11, 108, 216, 168, 240, 117, 151, 76, 106, 46, 125, 57, 116, 28, 27, 102, 246, 241, 199, 150, 54, 17, 235, 211, 181, 29, 102, 201, 175, 225, 97, 210, 68, 96, 52, 180, 89, 229, 226, 217, 221, 59, 65, 53, 108, 70, 184, 39, 44, 248, 42, 44, 148, 27, 233, 227, 77, 165, 57, 36, 23, 61, 222, 98, 191, 244, 202, 184, 7, 79, 255, 153, 171, 33, 158, 237, 140, 122, 97, 155, 104, 145, 15, 202, 27, 242, 215, 22, 30, 118, 155, 239, 80, 72, 168, 29, 185, 237, 5, 155, 27, 96, 160, 215, 14, 139, 213, 174, 52, 58, 130, 20, 45, 255, 62, 233, 95, 198, 153, 30, 111, 21, 81, 211, 208, 201, 254, 236, 239, 217, 213, 170, 239, 61, 9, 64, 170, 241, 153, 205, 148, 181, 187, 45, 155, 97, 141, 190, 195, 61, 176, 214, 122, 197, 226, 13, 23, 175, 96, 166, 204, 24, 4, 41, 99, 7, 74, 96, 189, 45, 77, 78, 120, 46, 192, 181, 133, 180, 15, 230, 24, 73, 72, 177, 116, 52, 240, 63, 196, 57, 156, 77, 192, 232, 42, 170, 82, 5, 175, 233, 166, 173, 174, 156, 177, 11, 136, 60, 245, 157, 123, 244, 52, 13, 73, 90, 129, 135, 129, 81, 203, 147, 180, 97, 28, 107, 88, 143, 13, 239, 218, 243, 92, 199, 182, 181, 129, 4, 49, 110, 31, 68, 24, 107, 75, 255, 111, 113, 9, 252, 245, 243, 19, 136, 164, 155, 9, 11, 163, 225, 52, 189, 156, 211, 3, 218, 73, 17, 253, 74, 24, 91, 211, 185, 14, 108, 171, 118, 187, 178, 109, 108, 141, 25, 204, 83, 249, 54, 115, 120, 249, 37, 179, 213, 188, 228, 190, 139, 160, 201, 219, 6, 73, 70, 36, 170, 35, 42, 199, 2, 162, 57, 25, 2, 242, 239, 29, 221, 248, 102, 203, 151, 42, 134, 58, 212, 220, 207, 183, 223, 249, 115, 164, 182, 198, 5, 75, 204, 71, 164, 157, 14, 255, 44, 178, 29, 123, 9, 0, 233, 74, 20, 129, 9, 128, 168, 125, 254, 165, 4, 150, 60, 194, 164, 249, 13, 228, 144, 81, 57, 95, 145, 189, 108, 124, 131, 16, 30, 40, 113, 49, 209, 149, 141, 1, 127, 228, 113, 244, 135, 207, 179, 125, 17, 7, 241, 52, 49, 83, 93, 210, 229, 138, 86, 136, 112, 110, 191, 141, 25, 172, 38, 235, 247, 109, 13, 171, 150, 136, 93, 233, 134, 23, 161, 129, 75, 184, 18, 112, 217, 128, 180, 254, 207, 152, 128, 234, 110, 57, 84, 219, 157, 215, 109, 117, 241, 193, 187, 214, 146, 0, 247, 204, 235, 161, 42, 108, 112, 207, 199, 26, 107, 25, 142, 46, 7, 23, 41, 90, 186, 191, 138, 47, 91, 212, 198, 182, 224, 22, 48, 7, 231, 36, 211, 20, 96, 18, 160, 19, 180, 140, 96, 183, 97, 80, 230, 219, 29, 57, 247, 102, 210, 76, 111, 210, 171, 179, 167, 75, 33, 108, 158, 151, 92, 235, 225, 159, 159, 19, 125, 215, 209, 190, 244, 201, 218, 77, 244, 135, 172, 204, 166, 221, 156, 240, 15, 126, 110, 231, 38, 242, 103, 159, 162, 23, 215, 253, 39, 220, 78, 130, 236, 73, 6, 252, 211, 108, 215, 94, 153, 3, 115, 171, 218, 17, 156, 129, 48, 77, 244, 247, 222, 120, 205, 20, 220, 216, 94, 132, 196, 243, 129, 234, 146, 30, 35, 103, 65, 247, 183, 136, 253, 74, 181, 16, 150, 175, 206, 137, 13, 147, 65, 40, 185, 251, 106, 143, 82, 12, 97, 216, 26, 164, 11, 123, 100, 172, 92, 90, 59, 48, 161, 255, 52, 89, 45, 164, 121, 74, 66, 157, 226, 112, 171, 135, 173, 99, 161, 14, 170, 201, 103, 81, 78, 12, 239, 192, 44, 155, 179, 109, 107, 184, 166, 89, 45, 223, 41, 165, 239, 85, 19, 116, 144, 184, 176, 22, 4, 99, 13, 181, 2, 4, 214, 49, 129, 32, 182, 110, 172, 85, 138, 231, 58, 159, 144, 42, 209, 238, 161, 207, 150, 19, 255, 98, 221, 121, 114, 209, 186, 32, 101, 168, 202, 231, 109, 148, 184, 112, 127, 100, 53, 70, 75, 60, 23, 127, 93, 30, 92, 87, 116, 204, 85, 73, 160, 250, 77, 129, 214, 238, 253, 132, 121, 188, 213, 84, 139, 229, 0, 219, 124, 84, 173, 66, 11, 177, 245, 120, 2, 71, 65, 241, 78, 202, 195, 13, 66, 165, 236, 97, 212, 22, 99, 6, 221, 195, 26, 208, 230, 184, 11, 14, 77, 167, 33, 186, 178, 181, 136, 117, 54, 92, 222, 250, 144, 11, 221, 69, 54, 51, 34, 66, 205, 130, 106, 162, 174, 57, 2, 165, 92, 212, 240, 164, 73, 243, 147, 56, 189, 41, 251, 225, 254, 70, 28, 70, 28, 108, 107, 228, 203, 166, 188, 59, 77, 114, 187, 2, 101, 194, 85, 212, 84, 235, 149, 231, 142, 80, 255, 152, 158, 27, 19, 48, 247, 23, 111, 40, 27, 20, 84, 12, 142, 171, 20, 197, 217, 5, 97, 209, 215, 28, 168, 76, 178, 214, 23, 29, 222, 234, 38, 39, 15, 147, 75, 84, 232, 156, 202, 233, 10, 63, 28, 230, 254, 168, 64, 116, 96, 116, 96, 129, 167, 61, 112, 112, 215, 241, 67, 96, 30, 144, 121, 249, 14, 28, 193, 202, 239, 220, 222, 30, 115, 34, 58, 190, 249, 202, 215, 90, 87, 32, 83, 178, 54, 91, 198, 155, 213, 158, 0, 230, 18, 63, 42, 100, 219, 251, 128, 160, 254, 121, 80, 181, 97, 84, 107, 138, 13, 115, 61, 241, 242, 213, 118, 111, 245, 26, 86, 166, 133, 101, 110, 191, 10, 128, 133, 161, 245, 205, 21, 1, 33, 30, 18, 115, 158, 27, 190, 234, 98, 60, 251, 57, 206, 111, 254, 111, 170, 62, 223, 147, 245, 24, 214, 120, 35, 168, 40, 98, 64, 32, 197, 163, 33, 151, 99, 126, 38, 117, 235, 255, 85, 234, 226, 168, 149, 122, 180, 1, 196, 235, 137, 191, 64, 254, 46, 183, 111, 105, 11, 125, 33, 244, 85, 148, 74, 195, 206, 15, 93, 60, 50, 170, 34, 123, 199, 199, 239, 172, 52, 37, 109, 64, 17, 214, 98, 120, 22, 225, 94, 168, 55, 118, 89, 253, 9, 51, 123, 242, 62, 201, 129, 78, 29, 185, 34, 130, 242, 46, 125, 195, 211, 54, 242, 145, 181, 98, 94, 121, 191, 22, 29, 68, 101, 106, 236, 168, 185, 35, 20, 38, 114, 109, 30, 53, 0, 136, 114, 197, 26, 176, 126, 171, 200, 1, 49, 252, 22, 22, 189, 243, 114, 193, 250, 197, 42, 9, 34, 214, 73, 209, 244, 136, 129, 168, 160, 206, 76, 156, 172, 175, 174, 195, 107, 242, 34, 224, 35, 166, 221, 94, 140, 5, 52, 10, 79, 71, 23, 2, 91, 16, 200, 131, 172, 25, 206, 249, 128, 102, 32, 212, 244, 218, 154, 215, 16, 200, 129, 26, 117, 24, 3, 154, 29, 164, 22, 105, 112, 53, 239, 154, 158, 1, 104, 48, 198, 25, 212, 85, 218, 91, 133, 40, 92, 143, 195, 131, 131, 61, 245, 50, 115, 252, 182, 217, 63, 167, 163, 144, 246, 211, 62, 5, 140, 217, 191, 249, 17, 148, 191, 43, 188, 44, 199, 173, 247, 255, 19, 122, 160, 79, 150, 90, 11, 204, 6, 9, 113, 129, 19, 79, 208, 103, 65, 240, 85, 76, 59, 176, 71, 239, 236, 150, 94, 252, 55, 48, 21, 227, 221, 2, 59, 85, 111, 116, 64, 120, 49, 58, 160, 153, 46, 17, 199, 32, 138, 38, 109, 203, 112, 205, 2, 215, 88, 165, 13, 176, 200, 87, 185, 238, 129, 197, 109, 123, 229, 18, 125, 115, 217, 203, 110, 79, 36, 94, 48, 215, 236, 190, 213, 103, 58, 96, 62, 87, 31, 106, 170, 115, 6, 214, 57, 53, 220, 237, 17, 247, 251, 8, 236, 140, 251, 110, 74, 160, 146, 14, 55, 96, 102, 223, 20, 123, 26, 36, 211, 164, 57, 72, 187, 198, 146, 92, 211, 56, 92, 212, 118, 22, 203, 246, 237, 51, 242, 124, 104, 237, 240, 248, 85, 44, 49, 195, 156, 148, 217, 61, 187, 163, 91, 186, 8, 31, 30, 125, 202, 14, 231, 29, 83, 22, 156, 179, 253, 228, 111, 49, 251, 224, 96, 231, 7, 202, 141, 108, 169, 41, 241, 221, 204, 176, 209, 90, 37, 72, 11, 139, 29, 154, 29, 122, 118, 156, 3, 134, 108, 84, 98, 33, 48, 138, 199, 77, 108, 168, 102, 229, 133, 139, 39, 212, 241, 175, 4, 158, 242, 253, 196, 188, 236, 102, 165, 166, 20, 93, 79, 4, 100, 73, 186, 243, 168, 173, 120, 82, 198, 176, 192, 168, 142, 70, 153, 151, 247, 86, 195, 208, 163, 70, 234, 35, 253, 159, 7, 205, 164, 23, 197, 212, 144, 248, 159, 106, 219, 28, 217, 17, 129, 44, 223, 44, 221, 73, 138, 237, 46, 41, 95, 44, 205, 217, 132, 136, 196, 91, 29, 128, 179, 197, 242, 136, 79, 41, 251, 117, 74, 121, 212, 234, 143, 91, 69, 95, 127, 39, 219, 206, 82, 225, 1, 136, 8, 179, 65, 221, 184, 202, 153, 13, 148, 4, 226, 109, 46, 216, 66, 115, 224, 156, 69, 223, 218, 25, 71, 213, 254, 56, 66, 106, 159, 91, 84, 88, 245, 14, 20, 4, 87, 95, 6, 32, 175, 161, 218, 168, 159, 167, 150, 92, 106, 162, 24, 219, 67, 73, 114, 7, 154, 64, 236, 233, 180, 127, 10, 127, 182, 98, 216, 34, 2, 141, 167, 107, 253, 93, 154, 85, 128, 57, 134, 185, 192, 113, 74, 214, 76, 93, 223, 90, 132, 93, 105, 245, 35, 219, 163, 114, 239, 100, 138, 143, 98, 236, 114, 34, 188, 17, 40, 0, 20, 214, 38, 103, 78, 174, 246, 184, 90, 236, 115, 223, 184, 127, 135, 54, 199, 254, 110, 142, 2, 208, 8, 208, 195, 35, 80, 235, 34, 218, 38, 43, 175, 34, 126, 38, 244, 70, 192, 94, 108, 72, 27, 147, 84, 216, 102, 110, 83, 148, 48, 108, 54, 31, 204, 193, 84, 247, 20, 44, 159, 155, 253, 181, 118, 114, 252, 22, 56, 117, 242, 24, 142, 150, 31, 142, 181, 216, 128, 113, 34, 179, 153, 40, 209, 79, 11, 74, 204, 117, 6, 221, 118, 56, 135, 146, 220, 148, 236, 15, 122, 230, 99, 235, 199, 166, 254, 75, 227, 45, 202, 100, 236, 115, 190, 89, 108, 43, 73, 141, 202, 177, 208, 198, 9, 227, 239, 92, 69, 146, 202, 199, 248, 29, 194, 159, 108, 87, 49, 196, 221, 98, 125, 247, 43, 230, 217, 60, 108, 44, 72, 142, 174, 162, 203, 179, 102, 28, 180, 90, 193, 94, 167, 182, 230, 87, 45, 142, 127, 35, 52, 69, 132, 255, 135, 133, 158, 7, 233, 128, 29, 17, 42, 206, 254, 222, 249, 158, 141, 89, 38, 211, 130, 163, 171, 254, 120, 93, 32, 138, 150, 217, 40, 136, 206, 201, 126, 82, 82, 154, 246, 99, 70, 194, 213, 124, 86, 61, 31, 178, 235, 253, 72, 238, 77, 22, 242, 133, 5, 130, 126, 175, 137, 158, 197, 169, 35, 184, 147, 87, 35, 65, 87, 180, 55, 46, 188, 130, 101, 55, 202, 199, 176, 62, 103, 233, 25, 50, 107, 18, 191, 11, 227, 106, 83, 0, 155, 202, 170, 229, 104, 103, 179, 236, 146, 46, 121, 190, 22, 225, 98, 162, 37, 236, 33, 20, 51, 194, 168, 243, 252, 65, 179, 40, 120, 217, 111, 96, 38, 55, 46, 125, 188, 180, 167, 241, 232, 104, 224, 3, 238, 50, 65, 222, 190, 145, 166, 73, 90, 156, 128, 224, 44, 22, 0, 187, 81, 15, 228, 158, 189, 113, 164, 249, 32, 236, 243, 233, 169, 101, 42, 3, 102, 8, 4, 60, 196, 46, 139, 100, 154, 50, 67, 230, 207, 105, 229, 7, 111, 97, 95, 245, 120, 121, 85, 26, 178, 153, 200, 86, 148, 155, 90, 110, 244, 89, 192, 207, 106, 213, 253, 62, 241, 222, 148, 121, 46, 210, 75, 79, 98, 15, 171, 206, 164, 51, 235, 115, 216, 119, 210, 90, 238, 152, 32, 196, 39, 120, 153, 254, 64, 251, 110, 35, 171, 158, 161, 56, 86, 84, 0, 64, 151, 9, 152, 174, 10, 231, 91, 139, 22, 63, 54, 206, 33, 167, 44, 114, 203, 130, 160, 178, 85, 100, 66, 79, 59, 221, 3, 163, 96, 147, 69, 207, 152, 20, 7, 164, 169, 110, 22, 204, 72, 39, 222, 24, 198, 46, 240, 62, 18, 105, 133, 220, 151, 82, 130, 251, 75, 83, 180, 57, 197, 45, 74, 71, 3, 8, 91, 157, 155, 96, 107, 99, 74, 173, 21, 69, 131, 202, 64, 70, 29, 154, 119, 71, 168, 22, 97, 31, 235, 80, 162, 134, 109, 250, 7, 130, 249, 86, 164, 110, 200, 140, 217, 42, 133, 162, 29, 180, 52, 66, 190, 150, 250, 46, 205, 240, 164, 233, 191, 88, 33, 154, 132, 154, 185, 12, 124, 41, 9, 222, 172, 221, 114, 100, 215, 178, 52, 91, 118, 42, 229, 207, 254, 49, 179, 79, 159, 24, 86, 246, 195, 6, 192, 124, 230, 36, 217, 177, 192, 27, 30, 45, 57, 19, 87, 196, 53, 70, 30, 126, 120, 196, 45, 168, 218, 195, 80, 200, 56, 84, 1, 11, 14, 163, 230, 121, 244, 229, 244, 69, 196, 115, 142, 44, 157, 124, 66, 143, 130, 141, 211, 251, 136, 133, 112, 83, 162, 119, 66, 212, 173, 100, 11, 213, 215, 3, 129, 75, 183, 196, 237, 135, 209, 240, 59, 160, 185, 232, 84, 79, 210, 151, 125, 62, 204, 9, 89, 255, 45, 98, 162, 216, 185, 240, 117, 222, 158, 186, 96, 219, 17, 4, 119, 238, 170, 105, 173, 73, 242, 131, 94, 97, 197, 52, 72, 59, 1, 114, 6, 210, 243, 15, 152, 196, 60, 243, 28, 12, 175, 74, 8, 169, 7, 57, 15, 65, 242, 189, 113, 29, 9, 53, 153, 194, 142, 56, 33, 112, 218, 17, 191, 75, 128, 208, 227, 101, 223, 182, 200, 41, 72, 155, 189, 7, 106, 85, 243, 193, 250, 98, 168, 248, 200, 100, 203, 52, 31, 238, 76, 231, 147, 238, 150, 142, 116, 251, 154, 238, 36, 95, 91, 210, 116, 189, 209, 110, 100, 236, 33, 131, 115, 209, 61, 184, 74, 199, 101, 145, 128, 183, 60, 97, 179, 210, 206, 215, 197, 5, 131, 206, 11, 173, 112, 86, 63, 36, 166, 47, 205, 144, 89, 185, 182, 2, 47, 20, 29, 234, 248, 97, 246, 204, 239, 43, 175, 204, 100, 219, 224, 114, 37, 122, 201, 171, 59, 13, 121, 120, 33, 224, 128, 71, 254, 55, 49, 188, 48, 97, 5, 164, 145, 55, 115, 254, 236, 28, 244, 2, 151, 79, 71, 218, 159, 148, 243, 241, 88, 182, 95, 23, 233, 136, 247, 250, 98, 222, 232, 148, 58, 232, 161, 93, 1, 162, 185, 82, 42, 71, 111, 158, 111, 216, 152, 158, 26, 130, 194, 95, 145, 213, 18, 88, 169, 109, 85, 71, 163, 4, 4, 206, 44, 160, 96, 4, 0, 144, 201, 73, 18, 98, 1, 162, 13, 179, 58, 240, 139, 88, 84, 144, 192, 69, 226, 83, 108, 92, 183, 74, 78, 168, 223, 208, 70, 205, 219, 220, 5, 207, 147, 220, 239, 130, 88, 226, 58, 221, 237, 214, 164, 49, 196, 127, 3, 141, 124, 238, 3, 146, 217, 4, 60, 178, 213, 64, 67, 225, 253, 209, 8, 89, 82, 104, 78, 191, 104, 82, 1, 209, 224, 31, 72, 57, 193, 128, 183, 38, 239, 91, 49, 219, 12, 235, 141, 128, 134, 62, 181, 241, 111, 32, 133, 6, 35, 154, 197, 37, 17, 70, 68, 219, 163, 132, 86, 242, 45, 166, 245, 120, 83, 13, 47, 135, 74, 62, 199, 242, 135, 78, 183, 129, 104, 190, 95, 214, 100, 5, 30, 207, 152, 122, 242, 227, 96, 211, 240, 43, 161, 23, 212, 216, 129, 140, 160, 222, 30, 121, 100, 189, 62, 160, 244, 18, 187, 78, 154, 55, 7, 214, 76, 176, 86, 93, 124, 192, 101, 65, 150, 250, 227, 88, 68, 55, 161, 224, 237, 77, 201, 135, 63, 196, 59, 50, 248, 219, 160, 228, 31, 149, 153, 102, 226, 122, 138, 192, 177, 111, 16, 241, 107, 13, 15, 152, 13, 101, 46, 171, 54, 58, 25, 97, 23, 112, 185, 100, 139, 17, 40, 147, 47, 221, 173, 16, 120, 12, 149, 250, 246, 81, 99, 149, 10, 159, 1, 81, 12, 235, 229, 251, 199, 211, 210, 85, 86, 189, 54, 122, 172, 197, 86, 235, 112, 178, 76, 40, 6, 130, 120, 18, 101, 245, 244, 235, 19, 227, 103, 74, 170, 152, 245, 84, 148, 48, 23, 29, 248, 218, 169, 238, 86, 116, 2, 45, 180, 136, 175, 235, 150, 124, 30, 54, 106, 155, 110, 124, 169, 167, 36, 78, 208, 225, 156, 98, 161, 76, 219, 247, 85, 90, 252, 160, 236, 220, 71, 7, 174, 175, 37, 166, 102, 25, 114, 181, 46, 208, 231, 216, 24, 46, 77, 215, 137, 218, 144, 45, 96, 18, 64, 238, 186, 188, 98, 228, 210, 8, 238, 171, 124, 77, 149, 93, 11, 205, 128, 46, 99, 34, 178, 193, 114, 28, 177, 25, 37, 228, 213, 213, 89, 123, 27, 165, 173, 236, 146, 6, 219, 231, 115, 162, 171, 183, 101, 32, 123, 234, 121, 9, 13, 230, 136, 120, 208, 201, 210, 27, 176, 174, 84, 183, 62, 59, 86, 142, 51, 4, 206, 131, 224, 69, 151, 13, 131, 106, 119, 217, 149, 226, 173, 214, 240, 62, 191, 19, 157, 161, 39, 38, 147, 124, 242, 254, 207, 108, 135, 51, 43, 224, 159, 115, 193, 23, 111, 81, 115, 166, 78, 109, 195, 1, 128, 175, 177, 157, 177, 56, 145, 236, 90, 50, 187, 57, 156, 209, 10, 71, 155, 52, 3, 196, 0, 155, 174, 213, 35, 54, 191, 8, 49, 207, 245, 229, 210, 81, 134, 102, 186, 1, 58, 75, 221, 13, 230, 159, 206, 176, 36, 106, 81, 10, 122, 217, 63, 225, 15, 8, 161, 221, 242, 75, 124, 26, 58, 17, 203, 0, 109, 102, 58, 251, 24, 40, 240, 95, 188, 111, 136, 74, 130, 160, 235, 237, 91, 251, 95, 0, 68, 174, 106, 107, 172, 153, 93, 31, 67, 80, 1, 187, 153, 144, 243, 177, 87, 224, 202, 98, 51, 111, 248, 79, 222, 190, 191, 107, 206, 47, 224, 228, 74, 205, 32, 59, 18, 147, 153, 183, 125, 134, 89, 0, 39, 164, 95, 67, 239, 138, 91, 70, 249, 172, 59, 198, 186, 3, 18, 117, 39, 97, 120, 16, 167, 230, 89, 155, 76, 1, 210, 25, 185, 161, 15, 43, 219, 195, 181, 208, 8, 59, 226, 133, 59, 121, 118, 174, 127, 153, 221, 40, 98, 115, 206, 152, 240, 76, 112, 205, 138, 121, 55, 189, 71, 145, 45, 165, 181, 232, 88, 81, 61, 238, 181, 187, 36, 84, 84, 237, 248, 90, 164, 255, 227, 192, 218, 244, 49, 93, 189, 93, 35, 249, 1, 128, 7, 137, 61, 107, 213, 91, 85, 28, 178, 9, 35, 43, 219, 209, 27, 192, 83, 226, 131, 0, 41, 225, 158, 191, 17, 76, 49, 31, 239, 219, 70, 108, 181, 76, 174, 241, 138, 81, 254, 168, 36, 197, 93, 36, 145, 158, 241, 64, 237, 250, 87, 231, 174, 161, 167, 106, 117, 84, 217, 33, 63, 109, 157, 21, 151, 107, 131, 28, 251, 223, 18, 193, 20, 230, 28, 108, 4, 84, 228, 153, 163, 84, 1, 108, 93, 227, 238, 127, 250, 135, 38, 237, 194, 186, 173, 2, 43, 33, 66, 45, 252, 233, 122, 100, 201, 229, 72, 27, 151, 221, 209, 54, 193, 75, 77, 34, 27, 64, 153, 236, 218, 114, 4, 162, 207, 40, 146, 53, 185, 168, 172, 135, 111, 154, 40, 209, 172, 209, 106, 181, 162, 161, 170, 89, 0, 220, 193, 24, 8, 14, 105, 202, 234, 123, 20, 236, 216, 54, 206, 70, 177, 41, 112, 122, 162, 120, 109, 87, 178, 57, 171, 162, 210, 159, 5, 48, 13, 40, 194, 33, 137, 164, 156, 89, 189, 216, 189, 180, 136, 173, 211, 23, 250, 28, 25, 137, 155, 54, 255, 173, 30, 110, 179, 145, 33, 106, 229, 99, 31, 116, 72, 89, 247, 134, 111, 225, 65, 98, 120, 160, 161, 164, 46, 102, 42, 42, 155, 135, 171, 204, 33, 222, 45, 43, 196, 192, 73, 219, 86, 30, 40, 178, 115, 142, 131, 121, 240, 73, 68, 212, 158, 132, 35, 90, 0, 60, 70, 4, 119, 4, 155, 9, 161, 99, 245, 80, 1, 188, 76, 63, 251, 102, 252, 53, 194, 92, 149, 49, 165, 124, 216, 83, 208, 142, 212, 170, 49, 143, 246, 176, 175, 82, 148, 46, 203, 77, 44, 91, 176, 86, 216, 186, 176, 114, 193, 66, 161, 78, 113, 156, 25, 144, 216, 187, 42, 146, 10, 169, 132, 61, 90, 84, 3, 106, 149, 106, 5, 121, 185, 126, 198, 179, 244, 179, 87, 169, 130, 118, 215, 20, 80, 211, 30, 236, 178, 57, 168, 104, 159, 160, 95, 137, 159, 164, 31, 165, 210, 175, 66, 103, 1, 155, 26, 21, 106, 52, 188, 137, 27, 18, 77, 32, 185, 131, 39, 12, 56, 36, 218, 121, 201, 231, 21, 134, 24, 168, 153, 250, 83, 201, 170, 14, 49, 152, 19, 100, 46, 184, 193, 19, 225, 146, 85, 36, 166, 63, 127, 211, 107, 53, 122, 79, 28, 255, 219, 221, 169, 143, 122, 150, 111, 132, 245, 69, 248, 77, 70, 75, 161, 209, 239, 169, 200, 177, 115, 49, 61, 34, 48, 138, 54, 198, 153, 36, 19, 178, 28, 153, 169, 152, 40, 75, 157, 208, 146, 254, 248, 49, 76, 191, 240, 122, 242, 155, 114, 168, 124, 59, 200, 243, 25, 46, 51, 77, 163, 92, 154, 183, 66, 155, 111, 69, 208, 230, 174, 162, 172, 232, 231, 86, 117, 150, 150, 108, 74, 137, 5, 210, 166, 21, 185, 192, 12, 187, 247, 146, 241, 157, 0, 71, 248, 79, 60, 101, 165, 89, 192, 236, 246, 2, 130, 153, 210, 4, 169, 112, 47, 87, 87, 30, 143, 202, 83, 112, 49, 154, 176, 236, 177, 182, 223, 49, 125, 187, 51, 161, 143, 80, 32, 68, 42, 46, 71, 203, 48, 90, 155, 0, 92, 69, 28, 13, 155, 38, 162, 178, 202, 57, 17, 70, 141, 93, 44, 194, 0, 142, 74, 215, 48, 195, 125, 99, 247, 233, 230, 13, 37, 11, 238, 76, 45, 128, 116, 74, 122, 200, 167, 107, 219, 201, 185, 252, 86, 122, 225, 59, 242, 15, 83, 80, 253, 63, 169, 9, 246, 52, 73, 154, 201, 169, 131, 249, 228, 192, 192, 157, 5, 160, 8, 193, 82, 214, 245, 255, 7, 4, 37, 171, 129, 136, 191, 25, 90, 57, 167, 31, 251, 59, 16, 241, 179, 86, 203, 30, 11, 143, 194, 181, 118, 28, 193, 246, 162, 8, 84, 24, 204, 15, 181, 18, 202, 208, 64, 61, 177, 14, 120, 161, 252, 65, 212, 48, 187, 54, 204, 114, 160, 227, 62, 79, 219, 222, 239, 74, 218, 71, 165, 110, 92, 93, 36, 117, 73, 105, 55, 73, 120, 19, 185, 30, 129, 144, 194, 42, 235, 104, 202, 215, 236, 242, 246, 205, 3, 89, 187, 127, 185, 89, 214, 80, 56, 111, 12, 76, 70, 47, 222, 139, 37, 114, 215, 114, 191, 183, 31, 156, 0, 1, 238, 19, 30, 80, 139, 34, 1, 68, 93, 38, 44, 18, 189, 23, 182, 7, 176, 83, 17, 120, 113, 47, 102, 238, 93, 128, 90, 197, 104, 126, 178, 44, 112, 232, 179, 144, 206, 100, 146, 23, 39, 145, 129, 85, 124, 121, 72, 166, 248, 157, 82, 23, 2, 74, 53, 10, 206, 29, 2, 114, 24, 120, 215, 97, 64, 185, 48, 98, 220, 138, 91, 255, 40, 126, 247, 127, 74, 224, 211, 28, 5, 250, 105, 132, 225, 139, 157, 158, 229, 226, 82, 215, 95, 18, 225, 77, 187, 126, 175, 110, 140, 128, 154, 234, 240, 78, 17, 220, 237, 248, 91, 180, 204, 144, 234, 160, 23, 1, 145, 248, 15, 221, 29, 151, 50, 154, 94, 69, 94, 237, 102, 213, 232, 199, 187, 153, 164, 45, 146, 121, 204, 253, 25, 140, 102, 236, 16, 232, 49, 74, 40, 97, 248, 185, 20, 76, 44, 166, 176, 239, 226, 169, 64, 128, 102, 196, 26, 161, 252, 75, 156, 43, 32, 86, 180, 133, 142, 156, 213, 157, 126, 72, 4, 30, 111, 251, 212, 249, 69, 175, 128, 116, 115, 218, 128, 21, 248, 189, 50, 56, 240, 186, 202, 24, 57, 167, 131, 5, 246, 40, 106, 50, 126, 134, 45, 43, 34, 246, 156, 189, 20, 135, 231, 252, 90, 14, 49, 61, 53, 84, 95, 240, 49, 249, 193, 158, 225, 52, 100, 11, 13, 157, 199, 216, 89, 216, 22, 250, 129, 252, 152, 78, 42, 204, 54, 222, 219, 104, 95, 146, 248, 32, 143, 226, 19, 152, 20, 207, 78, 116, 141, 212, 154, 123, 40, 197, 157, 197, 136, 30, 99, 81, 16, 141, 77, 122, 38, 164, 69, 7, 121, 10, 102, 66, 24, 158, 120, 55, 5, 93, 67, 216, 216, 76, 242, 211, 22, 187, 61, 39, 107, 227, 239, 23, 149, 186, 164, 185, 99, 91, 146, 218, 183, 70, 196, 98, 109, 69, 52, 71, 165, 66, 226, 39, 86, 209, 254, 132, 127, 27, 89, 98, 161, 63, 126, 72, 7, 0, 140, 81, 61, 203, 60, 66, 248, 187, 75, 187, 200, 137, 60, 219, 120, 169, 78, 146, 99, 255, 72, 60, 83, 26, 134, 249, 210, 46, 109, 122, 147, 34, 198, 100, 254, 67, 213, 20, 144, 0, 77, 204, 67, 215, 73, 82, 65, 31, 232, 121, 250, 104, 179, 129, 148, 91, 156, 61, 179, 86, 79, 83, 57, 105, 49, 37, 172, 106, 231, 183, 127, 37, 105, 47, 121, 219, 126, 121, 39, 225, 134, 241, 69, 234, 22, 254, 165, 244, 117, 199, 98, 45, 108, 190, 25, 78, 224, 128, 84, 211, 233, 190, 173, 71, 47, 179, 81, 49, 67, 92, 86, 48, 114, 50, 139, 112, 17, 220, 199, 233, 5, 191, 142, 62, 197, 3, 156, 13, 226, 155, 6, 223, 199, 197, 244, 117, 89, 25, 5, 102, 206, 219, 117, 31, 120, 191, 62, 64, 127, 207, 207, 55, 59, 67, 163, 91, 120, 163, 91, 235, 84, 70, 134, 99, 163, 73, 168, 57, 71, 82, 106, 224, 71, 245, 12, 241, 197, 226, 75, 205, 74, 100, 21, 106, 208, 18, 40, 108, 166, 138, 80, 38, 175, 218, 79, 53, 86, 135, 245, 162, 166, 126, 37, 35, 240, 26, 222, 159, 126, 107, 13, 233, 143, 113, 25, 140, 156, 117, 62, 236, 228, 159, 82, 20, 15, 25, 172, 13, 224, 14, 100, 122, 49, 27, 243, 180, 84, 190, 165, 252, 72, 53, 70, 132, 95, 64, 125, 14, 87, 33, 218, 119, 115, 184, 41, 88, 51, 212, 186, 198, 193, 109, 116, 93, 217, 54, 81, 206, 186, 163, 195, 240, 30, 199, 191, 101, 120, 157, 155, 124, 185, 44, 88, 44, 207, 234, 128, 194, 122, 79, 81, 82, 253, 204, 189, 13, 232, 223, 149, 135, 51, 40, 143, 82, 157, 152, 233, 159, 13, 11, 181, 57, 137, 66, 18, 220, 3, 246, 24, 104, 39, 66, 64, 71, 195, 76, 246, 134, 133, 194, 115, 142, 140, 86, 13, 0, 176, 101, 6, 28, 47, 202, 134, 30, 61, 252, 21, 123, 206, 183, 40, 98, 172, 242, 206, 104, 131, 162, 220, 95, 10, 26, 96, 58, 139, 165, 242, 66, 44, 68, 35, 183, 130, 23, 221, 82, 23, 19, 245, 187, 10, 15, 71, 81, 233, 106, 41, 247, 197, 73, 186, 77, 80, 136, 181, 111, 58, 132, 77, 48, 161, 182, 10, 81, 153, 114, 93, 83, 133, 19, 232, 83, 216, 74, 209, 115, 27, 102, 190, 210, 221, 9, 232, 105, 137, 65, 181, 29, 103, 90, 197, 135, 2, 11, 207, 49, 229, 62, 209, 32, 22, 173, 29, 230, 199, 155, 120, 57, 38, 13, 200, 9, 128, 49, 71, 4, 22, 199, 188, 2, 250, 111, 100, 0, 49, 25, 22, 42, 95, 81, 206, 161, 39, 158, 202, 161, 49, 232, 105, 97, 159, 3, 92, 61, 111, 59, 91, 151, 106, 5, 53, 48, 131, 72, 20, 120, 164, 236, 154, 235, 252, 66, 69, 170, 17, 7, 208, 1, 103, 73, 53, 133, 17, 219, 115, 148, 159, 219, 87, 179, 117, 4, 80, 114, 203, 249, 35, 41, 240, 126, 174, 34, 163, 172, 5, 97, 17, 52, 140, 183, 242, 51, 198, 38, 227, 27, 144, 6, 185, 164, 137, 112, 215, 112, 28, 242, 63, 225, 169, 110, 207, 223, 8, 137, 221, 2, 242, 31, 182, 216, 126, 9, 2, 70, 76, 229, 175, 128, 184, 177, 2, 84, 8, 84, 25, 145, 231, 225, 134, 1, 163, 44, 126, 189, 63, 182, 32, 152, 175, 237, 236, 162, 212, 251, 89, 116, 225, 224, 233, 77, 207, 214, 102, 180, 84, 231, 217, 220, 251, 33, 239, 104, 167, 167, 152, 251, 1, 13, 101, 155, 121, 240, 231, 193, 126, 234, 31, 140, 107, 199, 136, 217, 209, 234, 161, 255, 191, 69, 43, 37, 41, 122, 193, 191, 198, 246, 148, 182, 179, 204, 139, 183, 249, 231, 212, 108, 2, 214, 98, 177, 161, 161, 34, 214, 193, 127, 170, 2, 94, 142, 148, 113, 182, 183, 117, 106, 46, 142, 185, 38, 121, 87, 209, 5, 131, 55, 242, 145, 210, 138, 161, 162, 100, 180, 54, 104, 69, 53, 45, 74, 39, 102, 56, 112, 227, 115, 23, 61, 90, 208, 16, 152, 99, 27, 64, 134, 245, 251, 215, 234, 59, 247, 3, 46, 62, 33, 220, 3, 221, 156, 32, 222, 44, 209, 6, 76, 232, 161, 236, 77, 204, 126, 42, 121, 204, 70, 108, 116, 220, 131, 149, 54, 10, 45, 132, 16, 110, 219, 19, 1, 181, 89, 66, 18, 237, 112, 13, 152, 229, 108, 27, 192, 138, 239, 245, 202, 112, 76, 234, 127, 178, 168, 94, 21, 186, 131, 2, 198, 153, 202, 251, 136, 232, 91, 90, 247, 35, 174, 3, 194, 202, 116, 174, 98, 163, 240, 104, 139, 61, 17, 216, 248, 103, 170, 68, 96, 236, 62, 244, 248, 146, 155, 62, 80, 153, 102, 3, 193, 23, 159, 22, 71, 142, 167, 166, 228, 153, 47, 221, 253, 217, 67, 3, 7, 125, 246, 146, 156, 241, 170, 111, 77, 96, 211, 145, 78, 33, 167, 85, 250, 4, 241, 213, 49, 176, 64, 205, 25, 114, 177, 174, 238, 251, 4, 115, 154, 124, 221, 31, 95, 0, 197, 164, 150, 83, 97, 219, 125, 93, 76, 28, 60, 56, 63, 214, 124, 131, 196, 251, 201, 216, 8, 100, 191, 128, 118, 237, 137, 124, 97, 28, 205, 38, 155, 232, 242, 6, 4, 203, 120, 234, 36, 185, 149, 50, 106, 39, 164, 93, 160, 29, 7, 212, 117, 180, 87, 216, 255, 162, 78, 75, 109, 21, 172, 148, 105, 149, 115, 23, 66, 149, 230, 80, 100, 206, 218, 212, 55, 149, 79, 164, 147, 254, 195, 239, 188, 4, 241, 38, 246, 138, 196, 247, 43, 17, 213, 233, 78, 100, 116, 48, 138, 255, 112, 195, 155, 143, 149, 36, 90, 24, 21, 152, 100, 56, 208, 213, 165, 240, 24, 77, 18, 207, 246, 64, 57, 95, 127, 180, 21, 242, 152, 151, 43, 207, 171, 40, 217, 42, 72, 229, 227, 83, 110, 46, 147, 159, 142, 117, 176, 24, 246, 129, 59, 125, 156, 125, 68, 213, 155, 153, 184, 123, 232, 154, 47, 186, 233, 222, 245, 167, 142, 156, 96, 147, 2, 16, 33, 201, 188, 10, 110, 229, 197, 44, 10, 149, 108, 224, 242, 68, 243, 177, 247, 72, 30, 95, 35, 224, 142, 231, 201, 117, 44, 139, 215, 17, 228, 144, 157, 56, 245, 205, 171, 223, 84, 205, 222, 42, 45, 251, 234, 131, 137, 254, 13, 210, 10, 65, 212, 20, 245, 197, 137, 76, 89, 223, 231, 81, 14, 14, 89, 99, 166, 172, 65, 152, 169, 105, 119, 47, 32, 204, 59, 84, 91, 15, 128, 253, 71, 82, 149, 177, 148, 200, 220, 153, 125, 65, 151, 205, 162, 68, 153, 171, 254, 56, 76, 82, 163, 33, 152, 199, 26, 56, 168, 51, 68, 133, 28, 168, 160, 73, 121, 239, 219, 68, 148, 32, 60, 125, 89, 157, 219, 248, 9, 113, 226, 55, 76, 194, 111, 220, 204, 240, 226, 224, 58, 175, 177, 41, 213, 137, 218, 15, 6, 88, 54, 56, 165, 104, 162, 3, 78, 122, 252, 109, 184, 24, 105, 100, 140, 139, 106, 162, 99, 196, 207, 44, 188, 52, 209, 78, 185, 174, 253, 22, 121, 21, 120, 140, 107, 154, 75, 93, 236, 238, 221, 172, 21, 144, 253, 247, 129, 31, 189, 28, 28, 100, 140, 21, 211, 79, 50, 32, 254, 102, 242, 174, 45, 191, 205, 100, 57, 204, 86, 17, 50, 50, 252, 19, 156, 0, 62, 185, 153, 205, 15, 248, 221, 161, 61, 247, 70, 36, 177, 98, 79, 20, 241, 1, 211, 201, 141, 3, 237, 79, 50, 227, 100, 149, 237, 22, 222, 223, 139, 92, 43, 195, 94, 130, 188, 84, 144, 46, 204, 204, 229, 178, 215, 54, 207, 68, 140, 20, 167, 189, 66, 255, 44, 107, 145, 150, 135, 38, 33, 106, 48, 93, 249, 125, 130, 50, 241, 8, 43, 234, 204, 12, 248, 151, 254, 53, 112, 9, 50, 166, 93, 135, 55, 150, 194, 173, 242, 0, 156, 149, 247, 97, 231, 193, 134, 132, 237, 155, 95, 136, 219, 61, 201, 85, 152, 76, 167, 99, 92, 248, 204, 237, 150, 229, 186, 51, 248, 242, 16, 107, 99, 132, 218, 69, 35, 90, 95, 124, 4, 213, 34, 246, 93, 220, 241, 14, 2, 128, 62, 105, 214, 119, 56, 157, 207, 191, 165, 216, 185, 84, 102, 6, 240, 128, 92, 83, 182, 10, 205, 34, 42, 222, 80, 27, 229, 138, 155, 8, 102, 55, 107, 174, 75, 148, 239, 6, 232, 240, 0, 50, 108, 171, 83, 152, 162, 142, 200, 163, 4, 31, 113, 14, 96, 48, 2, 65, 200, 10, 145, 192, 125, 41, 119, 250, 101, 63, 111, 171, 206, 226, 105, 169, 198, 50, 83, 197, 121, 228, 99, 206, 239, 148, 222, 197, 76, 89, 70, 34, 63, 5, 186, 88, 91, 231, 197, 192, 202, 73, 245, 235, 46, 56, 202, 47, 76, 205, 103, 146, 68, 49, 133, 87, 26, 144, 231, 11, 51, 77, 236, 199, 93, 128, 235, 52, 185, 161, 149, 208, 27, 41, 233, 125, 145, 81, 204, 144, 247, 242, 227, 208, 88, 157, 247, 73, 4, 142, 202, 250, 119, 255, 114, 149, 66, 96, 236, 204, 10, 58, 188, 220, 240, 83, 93, 252, 74, 240, 34, 212, 164, 145, 32, 146, 130, 162, 190, 193, 40, 101, 175, 144, 209, 39, 110, 249, 244, 76, 49, 70, 229, 65, 40, 137, 75, 83, 38, 209, 139, 62, 190, 91, 154, 40, 30, 89, 174, 119, 52, 99, 46, 87, 15, 165, 112, 233, 125, 220, 33, 216, 234, 37, 55, 142, 2, 150, 75, 242, 82, 175, 217, 76, 49, 63, 197, 151, 181, 28, 125, 194, 75, 84, 176, 9, 109, 215, 202, 83, 146, 128, 70, 252, 157, 99, 73, 121, 4, 5, 119, 8, 53, 89, 248, 15, 149, 91, 213, 5, 85, 100, 122, 200, 130, 40, 68, 187, 155, 115, 56, 17, 14, 244, 45, 119, 169, 20, 177, 187, 115, 158, 237, 20, 194, 61, 0, 185, 19, 148, 145, 81, 240, 61, 167, 168, 49, 21, 60, 114, 109, 96, 225, 166, 124, 236, 18, 93, 86, 61, 21, 132, 58, 109, 227, 68, 63, 249, 100, 70, 58, 41, 124, 182, 158, 103, 53, 90, 80, 143, 10, 117, 60, 88, 162, 50, 247, 74, 208, 39, 36, 212, 106, 131, 123, 72, 160, 4, 138, 229, 144, 120, 231, 2, 169, 17, 205, 83, 60, 243, 87, 7, 27, 170, 245, 156, 226, 74, 219, 9, 46, 200, 234, 137, 88, 71, 187, 53, 94, 37, 141, 206, 14, 11, 241, 189, 81, 116, 189, 125, 245, 239, 30, 68, 111, 134, 119, 160, 33, 217, 19, 93, 97, 11, 83, 10, 243, 161, 174, 165, 237, 179, 60, 123, 54, 100, 98, 128, 107, 16, 116, 120, 123, 97, 245, 238, 229, 25, 102, 241, 84, 220, 18, 208, 125, 20, 27, 241, 196, 22, 37, 70, 114, 251, 24, 66, 33, 122, 35, 146, 236, 244, 221, 103, 138, 144, 250, 193, 49, 177, 6, 83, 196, 6, 27, 103, 203, 53, 198, 111, 157, 100, 16, 82, 218, 27, 69, 203, 200, 126, 132, 154, 73, 67, 165, 212, 60, 15, 157, 150, 205, 71, 17, 227, 81, 78, 65, 212, 217, 102, 30, 229, 121, 97, 232, 198, 246, 81, 77, 191, 229, 201, 95, 171, 142, 88, 156, 30, 153, 247, 193, 30, 254, 191, 80, 25, 113, 178, 225, 55, 66, 169, 253, 72, 67, 74, 74, 139, 76, 33, 200, 31, 133, 67, 69, 48, 240, 93, 49, 121, 102, 219, 238, 237, 79, 98, 243, 172, 138, 114, 172, 154, 66, 99, 28, 91, 8, 36, 220, 136, 2, 218, 195, 94, 214, 171, 48, 92, 84, 86, 199, 139, 240, 201, 34, 37, 22, 201, 215, 73, 252, 119, 204, 117, 176, 150, 177, 202, 135, 190, 72, 120, 47, 167, 69, 180, 162, 245, 138, 104, 212, 218, 95, 234, 54, 228, 21, 12, 48, 5, 202, 49, 132, 24, 190, 207, 170, 227, 172, 231, 169, 224, 15, 1, 3, 1, 198, 130, 107, 250, 200, 26, 177, 235, 205, 31, 76, 151, 250, 80, 153, 58, 173, 17, 24, 67, 136, 108, 203, 4, 150, 87, 78, 39, 178, 36, 203, 211, 245, 102, 245, 150, 91, 66, 111, 208, 152, 56, 34, 31, 55, 215, 49, 48, 72, 204, 117, 105, 107, 61, 108, 177, 176, 50, 199, 115, 41, 143, 238, 62, 108, 191, 187, 209, 126, 44, 98, 247, 76, 50, 129, 154, 239, 225, 138, 226, 251, 137, 10, 198, 71, 253, 129, 139, 244, 25, 186, 89, 96, 184, 71, 145, 181, 252, 4, 210, 72, 89, 149, 212, 153, 37, 175, 70, 131, 151, 136, 176, 104, 106, 246, 252, 132, 132, 52, 25, 67, 207, 103, 48, 136, 2, 117, 230, 62, 167, 249, 98, 158, 156, 106, 106, 91, 202, 83, 113, 154, 219, 37, 40, 98, 221, 179, 49, 0, 10, 118, 124, 61, 60, 128, 168, 108, 137, 252, 164, 31, 224, 1, 109, 247, 101, 125, 222, 37, 132, 202, 183, 164, 212, 65, 250, 107, 223, 108, 60, 10, 21, 161, 207, 226, 117, 212, 176, 239, 229, 132, 63, 175, 228, 219, 134, 146, 85, 243, 93, 149, 76, 84, 190, 205, 107, 37, 88, 5, 238, 97, 107, 215, 108, 164, 23, 194, 186, 87, 44, 88, 185, 222, 51, 125, 207, 51, 218, 149, 139, 145, 216, 72, 253, 10, 199, 29, 187, 222, 140, 245, 138, 85, 9, 101, 33, 230, 81, 196, 84, 62, 26, 49, 108, 135, 86, 14, 77, 181, 177, 216, 154, 7, 21, 28, 205, 155, 225, 254, 219, 110, 76, 77, 34, 77, 109, 137, 217, 136, 133, 193, 21, 145, 188, 197, 227, 231, 113, 150, 78, 46, 141, 180, 37, 190, 84, 232, 87, 252, 24, 224, 131, 108, 172, 19, 253, 22, 251, 73, 188, 230, 93, 139, 154, 118, 55, 251, 43, 157, 191, 113, 36, 252, 51, 242, 112, 57, 189, 251, 255, 73, 157, 0, 115, 136, 75, 251, 184, 169, 26, 106, 12, 29, 143, 196, 112, 65, 242, 66, 129, 243, 221, 145, 175, 182, 215, 195, 147, 175, 1, 110, 149, 70, 23, 158, 6, 137, 169, 71, 130, 185, 11, 183, 147, 110, 147, 120, 141, 249, 163, 33, 191, 28, 75, 175, 35, 248, 150, 251, 122, 114, 244, 210, 191, 186, 176, 188, 176, 174, 230, 89, 132, 176, 169, 16, 45, 202, 210, 231, 116, 132, 241, 165, 250, 74, 26, 186, 126, 140, 135, 22, 196, 100, 82, 114, 39, 103, 55, 207, 74, 43, 141, 32, 127, 144, 206, 131, 197, 243, 22, 95, 81, 76, 239, 137, 137, 224, 181, 208, 38, 37, 44, 146, 149, 172, 216, 159, 61, 45, 182, 85, 243, 6, 255, 28, 43, 0, 16, 204, 97, 4, 215, 147, 181, 188, 44, 144, 27, 44, 67, 100, 225, 102, 207, 36, 81, 132, 152, 174, 228, 191, 193, 213, 181, 51, 22, 239, 96, 224, 102, 231, 27, 249, 81, 200, 6, 160, 109, 111, 103, 41, 114, 84, 44, 197, 30, 17, 149, 138, 221, 10, 241, 240, 232, 253, 105, 25, 175, 209, 124, 126, 176, 210, 173, 122, 37, 156, 5, 5, 53, 228, 3, 163, 150, 223, 45, 74, 250, 254, 228, 98, 240, 202, 133, 94, 55, 154, 232, 50, 61, 149, 144, 137, 222, 222, 243, 171, 53, 175, 98, 254, 107, 192, 242, 208, 127, 246, 36, 179, 33, 190, 26, 42, 21, 71, 184, 138, 79, 70, 8, 91, 175, 77, 245, 30, 196, 215, 217, 116, 211, 4, 205, 52, 208, 170, 98, 192, 219, 80, 7, 204, 240, 65, 165, 243, 33, 33, 7, 114, 125, 42, 39, 149, 112, 115, 54, 106, 46, 21, 181, 253, 139, 14, 77, 27, 96, 49, 252, 35, 51, 154, 88, 77, 65, 248, 30, 174, 157, 15, 115, 145, 88, 71, 45, 60, 222, 30, 163, 249, 206, 150, 177, 153, 75, 229, 177, 38, 31, 224, 128, 208, 194, 159, 162, 169, 249, 199, 56, 70, 38, 38, 86, 180, 97, 34, 44, 158, 254, 0, 112, 44, 200, 29, 92, 50, 150, 143, 222, 112, 217, 55, 162, 21, 16, 142, 227, 214, 254, 163, 125, 52, 196, 159, 206, 114, 78, 59, 169, 197, 68, 126, 112, 155, 115, 129, 181, 138, 225, 68, 200, 60, 94, 21, 30, 79, 199, 72, 52, 233, 229, 195, 194, 107, 61, 168, 154, 56, 164, 248, 101, 252, 170, 212, 203, 24, 197, 175, 243, 176, 83, 117, 202, 185, 123, 249, 16, 164, 30, 104, 225, 91, 93, 153, 177, 44, 64, 246, 254, 86, 218, 95, 73, 125, 144, 77, 74, 97, 55, 6, 1, 38, 115, 153, 84, 231, 140, 21, 156, 192, 186, 136, 54, 165, 109, 100, 219, 19, 202, 49, 188, 84, 180, 109, 184, 216, 127, 113, 255, 38, 115, 74, 24, 144, 186, 167, 62, 103, 42, 25, 168, 89, 124, 77, 149, 139, 156, 241, 240, 117, 30, 78, 161, 188, 193, 64, 9, 134, 68, 149, 146, 182, 86, 44, 80, 217, 54, 198, 0, 93, 179, 221, 132, 160, 242, 207, 168, 146, 120, 252, 85, 141, 186, 65, 139, 42, 206, 72, 233, 51, 132, 36, 164, 143, 76, 77, 47, 97, 1, 130, 111, 123, 7, 15, 162, 83, 6, 245, 46, 102, 56, 42, 246, 25, 106, 94, 97, 241, 101, 177, 182, 170, 30, 110, 108, 19, 176, 84, 3, 201, 194, 184, 34, 9, 203, 247, 130, 98, 140, 67, 83, 128, 59, 147, 77, 127, 84, 137, 176, 169, 36, 60, 174, 99, 152, 227, 13, 117, 163, 137, 251, 96, 186, 151, 54, 94, 146, 111, 101, 230, 247, 4, 56, 90, 247, 108, 127, 215, 132, 98, 49, 196, 202, 52, 174, 144, 138, 140, 158, 182, 231, 86, 220, 5, 242, 92, 6, 54, 0, 143, 115, 249, 76, 204, 81, 82, 28, 2, 144, 135, 213, 75, 197, 33, 203, 130, 35, 133, 184, 140, 105, 48, 111, 45, 199, 115, 92, 6, 111, 237, 0, 199, 53, 96, 151, 212, 194, 145, 7, 220, 177, 246, 170, 145, 158, 78, 203, 29, 204, 72, 98, 227, 92, 53, 210, 239, 204, 161, 104, 64, 156, 56, 116, 35, 247, 33, 81, 30, 60, 41, 236, 117, 211, 175, 107, 158, 182, 42, 134, 232, 121, 182, 10, 48, 208, 77, 119, 183, 169, 244, 204, 204, 98, 58, 180, 162, 4, 138, 12, 147, 24, 5, 184, 95, 168, 136, 183, 203, 100, 113, 49, 206, 206, 31, 55, 43, 139, 10, 9, 198, 138, 68, 196, 224, 178, 209, 42, 34, 34, 210, 200, 189, 23, 213, 199, 111, 243, 239, 78, 1, 183, 141, 152, 15, 72, 136, 165, 6, 144, 221, 182, 187, 90, 92, 233, 18, 93, 141, 252, 138, 224, 195, 159, 185, 151, 134, 87, 26, 34, 102, 176, 239, 247, 123, 75, 127, 18, 18, 67, 226, 3, 86, 208, 126, 221, 190, 247, 228, 236, 203, 103, 159, 44, 221, 187, 198, 180, 14, 81, 178, 251, 142, 213, 108, 148, 5, 241, 15, 102, 67, 170, 127, 232, 48, 18, 48, 33, 38, 239, 173, 25, 179, 15, 115, 19, 145, 170, 108, 47, 79, 225, 222, 29, 35, 163, 248, 238, 39, 57, 103, 176, 222, 200, 18, 56, 85, 22, 52, 204, 75, 89, 72, 139, 49, 141, 224, 30, 87, 203, 145, 246, 214, 7, 15, 195, 39, 101, 83, 90, 123, 36, 139, 226, 0, 181, 117, 162, 21, 242, 254, 125, 96, 133, 90, 190, 11, 66, 124, 233, 7, 128, 21, 30, 152, 206, 199, 11, 153, 145, 147, 128, 17, 133, 217, 51, 90, 56, 132, 211, 18, 115, 63, 76, 138, 4, 230, 156, 9, 44, 154, 251, 46, 106, 118, 90, 237, 29, 234, 182, 226, 54, 208, 55, 63, 16, 56, 213, 117, 209, 40, 197, 61, 78, 70, 246, 70, 143, 26, 111, 89, 210, 129, 227, 94, 196, 251, 254, 194, 92, 137, 61, 150, 126, 15, 192, 32, 70, 4, 174, 40, 12, 86, 35, 174, 127, 172, 203, 249, 44, 70, 79, 112, 225, 17, 223, 248, 231, 46, 7, 126, 73, 164, 120, 69, 158, 98, 232, 137, 60, 229, 206, 189, 82, 93, 99, 97, 233, 108, 116, 7, 207, 131, 56, 210, 100, 212, 35, 228, 20, 255, 107, 238, 192, 131, 111, 15, 241, 0, 138, 184, 118, 243, 84, 224, 235, 0, 251, 19, 208, 174, 201, 16, 59, 221, 254, 40, 81, 239, 183, 239, 135, 9, 186, 5, 134, 87, 186, 90, 173, 224, 208, 243, 199, 179, 107, 250, 190, 255, 149, 54, 168, 115, 40, 250, 25, 66, 216, 32, 80, 24, 173, 33, 248, 114, 40, 55, 106, 79, 36, 213, 92, 183, 101, 241, 100, 240, 133, 4, 223, 46, 19, 114, 204, 172, 193, 6, 151, 114, 179, 10, 148, 188, 77, 215, 115, 84, 156, 68, 244, 117, 116, 202, 178, 59, 174, 245, 6, 1, 230, 210, 61, 94, 191, 210, 247, 160, 235, 39, 240, 78, 91, 223, 187, 1, 207, 222, 50, 86, 181, 253, 146, 246, 102, 38, 145, 227, 53, 205, 20, 132, 47, 242, 38, 94, 13, 105, 171, 210, 118, 241, 98, 139, 73, 213, 16, 2, 131, 70, 147, 29, 199, 104, 165, 236, 126, 201, 62, 74, 247, 244, 22, 255, 50, 206, 235, 34, 225, 128, 180, 175, 125, 115, 148, 232, 228, 151, 122, 221, 58, 53, 168, 29, 33, 205, 94, 219, 69, 229, 213, 242, 240, 19, 111, 77, 174, 20, 174, 135, 48, 46, 94, 191, 49, 89, 254, 216, 23, 167, 185, 187, 146, 210, 164, 16, 27, 83, 162, 192, 186, 251, 94, 236, 119, 124, 44, 215, 194, 230, 189, 159, 176, 165, 13, 158, 171, 247, 177, 8, 161, 119, 101, 172, 114, 146, 89, 147, 82, 88, 168, 168, 19, 120, 99, 65, 135, 106, 45, 70, 210, 166, 178, 175, 203, 40, 34, 101, 49, 106, 198, 104, 110, 22, 30, 79, 213, 220, 100, 150, 127, 188, 204, 34, 105, 117, 60, 191, 185, 125, 254, 157, 169, 243, 96, 240, 233, 81, 89, 205, 59, 83, 166, 34, 243, 196, 165, 147, 82, 9, 200, 80, 87, 1, 23, 85, 32, 109, 36, 128, 102, 236, 65, 80, 159, 113, 130, 188, 25, 207, 202, 74, 96, 59, 248, 7, 36, 246, 156, 40, 174, 216, 184, 205, 143, 228, 17, 181, 117, 177, 91, 0, 98, 3, 21, 168, 161, 177, 245, 48, 2, 36, 209, 252, 82, 47, 131, 9, 210, 136, 145, 119, 93, 246, 110, 56, 223, 161, 64, 64, 6, 29, 187, 154, 63, 217, 36, 71, 133, 233, 110, 22, 168, 21, 246, 223, 104, 28, 146, 69, 244, 65, 184, 40, 225, 205, 158, 193, 109, 212, 101, 242, 135, 68, 193, 52, 240, 34, 39, 18, 187, 139, 204, 139, 151, 169, 185, 183, 129, 186, 237, 81, 113, 81, 102, 142, 104, 42, 112, 91, 128, 134, 130, 70, 205, 55, 56, 21, 106, 206, 60, 156, 35, 19, 141, 107, 2, 180, 20, 0, 220, 124, 218, 86, 109, 79, 220, 232, 105, 34, 139, 79, 117, 1, 159, 220, 17, 185, 42, 17, 152, 160, 253, 214, 95, 12, 204, 20, 75, 103, 113, 204, 112, 57, 236, 96, 200, 48, 179, 131, 213, 96, 83, 20, 211, 22, 55, 208, 230, 167, 210, 223, 108, 203, 79, 100, 97, 123, 89, 104, 237, 241, 126, 165, 232, 178, 224, 246, 252, 144, 253, 232, 177, 50, 182, 215, 82, 27, 154, 136, 13, 111, 128, 153, 192, 172, 75, 208, 239, 43, 205, 210, 55, 11, 214, 215, 128, 144, 244, 11, 97, 75, 173, 82, 152, 132, 50, 197, 157, 244, 21, 163, 195, 93, 239, 156, 122, 46, 148, 214, 132, 62, 58, 40, 18, 174, 97, 98, 215, 114, 89, 180, 178, 39, 112, 159, 240, 65, 173, 87, 76, 131, 46, 189, 1, 126, 116, 206, 215, 236, 117, 110, 94, 158, 78, 80, 20, 25, 236, 153, 250, 199, 44, 181, 242, 152, 226, 137, 224, 35, 222, 64, 207, 238, 143, 104, 247, 188, 190, 162, 247, 209, 230, 146, 69, 81, 111, 13, 246, 78, 191, 93, 115, 114, 45, 70, 156, 218, 75, 25, 84, 243, 11, 205, 185, 205, 85, 16, 191, 105, 156, 88, 206, 19, 236, 47, 160, 58, 9, 107, 176, 87, 126, 153, 250, 211, 11, 94, 61, 129, 254, 169, 206, 141, 73, 165, 246, 189, 59, 54, 205, 5, 60, 42, 170, 131, 46, 216, 4, 119, 2, 1, 1, 110, 226, 242, 119, 135, 205, 80, 205, 202, 85, 133, 240, 140, 175, 179, 248, 112, 77, 197, 30, 249, 135, 54, 78, 244, 225, 211, 201, 178, 102, 31, 75, 154, 228, 155, 198, 9, 170, 0, 115, 161, 15, 205, 231, 240, 71, 237, 20, 246, 131, 131, 106, 205, 176, 221, 180, 177, 249, 233, 172, 219, 246, 224, 98, 119, 72, 98, 30, 119, 93, 28, 76, 67, 179, 196, 207, 207, 108, 162, 7, 0, 175, 148, 225, 58, 107, 251, 114, 0, 50, 131, 237, 66, 45, 216, 91, 26, 157, 88, 75, 114, 92, 171, 25, 238, 135, 143, 213, 171, 28, 15, 31, 52, 61, 193, 80, 249, 133, 143, 112, 254, 64, 57, 166, 223, 182, 64, 240, 243, 60, 207, 145, 236, 239, 152, 213, 100, 158, 20, 183, 104, 246, 141, 47, 239, 122, 240, 185, 68, 116, 69, 236, 43, 248, 3, 131, 22, 51, 155, 150, 1, 231, 138, 8, 220, 116, 107, 36, 195, 168, 139, 177, 181, 97, 182, 231, 205, 53, 186, 34, 226, 101, 168, 184, 252, 145, 249, 113, 145, 163, 121, 75, 87, 253, 205, 227, 101, 190, 206, 218, 8, 57, 46, 81, 167, 229, 235, 173, 135, 187, 132, 246, 216, 192, 238, 102, 203, 22, 119, 71, 56, 36, 135, 219, 178, 94, 191, 127, 98, 184, 60, 240, 187, 144, 133, 73, 82, 180, 13, 211, 18, 46, 12, 176, 20, 249, 229, 229, 150, 144, 220, 181, 254, 223, 25, 123, 248, 15, 36, 160, 170, 77, 65, 1, 250, 157, 30, 11, 111, 133, 143, 193, 49, 35, 168, 217, 166, 16, 37, 4, 91, 160, 242, 205, 241, 125, 201, 3, 90, 229, 106, 149, 202, 217, 67, 58, 87, 104, 79, 233, 183, 250, 126, 11, 197, 180, 29, 161, 20, 73, 206, 252, 121, 20, 47, 178, 137, 34, 51, 15, 194, 231, 141, 78, 53, 33, 223, 246, 220, 182, 85, 152, 52, 125, 240, 144, 95, 33, 210, 118, 242, 86, 34, 171, 243, 228, 179, 206, 110, 168, 91, 39, 36, 226, 130, 241, 251, 216, 207, 141, 200, 0, 51, 111, 122, 235, 34, 219, 226, 102, 240, 52, 54, 136, 22, 75, 234, 207, 40, 13, 125, 66, 148, 54, 243, 127, 86, 160, 97, 250, 216, 13, 56, 89, 58, 191, 166, 182, 153, 63, 184, 195, 11, 150, 42, 22, 11, 248, 109, 153, 17, 60, 85, 46, 227, 158, 27, 221, 249, 237, 230, 101, 45, 9, 16, 201, 26, 129, 72, 35, 117, 26, 160, 138, 10, 136, 61, 214, 166, 86, 1, 9, 247, 247, 31, 232, 250, 67, 106, 216, 55, 0, 128, 98, 11, 95, 140, 129, 83, 93, 196, 48, 187, 124, 140, 249, 79, 113, 165, 164, 53, 21, 34, 136, 118, 71, 219, 78, 55, 162, 125, 159, 36, 245, 244, 109, 96, 78, 103, 217, 91, 236, 120, 154, 12, 160, 170, 148, 23, 224, 242, 47, 251, 8, 65, 102, 220, 41, 239, 53, 115, 29, 98, 205, 212, 102, 173, 144, 223, 46, 163, 7, 176, 178, 123, 10, 19, 165, 34, 6, 232, 65, 114, 165, 243, 156, 115, 76, 203, 29, 27, 3, 117, 253, 248, 10, 172, 205, 214, 77, 182, 120, 145, 7, 61, 46, 45, 101, 6, 48, 232, 141, 70, 205, 177, 228, 61, 73, 59, 15, 236, 17, 66, 173, 76, 15, 181, 40, 171, 154, 3, 64, 197, 128, 128, 229, 60, 76, 8, 211, 97, 237, 105, 148, 78, 160, 11, 93, 233, 210, 45, 63, 99, 86, 116, 182, 242, 130, 129, 1, 142, 211, 219, 19, 5, 98, 84, 6, 42, 69, 233, 218, 72, 194, 167, 82, 35, 46, 105, 205, 72, 89, 58, 95, 205, 124, 87, 158, 199, 9, 196, 15, 71, 24, 130, 86, 110, 85, 113, 43, 7, 234, 121, 198, 48, 26, 102, 242, 19, 145, 62, 36, 173, 119, 5, 46, 137, 50, 155, 200, 186, 111, 49, 171, 91, 34, 35, 233, 245, 210, 211, 5, 75, 124, 96, 79, 51, 109, 191, 26, 64, 196, 44, 150, 124, 210, 126, 180, 236, 56, 164, 245, 126, 48, 236, 146, 201, 233, 187, 155, 129, 177, 61, 144, 202, 50, 104, 23, 74, 228, 72, 90, 10, 174, 92, 177, 195, 98, 20, 160, 41, 102, 10, 179, 100, 178, 254, 201, 159, 72, 59, 121, 64, 12, 26, 161, 119, 154, 163, 174, 107, 30, 119, 175, 222, 101, 243, 6, 94, 132, 252, 86, 197, 46, 15, 215, 42, 191, 63, 37, 93, 208, 107, 91, 48, 47, 121, 192, 1, 120, 127, 160, 148, 217, 246, 255, 154, 149, 247, 63, 208, 27, 217, 252, 96, 60, 87, 223, 206, 139, 230, 225, 100, 11, 206, 192, 132, 103, 221, 110, 6, 87, 103, 65, 69, 99, 101, 175, 226, 63, 70, 176, 178, 124, 181, 84, 110, 48, 238, 196, 128, 21, 142, 86, 149, 191, 142, 255, 228, 23, 173, 218, 214, 25, 215, 144, 52, 98, 6, 76, 133, 99, 153, 181, 199, 134, 108, 201, 96, 200, 163, 14, 195, 183, 135, 8, 150, 160, 38, 68, 131, 32, 69, 61, 72, 191, 172, 105, 98, 203, 220, 165, 253, 168, 57, 197, 150, 120, 144, 220, 67, 54, 21, 228, 225, 208, 12, 182, 243, 90, 23, 246, 124, 167, 181, 117, 109, 125, 117, 48, 5, 227, 106, 164, 163, 75, 29, 144, 119, 206, 135, 65, 101, 93, 82, 244, 44, 46, 184, 216, 14, 174, 23, 143, 246, 137, 225, 21, 7, 246, 9, 206, 157, 112, 19, 248, 113, 180, 131, 219, 38, 212, 187, 233, 103, 6, 91, 130, 127, 213, 115, 199, 6, 234, 164, 70, 237, 190, 184, 187, 244, 53, 145, 164, 223, 75, 92, 150, 195, 141, 246, 39, 156, 137, 111, 216, 1, 73, 188, 50, 229, 222, 90, 46, 105, 27, 214, 162, 68, 12, 86, 58, 206, 161, 136, 111, 219, 229, 244, 23, 43, 164, 49, 123, 252, 186, 74, 130, 191, 137, 243, 126, 159, 226, 135, 94, 95, 239, 170, 92, 116, 173, 125, 27, 132, 228, 151, 123, 126, 192, 226, 65, 237, 22, 236, 150, 178, 226, 24, 64, 0, 110, 155, 52, 90, 88, 37, 125, 236, 99, 169, 225, 169, 26, 62, 126, 133, 216, 40, 143, 172, 68, 171, 93, 140, 137, 240, 6, 173, 219, 26, 253, 152, 87, 96, 65, 246, 115, 63, 193, 254, 236, 177, 75, 153, 205, 247, 49, 201, 84, 251, 222, 117, 59, 135, 194, 130, 52, 186, 43, 136, 157, 60, 67, 253, 86, 19, 11, 51, 44, 242, 175, 242, 163, 214, 182, 124, 138, 98, 85, 108, 213, 156, 154, 7, 0, 183, 183, 9, 34, 20, 29, 43, 180, 132, 75, 168, 168, 117, 142, 226, 43, 180, 219, 176, 31, 13, 253, 251, 154, 111, 33, 51, 117, 5, 96, 35, 142, 235, 188, 234, 233, 154, 94, 218, 24, 20, 164, 44, 236, 68, 4, 58, 20, 202, 64, 53, 139, 26, 224, 133, 9, 255, 128, 176, 131, 100, 115, 46, 33, 215, 108, 87, 4, 195, 75, 233, 211, 157, 4, 119, 181, 4, 129, 185, 134, 72, 248, 99, 92, 71, 204, 74, 18, 38, 106, 213, 6, 148, 110, 40, 99, 187, 200, 232, 108, 71, 169, 232, 174, 44, 191, 253, 5, 167, 69, 114, 75, 238, 193, 251, 232, 97, 188, 23, 105, 31, 146, 101, 106, 79, 64, 62, 201, 83, 60, 133, 111, 105, 65, 51, 78, 201, 190, 241, 97, 181, 2, 208, 150, 186, 123, 236, 35, 174, 174, 141, 31, 212, 81, 28, 98, 88, 208, 226, 113, 206, 120, 52, 144, 211, 17, 236, 129, 230, 220, 116, 11, 21, 7, 43, 224, 169, 77, 21, 171, 50, 245, 94, 124, 101, 169, 156, 173, 17, 65, 157, 229, 211, 69, 9, 180, 171, 180, 144, 88, 141, 247, 194, 76, 198, 208, 216, 15, 250, 68, 126, 200, 85, 46, 151, 209, 96, 108, 238, 193, 87, 42, 157, 18, 175, 199, 93, 219, 152, 170, 221, 210, 138, 184, 250, 71, 239, 230, 204, 51, 55, 125, 13, 98, 90, 235, 100, 93, 62, 249, 99, 31, 75, 225, 206, 186, 178, 104, 174, 164, 102, 66, 40, 85, 204, 195, 228, 107, 228, 18, 99, 251, 225, 159, 140, 243, 112, 95, 67, 81, 131, 20, 150, 128, 143, 249, 124, 176, 242, 5, 235, 63, 62, 175, 18, 57, 161, 125, 137, 148, 127, 20, 143, 0, 174, 109, 141, 82, 92, 216, 238, 90, 116, 76, 148, 176, 192, 118, 131, 116, 196, 40, 221, 73, 250, 87, 45, 60, 161, 37, 159, 53, 171, 236, 195, 122, 35, 247, 23, 193, 88, 16, 154, 40, 69, 113, 144, 58, 105, 1, 119, 59, 148, 245, 35, 186, 218, 199, 23, 157, 180, 120, 205, 150, 194, 161, 96, 182, 228, 4, 192, 177, 33, 116, 87, 191, 107, 138, 236, 106, 28, 238, 240, 44, 175, 230, 104, 59, 12, 136, 11, 236, 106, 119, 28, 167, 149, 52, 129, 153, 29, 61, 145, 31, 206, 253, 219, 64, 236, 213, 151, 152, 40, 172, 94, 240, 148, 58, 188, 97, 80, 174, 255, 113, 225, 82, 231, 73, 5, 138, 75, 94, 69, 168, 172, 224, 251, 203, 191, 53, 103, 24, 80, 63, 247, 210, 88, 233, 212, 60, 89, 149, 192, 181, 31, 187, 95, 2, 4, 62, 126, 89, 22, 145, 144, 92, 139, 38, 34, 36, 141, 93, 89, 22, 33, 139, 206, 224, 255, 28, 239, 183, 15, 25, 136, 69, 110, 90, 143, 111, 108, 34, 78, 4, 176, 217, 231, 1, 203, 235, 94, 109, 70, 205, 111, 253, 129, 111, 121, 215, 122, 35, 53, 99, 126, 73, 195, 154, 147, 197, 24, 128, 168, 43, 83, 253, 63, 128, 117, 112, 237, 255, 114, 231, 178, 221, 195, 169, 221, 215, 130, 153, 216, 249, 20, 19, 220, 185, 229, 97, 114, 142, 21, 244, 192, 181, 61, 137, 251, 191, 189, 246, 156, 147, 97, 36, 79, 193, 70, 159, 30, 144, 129, 206, 147, 87, 253, 248, 16, 99, 141, 191, 83, 144, 139, 34, 156, 46, 139, 115, 70, 139, 67, 78, 92, 133, 172, 52, 28, 107, 134, 45, 119, 216, 254, 172, 71, 97, 65, 246, 25, 98, 242, 135, 224, 68, 35, 101, 26, 85, 174, 47, 73, 47, 50, 122, 180, 70, 223, 19, 217, 221, 132, 57, 54, 199, 69, 128, 248, 168, 142, 236, 173, 106, 67, 87, 107, 17, 164, 177, 166, 139, 144, 172, 116, 81, 108, 161, 222, 15, 60, 66, 238, 232, 234, 55, 96, 255, 159, 117, 174, 235, 36, 113, 119, 220, 148, 226, 51, 252, 68, 61, 120, 67, 187, 223, 118, 105, 89, 144, 83, 229, 115, 133, 144, 209, 117, 108, 157, 103, 66, 174, 0, 66, 242, 184, 16, 216, 248, 89, 125, 64, 177, 13, 81, 245, 242, 227, 30, 77, 7, 40, 7, 131, 187, 156, 176, 112, 118, 28, 183, 24, 97, 147, 67, 41, 173, 94, 178, 72, 60, 113, 234, 79, 147, 86, 131, 164, 107, 220, 215, 194, 246, 63, 172, 35, 110, 83, 243, 44, 232, 113, 230, 219, 197, 70, 147, 24, 123, 130, 158, 22, 92, 95, 188, 126, 163, 81, 39, 233, 86, 124, 148, 200, 198, 212, 162, 77, 64, 41, 174, 84, 51, 85, 2, 111, 92, 6, 180, 217, 248, 230, 77, 242, 145, 17, 57, 226, 63, 148, 248, 43, 118, 156, 245, 66, 196, 73, 37, 157, 82, 223, 51, 135, 67, 54, 98, 52, 194, 103, 228, 74, 77, 250, 165, 192, 150, 16, 193, 148, 181, 56, 113, 102, 122, 194, 4, 64, 208, 161, 9, 209, 10, 160, 56, 147, 208, 57, 72, 215, 54, 66, 134, 183, 216, 99, 179, 117, 108, 139, 141, 147, 13, 131, 93, 238, 165, 81, 123, 12, 105, 199, 34, 169, 211, 111, 0, 119, 97, 11, 123, 26, 30, 31, 124, 236, 32, 218, 152, 117, 217, 117, 175, 35, 62, 171, 189, 42, 161, 63, 212, 31, 126, 188, 175, 94, 47, 61, 43, 139, 89, 220, 120, 245, 48, 151, 194, 35, 72, 97, 3, 50, 177, 33, 234, 186, 12, 133, 39, 68, 218, 31, 58, 236, 238, 49, 154, 6, 174, 143, 5, 165, 102, 95, 195, 67, 166, 105, 78, 9, 22, 87, 2, 148, 151, 197, 37, 163, 210, 208, 66, 14, 206, 25, 209, 123, 139, 12, 31, 137, 55, 241, 158, 221, 108, 156, 240, 3, 184, 116, 184, 30, 228, 236, 171, 104, 223, 172, 158, 228, 167, 147, 210, 172, 134, 68, 134, 28, 55, 14, 12, 196, 205, 56, 232, 126, 214, 42, 53, 48, 30, 100, 31, 45, 63, 4, 255, 11, 35, 140, 83, 213, 173, 131, 130, 99, 197, 242, 64, 37, 25, 216, 130, 166, 138, 123, 136, 9, 142, 140, 62, 147, 223, 253, 196, 227, 125, 110, 110, 112, 111, 109, 93, 12, 119, 59, 246, 45, 213, 27, 186, 201, 249, 151, 239, 125, 101, 131, 252, 0, 104, 213, 170, 15, 202, 79, 168, 228, 200, 19, 55, 194, 165, 91, 228, 44, 88, 69, 126, 114, 229, 44, 16, 122, 113, 130, 24, 40, 113, 172, 151, 53, 226, 18, 132, 183, 26, 30, 22, 123, 139, 10, 190, 49, 30, 179, 84, 90, 247, 27, 95, 93, 162, 61, 212, 214, 180, 202, 30, 97, 162, 219, 17, 26, 69, 173, 201, 224, 109, 220, 198, 28, 148, 34, 78, 20, 147, 121, 51, 23, 187, 16, 121, 89, 13, 78, 97, 32, 180, 0, 35, 81, 209, 41, 157, 220, 229, 170, 203, 159, 219, 177, 149, 225, 138, 208, 163, 176, 67, 13, 155, 165, 9, 53, 244, 210, 117, 172, 249, 34, 180, 189, 139, 188, 114, 247, 63, 86, 141, 194, 131, 79, 119, 216, 150, 72, 50, 29, 51, 157, 80, 112, 200, 143, 132, 232, 7, 145, 113, 53, 168, 9, 247, 246, 60, 176, 127, 70, 132, 197, 245, 150, 77, 6, 144, 251, 131, 164, 137, 212, 70, 68, 63, 90, 38, 62, 133, 201, 129, 114, 223, 195, 69, 134, 123, 174, 0, 54, 156, 217, 222, 17, 55, 125, 85, 97, 135, 133, 28, 93, 137, 225, 133, 66, 101, 27, 196, 174, 180, 71, 162, 118, 136, 18, 72, 14, 192, 150, 86, 50, 188, 136, 227, 54, 107, 100, 224, 90, 154, 169, 58, 242, 230, 79, 48, 139, 176, 147, 18, 232, 30, 102, 5, 178, 87, 71, 13, 218, 204, 19, 252, 26, 239, 37, 251, 14, 125, 33, 45, 251, 95, 77, 120, 32, 131, 218, 102, 166, 116, 21, 108, 234, 118, 9, 66, 203, 73, 134, 176, 14, 68, 97, 151, 227, 70, 142, 179, 104, 103, 29, 108, 194, 133, 104, 129, 241, 67, 193, 111, 246, 180, 134, 217, 152, 8, 154, 43, 144, 131, 27, 116, 100, 116, 75, 106, 96, 62, 150, 119, 143, 60, 75, 104, 174, 164, 20, 133, 192, 31, 164, 186, 91, 14, 177, 162, 119, 76, 49, 6, 149, 89, 173, 28, 208, 190, 234, 213, 4, 240, 55, 66, 171, 39, 92, 60, 176, 253, 162, 179, 53, 151, 146, 38, 98, 127, 162, 42, 237, 209, 108, 168, 169, 216, 15, 146, 159, 48, 112, 195, 220, 233, 161, 75, 61, 0, 18, 18, 178, 204, 187, 240, 99, 81, 95, 197, 220, 83, 123, 52, 86, 195, 172, 26, 215, 129, 29, 126, 126, 106, 48, 118, 244, 159, 29, 16, 31, 172, 246, 196, 160, 240, 43, 208, 177, 167, 156, 84, 170, 69, 159, 26, 78, 182, 152, 1, 90, 204, 149, 131, 35, 149, 218, 107, 9, 24, 255, 114, 3, 157, 132, 95, 109, 114, 121, 138, 31, 59, 48, 84, 61, 76, 42, 55, 156, 160, 242, 12, 90, 115, 99, 40, 195, 64, 143, 116, 10, 125, 221, 91, 28, 154, 239, 197, 172, 226, 159, 125, 128, 47, 8, 30, 139, 141, 80, 89, 190, 33, 22, 135, 221, 191, 222, 127, 22, 113, 237, 150, 146, 135, 209, 231, 132, 69, 61, 29, 129, 126, 73, 15, 149, 11, 90, 233, 227, 137, 231, 168, 79, 248, 251, 85, 170, 141, 186, 187, 12, 193, 35, 233, 169, 114, 85, 122, 226, 217, 194, 210, 236, 65, 224, 251, 168, 60, 247, 187, 125, 5, 92, 182, 254, 62, 78, 40, 165, 82, 31, 241, 247, 35, 161, 129, 12, 33, 37, 49, 59, 21, 160, 204, 25, 22, 37, 206, 205, 159, 37, 145, 131, 158, 19, 55, 41, 32, 155, 127, 185, 201, 53, 75, 171, 188, 27, 141, 48, 245, 70, 51, 78, 220, 199, 196, 101, 196, 214, 155, 227, 76, 141, 16, 10, 232, 224, 103, 31, 84, 65, 213, 17, 147, 235, 57, 121, 128, 144, 130, 156, 225, 65, 39, 160, 79, 183, 216, 148, 82, 229, 63, 235, 12, 159, 60, 168, 252, 249, 93, 147, 165, 128, 61, 212, 87, 243, 196, 109, 129, 14, 188, 122, 200, 45, 144, 254, 176, 114, 2, 135, 167, 121, 83, 214, 57, 200, 138, 220, 102, 123, 140, 198, 157, 165, 51, 247, 33, 178, 138, 15, 224, 254, 90, 217, 138, 78, 32, 13, 214, 172, 162, 11, 194, 162, 185, 162, 163, 126, 152, 196, 179, 1, 140, 108, 217, 93, 222, 159, 174, 16, 215, 25, 182, 164, 112, 154, 188, 40, 48, 19, 231, 126, 141, 136, 230, 63, 166, 130, 117, 53, 75, 9, 231, 74, 114, 214, 54, 78, 108, 155, 221, 191, 56, 216, 139, 37, 82, 96, 74, 236, 63, 110, 100, 123, 67, 111, 212, 128, 124, 178, 92, 40, 172, 121, 12, 175, 56, 194, 254, 32, 80, 63, 55, 24, 136, 184, 238, 166, 27, 102, 221, 232, 16, 90, 49, 211, 202, 225, 25, 212, 120, 189, 138, 204, 134, 22, 4, 118, 54, 196, 103, 185, 104, 143, 98, 193, 162, 57, 194, 224, 228, 84, 28, 73, 192, 37, 245, 159, 209, 186, 53, 14, 151, 73, 69, 161, 220, 243, 192, 69, 232, 200, 35, 189, 250, 3, 161, 115, 21, 253, 138, 166, 46, 196, 188, 219, 124, 56, 172, 99, 173, 93, 46, 21, 142, 178, 242, 181, 105, 45, 132, 170, 138, 46, 215, 8, 236, 136, 103, 61, 201, 52, 13, 11, 85, 67, 16, 107, 222, 50, 150, 54, 121, 120, 234, 72, 34, 150, 18, 205, 135, 133, 136, 123, 239, 77, 198, 225, 246, 226, 128, 147, 192, 53, 101, 227, 108, 93, 106, 119, 83, 50, 123, 41, 226, 116, 83, 163, 93, 106, 205, 173, 197, 113, 136, 221, 93, 247, 208, 125, 151, 203, 241, 212, 209, 101, 6, 218, 141, 165, 227, 83, 186, 104, 239, 190, 177, 118, 30, 138, 35, 81, 9, 41, 106, 101, 102, 108, 211, 8, 145, 134, 59, 146, 22, 162, 32, 10, 123, 4, 49, 21, 212, 79, 102, 132, 207, 44, 177, 191, 246, 200, 46, 63, 181, 88, 100, 85, 244, 166, 250, 154, 174, 115, 228, 202, 171, 211, 194, 65, 103, 200, 12, 80, 216, 69, 243, 39, 101, 175, 79, 226, 90, 9, 51, 61, 40, 33, 55, 72, 108, 123, 163, 96, 240, 66, 241, 1, 247, 22, 42, 51, 104, 247, 81, 165, 201, 59, 182, 69, 137, 111, 21, 23, 150, 54, 62, 122, 72, 57, 76, 90, 207, 179, 56, 86, 86, 201, 151, 200, 145, 144, 187, 152, 34, 56, 145, 171, 42, 27, 211, 54, 53, 77, 164, 236, 18, 124, 20, 117, 162, 102, 50, 127, 186, 5, 81, 239, 142, 140, 143, 94, 88, 222, 63, 180, 88, 228, 248, 228, 167, 169, 75, 253, 87, 136, 156, 83, 45, 175, 79, 162, 157, 220, 53, 187, 230, 186, 79, 175, 18, 249, 120, 0, 252, 110, 8, 97, 78, 98, 137, 127, 94, 11, 88, 220, 126, 101, 12, 236, 52, 42, 84, 255, 121, 19, 106, 144, 154, 2, 176, 35, 246, 110, 3, 27, 122, 23, 210, 254, 14, 98, 110, 89, 203, 190, 209, 201, 101, 204, 98, 105, 99, 87, 107, 227, 235, 187, 194, 36, 119, 15, 124, 195, 90, 34, 198, 95, 32, 167, 32, 169, 250, 139, 82, 194, 245, 201, 150, 116, 48, 11, 83, 110, 200, 167, 134, 124, 88, 19, 15, 119, 230, 142, 225, 219, 26, 58, 152, 6, 187, 241, 25, 149, 209, 3, 107, 136, 137, 45, 75, 49, 94, 170, 243, 18, 82, 113, 229, 40, 107, 8, 4, 47, 159, 147, 113, 68, 133, 79, 139, 12, 105, 204, 251, 246, 66, 146, 133, 247, 5, 93, 67, 206, 158, 216, 32, 39, 45, 96, 55, 96, 81, 193, 101, 99, 227, 254, 112, 10, 188, 1, 222, 149, 76, 155, 34, 244, 137, 105, 62, 210, 83, 207, 150, 217, 76, 143, 106, 14, 119, 58, 166, 119, 59, 121, 153, 224, 191, 136, 155, 2, 187, 168, 112, 164, 235, 4, 126, 83, 53, 233, 171, 206, 59, 155, 68, 237, 37, 40, 232, 190, 119, 52, 133, 111, 235, 70, 217, 171, 171, 102, 211, 182, 124, 34, 126, 22, 117, 88, 39, 220, 137, 158, 147, 89, 7, 148, 119, 88, 99, 216, 176, 244, 146, 191, 225, 74, 218, 143, 172, 230, 26, 28, 227, 136, 13, 217, 50, 8, 238, 190, 116, 185, 243, 35, 79, 70, 255, 9, 175, 38, 92, 172, 219, 6, 242, 233, 227, 162, 175, 213, 170, 187, 76, 57, 207, 229, 143, 216, 216, 208, 57, 45, 98, 226, 18, 101, 57, 53, 137, 74, 162, 234, 66, 177, 70, 152, 148, 16, 115, 127, 152, 87, 112, 235, 8, 219, 89, 245, 255, 189, 236, 2, 168, 129, 161, 141, 225, 25, 119, 185, 158, 160, 138, 97, 138, 84, 155, 81, 167, 132, 184, 231, 21, 216, 11, 171, 217, 98, 155, 207, 222, 215, 11, 109, 130, 164, 0, 255, 65, 168, 69, 9, 82, 225, 191, 242, 144, 107, 249, 218, 123, 237, 71, 64, 160, 197, 232, 186, 107, 210, 15, 5, 182, 135, 175, 237, 138, 145, 223, 178, 127, 171, 201, 232, 141, 52, 147, 81, 215, 2, 108, 144, 47, 166, 236, 223, 108, 66, 250, 251, 99, 221, 215, 125, 71, 127, 224, 60, 207, 151, 208, 122, 188, 112, 212, 86, 212, 97, 113, 185, 219, 73, 118, 253, 208, 120, 75, 213, 224, 87, 130, 178, 61, 56, 82, 231, 59, 109, 164, 183, 89, 96, 31, 166, 34, 118, 41, 26, 12, 237, 3, 255, 200, 241, 64, 165, 84, 10, 18, 129, 223, 173, 179, 217, 120, 70, 76, 69, 90, 121, 3, 147, 179, 131, 252, 195, 242, 230, 209, 34, 23, 37, 146, 239, 158, 86, 204, 96, 175, 33, 214, 137, 87, 40, 29, 91, 8, 111, 215, 169, 26, 50, 208, 200, 97, 29, 148, 57, 66, 164, 68, 131, 212, 97, 220, 26, 52, 234, 177, 231, 185, 171, 230, 10, 55, 224, 182, 138, 209, 151, 250, 63, 88, 151, 231, 135, 189, 241, 137, 183, 101, 169, 14, 43, 229, 57, 202, 208, 90, 132, 156, 130, 27, 115, 84, 157, 45, 38, 111, 134, 11, 224, 103, 247, 14, 187, 77, 242, 114, 234, 70, 87, 235, 103, 154, 47, 158, 73, 87, 169, 73, 11, 210, 24, 199, 99, 79, 148, 119, 245, 201, 19, 101, 236, 220, 21, 219, 72, 237, 33, 141, 166, 168, 96, 172, 4, 146, 231, 174, 36, 228, 79, 234, 175, 53, 105, 218, 100, 177, 29, 201, 44, 227, 25, 97, 244, 99, 170, 236, 88, 77, 213, 12, 41, 23, 115, 171, 214, 149, 131, 87, 247, 90, 68, 110, 244, 93, 18, 161, 165, 92, 224, 136, 22, 191, 30, 189, 24, 108, 185, 230, 18, 38, 66, 30, 231, 24, 188, 105, 66, 60, 194, 79, 248, 43, 79, 177, 84, 48, 122, 126, 214, 46, 159, 171, 55, 12, 109, 144, 173, 73, 47, 139, 158, 24, 65, 108, 96, 84, 239, 220, 51, 170, 245, 192, 17, 121, 152, 182, 33, 88, 13, 173, 84, 89, 131, 54, 235, 8, 151, 3, 23, 200, 236, 247, 185, 133, 103, 170, 219, 124, 89, 30, 155, 76, 187, 5, 7, 25, 175, 13, 99, 57, 104, 217, 145, 102, 137, 89, 151, 175, 20, 56, 19, 203, 4, 35, 173, 44, 127, 206, 8, 95, 41, 198, 214, 232, 73, 93, 157, 175, 78, 182, 86, 74, 151, 23, 189, 250, 26, 226, 2, 153, 232, 26, 171, 174, 158, 146, 169, 161, 129, 32, 119, 79, 116, 82, 215, 19, 100, 242, 90, 215, 218, 67, 155, 151, 32, 52, 155, 217, 94, 78, 42, 253, 9, 250, 244, 126, 214, 71, 35, 34, 252, 191, 248, 61, 147, 45, 92, 140, 77, 216, 214, 87, 85, 126, 233, 34, 109, 89, 133, 221, 104, 121, 71, 251, 217, 255, 30, 38, 45, 154, 193, 119, 103, 90, 186, 195, 132, 131, 27, 54, 26, 229, 62, 77, 28, 118, 177, 4, 146, 59, 102, 244, 55, 95, 91, 78, 137, 11, 45, 151, 3, 21, 208, 20, 4, 34, 232, 42, 54, 79, 28, 143, 234, 236, 205, 126, 98, 5, 87, 209, 249, 100, 124, 29, 53, 130, 235, 26, 53, 54, 33, 119, 25, 43, 240, 183, 165, 178, 169, 186, 28, 39, 39, 12, 11, 21, 76, 83, 205, 23, 68, 140, 24, 89, 11, 139, 92, 75, 24, 166, 67, 254, 232, 11, 123, 254, 180, 129, 203, 38, 65, 51, 115, 106, 60, 251, 26, 142, 246, 219, 206, 89, 12, 41, 142, 253, 45, 20, 151, 107, 31, 171, 177, 51, 123, 5, 238, 94, 6, 252, 186, 61, 215, 38, 83, 76, 27, 227, 53, 10, 228, 206, 206, 248, 255, 136, 140, 162, 124, 110, 234, 42, 111, 132, 168, 166, 25, 100, 82, 206, 234, 170, 176, 219, 103, 140, 58, 116, 155, 186, 177, 2, 116, 158, 64, 239, 10, 230, 225, 247, 178, 120, 216, 169, 8, 131, 46, 21, 81, 107, 119, 198, 233, 192, 83, 240, 106, 6, 237, 233, 116, 12, 100, 71, 226, 54, 251, 47, 39, 248, 27, 222, 83, 29, 215, 22, 221, 27, 252, 55, 32, 238, 27, 125, 194, 5, 192, 114, 80, 152, 226, 143, 249, 74, 144, 4, 25, 95, 178, 120, 99, 14, 42, 216, 56, 159, 37, 74, 29, 46, 170, 255, 203, 107, 91, 155, 46, 111, 96, 201, 120, 34, 255, 91, 119, 165, 226, 159, 88, 212, 140, 128, 36, 248, 220, 34, 167, 14, 44, 241, 55, 80, 83, 109, 136, 203, 240, 144, 248, 131, 245, 124, 14, 214, 88, 95, 143, 199, 78, 174, 24, 187, 43, 249, 240, 40, 71, 2, 95, 114, 192, 133, 186, 152, 119, 76, 230, 110, 98, 76, 236, 31, 150, 181, 175, 212, 246, 103, 100, 225, 80, 157, 207, 11, 60, 160, 143, 219, 64, 75, 53, 53, 233, 113, 55, 176, 54, 36, 91, 9, 240, 117, 88, 152, 233, 126, 26, 237, 23, 131, 9, 24, 149, 167, 220, 249, 49, 246, 232, 213, 155, 23, 64, 218, 185, 127, 50, 253, 117, 151, 91, 254, 140, 57, 174, 108, 251, 95, 131, 187, 241, 53, 251, 249, 23, 52, 143, 20, 87, 83, 214, 115, 155, 113, 152, 46, 85, 171, 174, 124, 188, 224, 91, 84, 188, 113, 101, 192, 190, 249, 56, 12, 185, 107, 230, 186, 219, 242, 251, 178, 46, 24, 178, 11, 3, 177, 221, 51, 164, 202, 69, 219, 69, 227, 72, 161, 66, 228, 13, 252, 74, 252, 124, 126, 79, 37, 67, 17, 94, 9, 112, 238, 208, 82, 59, 211, 250, 92, 230, 239, 122, 76, 79, 201, 5, 254, 102, 70, 117, 182, 160, 136, 16, 107, 246, 50, 98, 167, 93, 168, 73, 55, 220, 204, 130, 62, 100, 26, 96, 150, 53, 182, 38, 144, 24, 212, 182, 22, 123, 142, 9, 174, 145, 130, 90, 207, 191, 27, 83, 185, 44, 123, 194, 52, 62, 59, 189, 4, 62, 137, 207, 75, 98, 130, 227, 112, 133, 62, 52, 162, 54, 184, 237, 153, 120, 99, 75, 113, 25, 143, 53, 1, 208, 157, 31, 193, 111, 68, 165, 209, 194, 88, 50, 198, 80, 58, 203, 145, 36, 187, 92, 241, 52, 47, 226, 44, 214, 21, 207, 108, 99, 207, 197, 69, 10, 153, 90, 171, 211, 135, 168, 21, 61, 159, 218, 184, 91, 131, 80, 126, 174, 249, 13, 178, 170, 146, 67, 126, 59, 64, 92, 190, 233, 229, 122, 151, 116, 116, 71, 35, 249, 71, 106, 51, 128, 98, 125, 138, 29, 100, 44, 136, 78, 248, 156, 67, 27, 96, 0, 211, 43, 161, 221, 184, 206, 56, 187, 143, 238, 220, 18, 226, 164, 145, 22, 190, 121, 98, 247, 94, 98, 181, 83, 77, 155, 42, 110, 194, 42, 49, 41, 66, 216, 46, 163, 10, 196, 187, 28, 43, 235, 170, 236, 156, 134, 164, 139, 59, 241, 157, 226, 236, 141, 87, 29, 148, 103, 161, 210, 213, 137, 89, 20, 125, 27, 36, 32, 113, 20, 111, 219, 159, 53, 146, 158, 116, 136, 159, 80, 22, 248, 17, 96, 23, 93, 107, 235, 149, 255, 97, 227, 220, 241, 124, 238, 61, 146, 109, 173, 217, 150, 201, 138, 66, 115, 164, 227, 105, 57, 59, 78, 82, 255, 149, 218, 96, 113, 65, 27, 140, 73, 147, 199, 17, 159, 36, 137, 100, 87, 72, 96, 225, 146, 41, 79, 134, 79, 104, 169, 38, 128, 123, 98, 1, 82, 84, 28, 124, 238, 176, 240, 165, 216, 46, 180, 144, 3, 255, 41, 187, 251, 37, 72, 63, 206, 13, 178, 5, 43, 58, 237, 60, 210, 3, 32, 28, 186, 24, 159, 86, 243, 31, 52, 246, 241, 57, 139, 88, 29, 115, 136, 23, 245, 178, 104, 250, 199, 199, 14, 243, 231, 136, 23, 7, 222, 56, 22, 180, 135, 34, 192, 226, 253, 70, 42, 62, 2, 34, 119, 158, 69, 166, 73, 19, 177, 80, 98, 190, 83, 128, 171, 96, 166, 55, 16, 107, 178, 219, 242, 32, 116, 60, 2, 178, 135, 213, 35, 162, 89, 75, 15, 21, 45, 138, 10, 84, 191, 198, 199, 40, 43, 92, 177, 235, 9, 152, 211, 4, 84, 251, 222, 240, 181, 96, 58, 94, 60, 245, 216, 72, 214, 198, 184, 80, 135, 151, 247, 72, 147, 184, 179, 97, 254, 229, 102, 118, 81, 254, 161, 129, 220, 234, 41, 171, 111, 126, 125, 226, 168, 246, 148, 100, 65, 185, 208, 100, 188, 247, 185, 37, 145, 4, 248, 78, 245, 191, 144, 156, 141, 95, 29, 108, 45, 154, 157, 165, 224, 36, 97, 211, 235, 200, 162, 8, 232, 149, 209, 243, 230, 80, 126, 196, 68, 207, 92, 182, 146, 199, 128, 250, 170, 23, 66, 204, 239, 75, 92, 155, 234, 56, 151, 177, 39, 106, 33, 77, 219, 37, 72, 212, 202, 205, 135, 80, 136, 216, 228, 174, 52, 243, 163, 178, 11, 145, 91, 163, 128, 137, 89, 194, 3, 215, 128, 236, 110, 234, 66, 128, 40, 88, 66, 86, 13, 74, 71, 15, 166, 214, 185, 15, 252, 241, 166, 249, 216, 99, 145, 21, 242, 239, 227, 129, 64, 66, 229, 164, 2, 246, 209, 137, 231, 254, 35, 56, 218, 171, 126, 143, 163, 62, 164, 149, 208, 91, 13, 89, 49, 109, 151, 136, 6, 248, 167, 42, 165, 163, 229, 43, 69, 60, 123, 50, 69, 102, 73, 144, 215, 2, 223, 140, 90, 246, 136, 132, 78, 156, 142, 143, 104, 17, 159, 182, 233, 211, 28, 165, 124, 19, 180, 59, 197, 60, 78, 139, 217, 83, 34, 233, 20, 158, 242, 166, 243, 234, 88, 181, 114, 207, 208, 254, 206, 101, 97, 19, 192, 129, 198, 84, 93, 182, 223, 80, 122, 152, 134, 218, 35, 225, 111, 238, 47, 129, 107, 110, 194, 230, 238, 73, 237, 80, 180, 42, 43, 220, 33, 62, 166, 134, 161, 28, 165, 159, 0, 197, 151, 92, 130, 163, 221, 39, 180, 255, 154, 121, 230, 22, 247, 28, 249, 190, 215, 232, 6, 16, 64, 80, 174, 85, 31, 212, 84, 102, 138, 247, 7, 108, 5, 60, 143, 153, 152, 14, 119, 236, 9, 113, 170, 208, 152, 122, 98, 131, 30, 218, 82, 102, 192, 90, 231, 134, 45, 252, 162, 141, 152, 34, 30, 147, 157, 243, 192, 222, 159, 96, 204, 234, 248, 239, 39, 124, 194, 53, 22, 210, 206, 212, 235, 66, 252, 104, 113, 60, 62, 50, 10, 205, 89, 230, 169, 182, 216, 221, 186, 227, 51, 83, 14, 8, 43, 91, 60, 116, 9, 64, 158, 139, 89, 51, 6, 77, 93, 160, 70, 45, 59, 107, 245, 66, 131, 99, 108, 24, 83, 233, 202, 191, 182, 248, 205, 206, 102, 36, 169, 159, 159, 239, 89, 252, 8, 233, 110, 154, 172, 137, 12, 169, 217, 96, 117, 64, 143, 55, 64, 212, 142, 231, 212, 179, 2, 61, 155, 88, 56, 87, 196, 56, 34, 69, 246, 246, 43, 20, 190, 67, 0, 13, 19, 28, 101, 149, 72, 60, 195, 250, 225, 54, 197, 82, 50, 37, 69, 218, 73, 191, 201, 30, 133, 81, 238, 174, 209, 181, 110, 182, 102, 127, 163, 78, 95, 64, 182, 170, 211, 202, 188, 41, 27, 60, 41, 210, 110, 71, 157, 64, 40, 37, 107, 234, 4, 126, 62, 68, 64, 240, 117, 172, 57, 118, 204, 205, 129, 219, 96, 134, 61, 147, 115, 70, 88, 92, 207, 22, 122, 46, 10, 134, 145, 24, 78, 190, 254, 141, 45, 77, 147, 75, 222, 240, 141, 58, 221, 26, 102, 216, 58, 161, 187, 148, 42, 142, 211, 246, 4, 142, 88, 166, 50, 157, 22, 33, 27, 10, 117, 1, 84, 113, 209, 110, 74, 154, 52, 85, 149, 39, 0, 247, 228, 185, 50, 24, 228, 130, 61, 46, 191, 234, 80, 171, 114, 161, 178, 57, 79, 79, 215, 103, 239, 99, 160, 173, 178, 69, 210, 64, 171, 18, 165, 219, 194, 204, 249, 59, 37, 186, 116, 217, 6, 180, 28, 189, 87, 64, 243, 233, 124, 119, 102, 230, 179, 200, 98, 47, 195, 72, 136, 214, 122, 116, 127, 185, 42, 70, 101, 129, 117, 143, 227, 36, 196, 62, 187, 200, 247, 170, 160, 40, 41, 117, 127, 99, 39, 219, 185, 216, 7, 169, 52, 162, 208, 100, 212, 82, 247, 145, 89, 199, 34, 6, 59, 139, 54, 37, 36, 184, 117, 17, 16, 234, 107, 29, 131, 79, 55, 177, 57, 30, 90, 36, 39, 4, 71, 135, 113, 162, 230, 193, 102, 157, 168, 164, 230, 240, 85, 243, 77, 217, 146, 147, 158, 15, 100, 61, 251, 242, 104, 149, 47, 37, 230, 33, 113, 146, 76, 125, 220, 173, 65, 56, 231, 114, 132, 192, 41, 231, 14, 232, 18, 195, 203, 86, 229, 50, 84, 58, 250, 204, 220, 184, 133, 236, 17, 16, 85, 149, 16, 108, 74, 153, 20, 82, 177, 102, 140, 62, 51, 173, 254, 192, 131, 135, 106, 86, 152, 84, 55, 210, 7, 124, 195, 244, 131, 162, 41, 88, 58, 166, 197, 172, 165, 144, 47, 198, 37, 236, 176, 177, 35, 157, 78, 159, 218, 41, 149, 227, 110, 103, 15, 58, 148, 192, 31, 247, 100, 158, 149, 128, 29, 165, 125, 255, 225, 174, 105, 236, 241, 30, 173, 190, 11, 101, 2, 53, 38, 237, 135, 33, 50, 78, 103, 52, 227, 218, 228, 140, 170, 240, 70, 180, 72, 24, 211, 98, 150, 165, 148, 97, 41, 12, 32, 78, 230, 13, 30, 213, 80, 24, 108, 157, 61, 165, 77, 159, 132, 194, 89, 202, 44, 231, 171, 30, 66, 235, 168, 68, 76, 45, 35, 85, 123, 2, 155, 155, 185, 152, 193, 198, 184, 237, 71, 251, 137, 212, 56, 82, 50, 153, 111, 143, 97, 80, 212, 17, 157, 188, 158, 14, 5, 69, 134, 122, 37, 179, 204, 146, 62, 216, 88, 174, 75, 57, 122, 235, 239, 199, 18, 134, 181, 163, 91, 242, 168, 229, 186, 58, 222, 194, 205, 218, 62, 116, 235, 93, 116, 152, 135, 95, 157, 124, 113, 211, 218, 18, 4, 95, 225, 217, 89, 180, 86, 86, 235, 88, 206, 50, 94, 26, 83, 29, 15, 61, 197, 45, 41, 124, 164, 56, 213, 106, 147, 114, 59, 109, 34, 142, 164, 33, 146, 245, 208, 221, 248, 108, 168, 142, 203, 232, 95, 61, 33, 33, 40, 17, 71, 209, 166, 86, 141, 211, 47, 59, 119, 150, 180, 148, 242, 172, 113, 54, 77, 229, 178, 40, 33, 161, 164, 64, 114, 4, 206, 36, 191, 199, 230, 205, 193, 154, 141, 187, 135, 24, 130, 96, 40, 45, 40, 210, 109, 225, 216, 100, 245, 194, 125, 125, 151, 174, 88, 248, 50, 193, 78, 21, 139, 141, 233, 92, 76, 199, 110, 176, 65, 16, 124, 150, 173, 64, 140, 202, 66, 111, 18, 31, 102, 136, 239, 32, 183, 214, 95, 219, 194, 217, 168, 85, 175, 154, 255, 111, 27, 211, 124, 90, 79, 71, 48, 131, 100, 110, 133, 75, 240, 13, 210, 191, 188, 164, 243, 124, 22, 233, 179, 14, 57, 29, 148, 245, 67, 28, 246, 192, 0, 252, 206, 221, 194, 38, 184, 27, 175, 207, 77, 135, 127, 126, 239, 45, 26, 103, 169, 66, 213, 152, 9, 36, 232, 252, 203, 153, 109, 102, 42, 252, 237, 132, 212, 148, 192, 61, 97, 152, 148, 108, 33, 83, 58, 176, 123, 88, 235, 213, 32, 84, 63, 247, 79, 216, 69, 179, 97, 68, 52, 194, 123, 59, 179, 225, 129, 120, 66, 195, 218, 9, 100, 8, 140, 143, 99, 250, 226, 166, 126, 2, 23, 46, 92, 105, 239, 168, 160, 39, 102, 152, 148, 61, 94, 92, 46, 247, 1, 229, 253, 210, 14, 47, 111, 113, 144, 111, 143, 97, 215, 202, 205, 55, 232, 243, 223, 59, 130, 156, 57, 111, 0, 76, 87, 230, 174, 84, 160, 33, 127, 205, 55, 68, 193, 116, 45, 119, 195, 3, 75, 178, 175, 146, 204, 244, 185, 233, 70, 74, 201, 164, 126, 120, 223, 247, 32, 72, 35, 159, 78, 147, 181, 65, 220, 56, 126, 214, 32, 230, 109, 240, 18, 248, 96, 207, 251, 58, 161, 70, 169, 39, 208, 53, 221, 65, 148, 250, 70, 81, 160, 71, 181, 100, 177, 59, 52, 227, 112, 217, 104, 7, 161, 137, 22, 140, 65, 158, 227, 216, 83, 132, 88, 111, 131, 153, 73, 150, 219, 42, 152, 254, 150, 232, 16, 42, 236, 58, 83, 138, 41, 124, 218, 99, 138, 248, 59, 185, 133, 85, 146, 79, 19, 137, 29, 127, 29, 248, 194, 216, 254, 239, 36, 88, 196, 140, 187, 232, 195, 251, 95, 94, 245, 124, 5, 174, 254, 189, 105, 160, 218, 163, 88, 41, 74, 85, 211, 236, 207, 161, 5, 155, 219, 246, 133, 87, 0, 118, 117, 40, 220, 63, 116, 201, 209, 105, 165, 113, 156, 32, 113, 139, 55, 79, 160, 228, 178, 27, 7, 10, 99, 140, 82, 238, 180, 156, 226, 175, 166, 202, 46, 67, 91, 150, 158, 74, 32, 230, 73, 116, 105, 166, 101, 63, 105, 177, 236, 90, 72, 251, 49, 45, 221, 255, 127, 169, 253, 60, 146, 38, 63, 224, 14, 119, 150, 222, 21, 1, 29, 230, 216, 251, 32, 248, 20, 34, 205, 178, 112, 26, 146, 231, 9, 149, 135, 234, 87, 57, 65, 29, 1, 42, 243, 242, 214, 170, 93, 202, 153, 44, 137, 185, 84, 222, 200, 24, 222, 76, 158, 120, 11, 148, 22, 8, 219, 202, 41, 203, 14, 65, 63, 7, 182, 76, 22, 120, 37, 246, 190, 101, 181, 59, 253, 97, 116, 170, 78, 67, 167, 54, 185, 222, 84, 72, 204, 109, 215, 41, 7, 38, 20, 54, 26, 116, 221, 26, 201, 33, 85, 23, 34, 123, 174, 102, 194, 183, 156, 49, 91, 75, 230, 202, 167, 9, 176, 245, 179, 90, 54, 54, 220, 38, 170, 42, 75, 139, 201, 48, 126, 101, 74, 126, 141, 200, 17, 62, 146, 125, 85, 255, 15, 222, 191, 206, 199, 206, 247, 0, 70, 77, 103, 191, 32, 28, 161, 137, 30, 83, 14, 160, 139, 87, 191, 237, 102, 40, 63, 17, 53, 165, 37, 93, 165, 121, 172, 171, 19, 116, 79, 54, 214, 182, 171, 30, 255, 169, 97, 255, 236, 235, 77, 12, 2, 18, 247, 16, 219, 64, 94, 20, 172, 241, 124, 20, 107, 241, 97, 183, 200, 251, 73, 136, 123, 181, 218, 174, 136, 214, 195, 225, 222, 28, 148, 153, 228, 112, 195, 105, 202, 74, 4, 100, 248, 242, 21, 16, 70, 83, 158, 148, 36, 98, 245, 84, 245, 151, 91, 128, 122, 24, 239, 218, 169, 243, 122, 148, 250, 110, 221, 77, 170, 236, 45, 200, 33, 60, 97, 161, 240, 68, 212, 3, 199, 4, 23, 246, 122, 127, 46, 149, 138, 184, 122, 19, 193, 62, 105, 82, 231, 216, 95, 169, 54, 216, 39, 199, 220, 100, 12, 231, 143, 112, 232, 221, 30, 143, 113, 112, 104, 38, 143, 99, 238, 84, 243, 1, 192, 233, 218, 103, 218, 237, 23, 175, 110, 200, 70, 168, 40, 210, 70, 173, 232, 232, 93, 63, 246, 92, 8, 63, 45, 144, 225, 137, 192, 11, 124, 121, 77, 60, 85, 214, 107, 172, 191, 227, 127, 91, 4, 75, 20, 191, 161, 164, 64, 21, 204, 35, 189, 251, 45, 196, 38, 224, 29, 99, 224, 63, 244, 8, 177, 90, 45, 91, 88, 174, 25, 194, 76, 128, 130, 29, 78, 21, 126, 186, 56, 223, 145, 112, 62, 72, 145, 67, 146, 157, 145, 35, 132, 205, 158, 44, 37, 52, 178, 100, 192, 105, 236, 116, 138, 33, 76, 163, 182, 33, 223, 234, 63, 158, 183, 123, 149, 3, 40, 56, 160, 22, 130, 243, 109, 251, 61, 165, 40, 199, 178, 9, 247, 208, 121, 199, 101, 132, 60, 102, 213, 38, 153, 210, 195, 77, 31, 229, 192, 177, 16, 160, 248, 227, 151, 112, 31, 56, 74, 61, 176, 178, 69, 167, 153, 131, 172, 161, 191, 232, 173, 255, 83, 103, 2, 65, 18, 114, 73, 44, 44, 0, 63, 131, 129, 31, 62, 75, 143, 140, 183, 124, 204, 64, 22, 135, 170, 125, 140, 10, 216, 36, 142, 92, 19, 108, 118, 95, 47, 213, 238, 52, 36, 24, 85, 119, 252, 240, 72, 215, 179, 243, 236, 122, 34, 174, 63, 188, 228, 228, 40, 240, 118, 239, 252, 39, 52, 86, 106, 155, 228, 22, 108, 42, 218, 142, 49, 111, 184, 78, 224, 223, 9, 11, 223, 54, 246, 105, 132, 108, 49, 136, 50, 54, 44, 101, 145, 46, 54, 210, 214, 120, 57, 67, 93, 204, 221, 250, 160, 195, 231, 221, 234, 48, 233, 172, 53, 248, 246, 30, 220, 210, 99, 232, 108, 24, 50, 108, 124, 169, 194, 64, 130, 22, 4, 21, 0, 118, 81, 15, 57, 223, 100, 237, 48, 14, 242, 4, 43, 146, 217, 77, 198, 116, 249, 5, 96, 176, 27, 107, 42, 125, 202, 65, 237, 152, 66, 186, 147, 74, 170, 34, 179, 154, 19, 10, 251, 203, 60, 136, 108, 84, 192, 113, 248, 73, 147, 192, 7, 135, 11, 118, 48, 185, 180, 145, 163, 124, 159, 73, 252, 111, 49, 52, 235, 101, 42, 57, 227, 200, 201, 138, 93, 78, 152, 2, 138, 182, 148, 126, 226, 191, 84, 3, 16, 159, 211, 247, 119, 204, 98, 160, 69, 240, 174, 90, 253, 246, 0, 102, 247, 152, 231, 220, 130, 208, 81, 182, 175, 92, 89, 185, 53, 74, 154, 27, 197, 150, 253, 189, 103, 102, 11, 57, 59, 74, 11, 208, 237, 8, 231, 131, 235, 55, 1, 167, 161, 28, 154, 194, 232, 60, 25, 161, 141, 120, 128, 188, 105, 220, 127, 221, 20, 58, 227, 244, 159, 95, 176, 245, 103, 51, 158, 168, 130, 236, 150, 68, 124, 8, 93, 240, 116, 247, 6, 17, 192, 147, 22, 232, 88, 27, 223, 142, 222, 200, 42, 36, 224, 193, 152, 205, 16, 236, 240, 128, 2, 64, 8, 45, 218, 228, 138, 180, 8, 228, 178, 125, 152, 99, 6, 199, 159, 240, 125, 235, 31, 195, 86, 42, 238, 84, 202, 189, 132, 195, 172, 64, 107, 151, 123, 157, 50, 205, 152, 192, 146, 14, 70, 160, 173, 112, 8, 230, 56, 158, 41, 10, 197, 131, 208, 219, 152, 40, 46, 60, 76, 140, 49, 234, 184, 168, 166, 155, 1, 157, 84, 182, 128, 128, 76, 13, 22, 218, 12, 56, 2, 192, 65, 96, 167, 63, 217, 203, 131, 235, 75, 221, 37, 157, 41, 161, 175, 59, 135, 239, 116, 39, 78, 55, 198, 146, 182, 72, 219, 20, 192, 24, 195, 223, 28, 194, 102, 168, 119, 88, 111, 11, 99, 158, 194, 187, 189, 127, 137, 238, 177, 67, 94, 29, 35, 139, 203, 131, 2, 148, 252, 50, 116, 46, 58, 195, 243, 23, 114, 41, 147, 56, 231, 152, 166, 244, 125, 232, 19, 98, 104, 160, 18, 154, 79, 221, 173, 148, 100, 103, 149, 201, 209, 40, 110, 198, 60, 33, 182, 177, 137, 185, 151, 206, 88, 194, 160, 215, 197, 123, 91, 5, 97, 103, 233, 37, 189, 229, 228, 83, 150, 103, 195, 10, 194, 0, 68, 255, 98, 8, 108, 224, 246, 231, 20, 185, 59, 231, 85, 94, 250, 108, 221, 138, 164, 210, 93, 105, 109, 88, 157, 195, 53, 16, 235, 152, 180, 230, 33, 71, 102, 45, 84, 17, 63, 72, 218, 96, 151, 161, 197, 222, 13, 92, 216, 119, 60, 92, 87, 140, 240, 138, 53, 95, 122, 47, 60, 136, 66, 26, 195, 92, 170, 213, 227, 73, 143, 27, 185, 190, 82, 208, 94, 140, 30, 227, 107, 143, 151, 44, 87, 48, 12, 60, 76, 6, 145, 199, 133, 57, 177, 81, 212, 161, 179, 145, 42, 93, 101, 238, 17, 234, 139, 82, 191, 148, 111, 55, 189, 173, 50, 227, 187, 197, 49, 216, 91, 37, 203, 39, 192, 41, 83, 17, 244, 233, 222, 18, 176, 59, 167, 59, 34, 98, 16, 40, 103, 101, 21, 210, 59, 177, 19, 182, 212, 80, 165, 162, 223, 17, 223, 88, 12, 126, 9, 243, 253, 127, 26, 116, 201, 26, 239, 213, 179, 199, 4, 176, 176, 238, 61, 143, 198, 55, 212, 69, 42, 92, 67, 121, 85, 33, 175, 243, 109, 47, 137, 218, 129, 137, 151, 217, 18, 40, 35, 63, 113, 206, 201, 142, 156, 230, 26, 194, 26, 37, 35, 124, 38, 213, 149, 242, 9, 157, 137, 80, 175, 106, 133, 211, 217, 9, 250, 73, 110, 232, 245, 25, 193, 85, 253, 168, 67, 99, 232, 98, 100, 206, 4, 174, 157, 102, 144, 86, 50, 79, 111, 52, 112, 194, 23, 178, 153, 174, 14, 185, 61, 92, 38, 139, 61, 89, 173, 177, 212, 133, 120, 185, 166, 224, 37, 107, 114, 189, 120, 221, 191, 44, 59, 138, 228, 9, 54, 67, 91, 42, 28, 57, 179, 138, 60, 59, 29, 124, 66, 99, 171, 202, 201, 241, 122, 61, 194, 72, 232, 214, 70, 32, 227, 168, 245, 112, 212, 166, 69, 170, 240, 103, 173, 53, 146, 244, 94, 166, 162, 249, 113, 118, 103, 177, 159, 153, 135, 186, 192, 239, 191, 252, 228, 39, 131, 82, 30, 37, 48, 44, 153, 121, 166, 198, 68, 4, 233, 127, 30, 88, 219, 25, 197, 20, 242, 139, 91, 140, 34, 154, 197, 180, 62, 251, 237, 228, 224, 227, 227, 172, 112, 219, 124, 175, 93, 106, 244, 237, 49, 178, 190, 136, 207, 70, 103, 186, 21, 186, 23, 218, 115, 66, 101, 233, 191, 22, 68, 70, 235, 86, 145, 140, 175, 26, 4, 226, 128, 254, 85, 165, 18, 217, 81, 59, 229, 121, 70, 60, 33, 38, 3, 6, 77, 34, 148, 204, 167, 182, 209, 38, 221, 176, 217, 179, 182, 153, 150, 194, 31, 18, 195, 172, 77, 148, 187, 62, 221, 89, 46, 177, 19, 219, 164, 228, 50, 230, 113, 86, 78, 92, 167, 181, 246, 47, 203, 81, 199, 25, 16, 152, 28, 66, 5, 156, 104, 126, 181, 140, 50, 177, 19, 96, 162, 229, 11, 123, 128, 140, 161, 214, 40, 194, 76, 84, 223, 196, 14, 117, 11, 141, 44, 7, 64, 44, 35, 120, 7, 199, 238, 172, 21, 104, 30, 218, 171, 150, 233, 160, 176, 207, 44, 244, 192, 198, 167, 45, 90, 183, 246, 62, 172, 64, 148, 141, 177, 99, 121, 87, 241, 76, 176, 28, 32, 41, 96, 195, 82, 139, 251, 163, 212, 10, 143, 163, 143, 212, 179, 52, 237, 58, 144, 35, 144, 0, 240, 229, 182, 164, 108, 57, 92, 185, 108, 219, 54, 185, 236, 108, 9, 228, 144, 248, 63, 220, 200, 87, 183, 179, 223, 100, 125, 225, 40, 30, 35, 26, 189, 67, 35, 230, 44, 23, 185, 232, 244, 125, 204, 185, 168, 180, 208, 62, 133, 14, 33, 131, 144, 126, 109, 11, 188, 108, 143, 1, 17, 242, 18, 46, 242, 100, 40, 56, 224, 213, 76, 236, 26, 9, 119, 54, 2, 73, 91, 209, 45, 250, 119, 102, 33, 196, 156, 206, 38, 8, 106, 138, 113, 92, 117, 152, 24, 165, 223, 166, 177, 96, 199, 58, 155, 106, 106, 255, 151, 104, 211, 174, 222, 150, 224, 145, 88, 94, 233, 57, 116, 37, 189, 108, 187, 132, 204, 175, 122, 14, 135, 41, 102, 152, 153, 227, 103, 65, 244, 253, 234, 75, 210, 38, 167, 224, 239, 85, 254, 168, 143, 205, 171, 97, 64, 59, 20, 142, 202, 151, 206, 33, 116, 29, 103, 107, 143, 186, 195, 214, 65, 167, 133, 110, 137, 191, 31, 202, 43, 106, 226, 244, 52, 233, 22, 207, 73, 61, 215, 143, 226, 148, 233, 36, 24, 196, 36, 212, 131, 165, 160, 164, 95, 150, 64, 34, 99, 175, 43, 136, 0, 66, 124, 60, 242, 165, 230, 20, 92, 102, 173, 143, 14, 148, 23, 199, 19, 72, 187, 48, 192, 108, 83, 65, 138, 14, 69, 110, 221, 149, 120, 81, 229, 103, 206, 155, 172, 243, 36, 156, 124, 76, 236, 189, 247, 91, 151, 240, 178, 223, 234, 13, 192, 143, 222, 55, 116, 22, 105, 252, 188, 240, 83, 57, 254, 193, 158, 233, 191, 242, 80, 98, 83, 110, 210, 159, 186, 101, 76, 53, 31, 160, 113, 99, 131, 158, 247, 157, 61, 235, 117, 255, 150, 122, 124, 156, 93, 229, 138, 190, 163, 32, 2, 193, 158, 165, 223, 226, 206, 186, 177, 127, 253, 115, 237, 95, 7, 174, 196, 230, 160, 167, 186, 26, 158, 100, 88, 123, 202, 169, 211, 104, 160, 55, 191, 242, 188, 232, 54, 241, 236, 206, 76, 136, 59, 74, 24, 188, 40, 96, 252, 119, 113, 87, 117, 54, 244, 33, 211, 80, 146, 66, 233, 10, 254, 32, 184, 128, 106, 120, 125, 80, 177, 24, 40, 144, 247, 150, 152, 19, 36, 120, 245, 219, 44, 37, 40, 50, 204, 16, 174, 140, 211, 125, 247, 81, 177, 153, 140, 201, 187, 113, 31, 240, 241, 92, 22, 189, 199, 9, 129, 85, 77, 171, 6, 186, 13, 12, 95, 90, 75, 251, 68, 210, 121, 67, 65, 210, 31, 3, 124, 244, 68, 189, 65, 216, 184, 36, 254, 176, 184, 39, 167, 5, 12, 79, 196, 173, 155, 101, 187, 46, 153, 99, 45, 4, 105, 98, 251, 169, 232, 169, 150, 157, 236, 255, 243, 193, 35, 62, 237, 245, 26, 192, 71, 106, 183, 113, 121, 208, 195, 209, 213, 145, 98, 79, 17, 180, 7, 61, 84, 154, 75, 253, 124, 65, 96, 208, 210, 124, 221, 31, 130, 74, 114, 136, 175, 80, 91, 144, 124, 216, 180, 141, 200, 25, 13, 34, 110, 254, 21, 150, 8, 67, 208, 213, 139, 31, 180, 19, 213, 188, 114, 57, 19, 197, 165, 255, 40, 250, 169, 223, 116, 174, 20, 36, 203, 1, 43, 87, 64, 95, 59, 197, 149, 110, 127, 172, 178, 198, 42, 19, 73, 20, 167, 11, 30, 200, 54, 30, 77, 109, 75, 253, 126, 143, 251, 147, 93, 155, 64, 40, 52, 151, 97, 39, 233, 34, 188, 140, 195, 67, 174, 239, 69, 124, 115, 124, 128, 43, 84, 106, 191, 143, 168, 116, 231, 62, 246, 98, 66, 103, 172, 147, 184, 136, 121, 211, 118, 189, 45, 137, 16, 26, 30, 221, 56, 162, 136, 172, 135, 90, 112, 242, 58, 137, 154, 250, 118, 18, 51, 33, 90, 241, 254, 207, 177, 226, 68, 174, 245, 247, 74, 85, 89, 111, 208, 104, 122, 101, 21, 24, 148, 46, 101, 199, 119, 6, 44, 166, 123, 25, 71, 219, 34, 102, 149, 224, 117, 68, 225, 159, 105, 156, 142, 1, 123, 89, 215, 169, 92, 178, 182, 18, 208, 37, 194, 38, 18, 33, 26, 58, 244, 189, 0, 91, 175, 155, 179, 56, 75, 235, 8, 22, 187, 117, 18, 30, 36, 201, 130, 113, 200, 139, 84, 29, 18, 142, 47, 137, 214, 101, 81, 210, 203, 24, 167, 62, 52, 90, 240, 16, 80, 247, 64, 4, 16, 44, 205, 213, 106, 97, 123, 87, 219, 64, 198, 235, 13, 102, 172, 15, 166, 115, 56, 167, 6, 225, 238, 185, 236, 105, 82, 156, 240, 20, 191, 249, 103, 136, 207, 210, 72, 248, 125, 31, 49, 97, 17, 139, 48, 25, 143, 47, 187, 75, 99, 147, 16, 225, 3, 192, 30, 93, 144, 92, 28, 0, 76, 160, 17, 172, 15, 159, 89, 69, 18, 242, 139, 37, 40, 209, 58, 177, 24, 124, 232, 153, 213, 159, 230, 28, 33, 64, 3, 55, 182, 234, 238, 219, 211, 83, 187, 119, 214, 32, 122, 139, 102, 97, 179, 68, 193, 81, 169, 162, 174, 62, 160, 152, 59, 151, 221, 89, 180, 151, 142, 243, 50, 23, 226, 238, 115, 220, 215, 71, 131, 234, 83, 230, 42, 96, 184, 149, 94, 167, 247, 74, 175, 233, 25, 50, 219, 115, 255, 84, 105, 176, 10, 205, 25, 118, 105, 116, 92, 144, 163, 86, 190, 11, 76, 28, 159, 212, 125, 211, 150, 134, 226, 246, 77, 230, 239, 67, 224, 63, 83, 163, 107, 162, 222, 91, 190, 53, 40, 13, 83, 233, 230, 47, 211, 206, 122, 195, 2, 225, 203, 199, 182, 84, 221, 186, 196, 186, 72, 86, 117, 55, 120, 33, 136, 251, 216, 70, 255, 184, 25, 0, 229, 248, 112, 245, 210, 144, 82, 178, 27, 229, 170, 84, 247, 224, 83, 233, 125, 146, 162, 252, 225, 193, 132, 193, 60, 149, 159, 5, 109, 221, 245, 14, 40, 194, 72, 85, 192, 97, 121, 127, 233, 68, 221, 22, 123, 233, 163, 206, 51, 249, 215, 41, 90, 241, 243, 246, 67, 212, 199, 8, 16, 210, 159, 224, 161, 109, 22, 246, 193, 204, 91, 172, 64, 54, 201, 125, 96, 155, 164, 27, 232, 34, 188, 61, 117, 80, 55, 74, 36, 155, 254, 73, 26, 102, 193, 120, 86, 128, 241, 16, 179, 48, 108, 35, 120, 14, 219, 204, 176, 26, 217, 177, 18, 81, 228, 233, 170, 230, 213, 200, 94, 1, 77, 177, 6, 224, 167, 45, 52, 8, 213, 153, 15, 182, 153, 211, 71, 13, 18, 40, 142, 190, 201, 193, 68, 129, 208, 25, 231, 2, 104, 133, 82, 111, 147, 51, 62, 143, 0, 172, 25, 15, 140, 100, 131, 194, 254, 93, 243, 93, 143, 80, 49, 220, 123, 199, 121, 78, 168, 185, 102, 252, 239, 151, 150, 119, 4, 254, 119, 38, 157, 112, 238, 75, 106, 176, 157, 148, 193, 93, 141, 1, 128, 64, 189, 67, 67, 82, 222, 178, 239, 89, 105, 247, 96, 7, 1, 126, 63, 89, 23, 42, 54, 145, 216, 8, 151, 163, 143, 68, 53, 147, 249, 143, 223, 37, 143, 178, 36, 25, 102, 119, 91, 131, 225, 148, 31, 174, 39, 128, 184, 211, 206, 197, 118, 34, 4, 161, 164, 230, 241, 166, 111, 21, 214, 81, 24, 108, 37, 178, 36, 232, 189, 119, 207, 252, 146, 213, 84, 47, 125, 223, 151, 244, 43, 74, 132, 14, 4, 152, 212, 135, 42, 97, 240, 53, 130, 170, 100, 232, 172, 134, 39, 69, 197, 158, 242, 136, 52, 179, 54, 233, 59, 82, 82, 75, 207, 237, 49, 150, 139, 39, 255, 105, 110, 190, 253, 172, 71, 204, 14, 192, 146, 118, 126, 78, 191, 37, 34, 177, 97, 194, 137, 191, 168, 166, 85, 15, 12, 37, 78, 135, 113, 39, 229, 20, 142, 32, 76, 76, 248, 185, 113, 7, 108, 175, 159, 47, 104, 154, 148, 96, 213, 222, 197, 82, 178, 24, 204, 188, 94, 36, 226, 241, 3, 174, 197, 237, 217, 77, 235, 208, 132, 43, 120, 99, 198, 183, 53, 43, 114, 175, 213, 52, 31, 94, 57, 115, 178, 63, 51, 214, 188, 112, 192, 168, 250, 37, 165, 15, 230, 109, 242, 49, 153, 158, 246, 222, 83, 46, 76, 32, 193, 92, 65, 6, 227, 14, 156, 112, 189, 18, 84, 162, 78, 227, 112, 113, 155, 139, 78, 223, 127, 110, 126, 176, 127, 158, 167, 17, 91, 3, 93, 27, 65, 146, 194, 200, 6, 110, 191, 81, 69, 166, 250, 80, 221, 29, 245, 116, 154, 20, 73, 173, 33, 201, 4, 190, 7, 172, 210, 249, 7, 223, 14, 3, 14, 132, 198, 194, 107, 3, 16, 58, 225, 176, 9, 11, 48, 38, 106, 188, 227, 138, 133, 18, 202, 89, 138, 110, 236, 78, 18, 146, 133, 89, 74, 101, 215, 129, 82, 173, 115, 154, 92, 59, 26, 217, 158, 4, 116, 167, 240, 58, 117, 113, 133, 54, 160, 229, 50, 11, 212, 148, 161, 2, 157, 61, 152, 153, 225, 24, 118, 91, 28, 70, 125, 29, 25, 19, 59, 171, 96, 21, 98, 67, 139, 39, 29, 23, 141, 78, 194, 158, 194, 82, 112, 211, 148, 113, 97, 189, 198, 191, 170, 239, 121, 66, 201, 151, 197, 210, 137, 195, 121, 190, 125, 34, 101, 149, 132, 159, 48, 32, 167, 199, 115, 208, 247, 37, 231, 209, 219, 25, 103, 24, 91, 211, 188, 202, 167, 23, 203, 110, 223, 44, 94, 253, 56, 211, 151, 60, 9, 165, 176, 179, 233, 156, 228, 30, 221, 133, 159, 103, 147, 88, 73, 166, 133, 166, 93, 164, 203, 162, 30, 91, 208, 238, 116, 193, 37, 116, 61, 119, 226, 8, 135, 38, 81, 92, 232, 212, 2, 39, 161, 160, 220, 225, 64, 179, 116, 152, 134, 201, 24, 247, 46, 229, 172, 187, 192, 107, 29, 87, 182, 65, 53, 121, 181, 113, 162, 53, 108, 108, 117, 0, 220, 51, 222, 116, 105, 167, 189, 136, 130, 249, 104, 107, 179, 105, 46, 26, 193, 230, 227, 147, 47, 15, 120, 94, 31, 93, 137, 78, 209, 125, 90, 115, 100, 167, 131, 32, 108, 92, 10, 124, 153, 138, 78, 147, 4, 90, 110, 73, 102, 104, 101, 81, 51, 142, 53, 22, 242, 202, 192, 32, 89, 121, 243, 72, 132, 68, 253, 102, 59, 90, 49, 106, 99, 187, 51, 133, 206, 121, 14, 30, 193, 153, 101, 53, 98, 212, 251, 194, 91, 202, 116, 188, 188, 89, 126, 117, 240, 129, 236, 82, 117, 229, 218, 115, 209, 202, 127, 157, 113, 118, 115, 197, 84, 231, 77, 175, 182, 182, 221, 204, 227, 128, 42, 172, 113, 224, 240, 175, 159, 113, 243, 227, 213, 10, 121, 186, 218, 247, 26, 252, 12, 249, 242, 121, 32, 55, 56, 3, 85, 162, 181, 134, 78, 254, 65, 248, 58, 187, 118, 232, 92, 11, 239, 176, 233, 35, 128, 170, 221, 237, 198, 48, 127, 43, 143, 217, 218, 255, 156, 22, 143, 11, 53, 234, 142, 43, 140, 147, 78, 153, 191, 38, 229, 21, 224, 243, 0, 93, 39, 215, 78, 42, 78, 4, 82, 41, 78, 121, 23, 244, 194, 19, 41, 40, 211, 226, 10, 180, 202, 47, 138, 122, 10, 232, 115, 68, 132, 84, 77, 78, 190, 55, 73, 52, 205, 118, 149, 152, 88, 170, 206, 197, 37, 48, 16, 117, 204, 76, 110, 61, 109, 244, 166, 152, 225, 195, 128, 164, 88, 17, 208, 161, 188, 36, 246, 81, 91, 147, 102, 213, 186, 214, 226, 186, 218, 148, 49, 253, 9, 144, 212, 147, 100, 3, 188, 178, 203, 173, 246, 143, 155, 93, 240, 177, 17, 142, 118, 217, 95, 158, 225, 49, 161, 53, 114, 15, 173, 86, 142, 204, 36, 13, 176, 56, 72, 169, 119, 118, 175, 77, 5, 59, 37, 242, 79, 200, 48, 198, 108, 44, 129, 82, 21, 231, 125, 19, 26, 173, 145, 16, 67, 233, 134, 36, 86, 30, 182, 187, 96, 121, 141, 15, 137, 44, 193, 253, 16, 242, 79, 139, 166, 69, 57, 182, 164, 253, 216, 62, 223, 74, 190, 245, 249, 157, 2, 135, 54, 47, 8, 24, 209, 49, 186, 189, 179, 202, 216, 207, 184, 16, 251, 153, 162, 129, 129, 26, 50, 26, 53, 155, 179, 152, 74, 110, 86, 176, 25, 88, 110, 165, 25, 11, 187, 216, 100, 196, 72, 174, 143, 152, 86, 88, 222, 11, 16, 16, 2, 25, 70, 157, 164, 155, 184, 158, 19, 73, 155, 10, 116, 172, 160, 132, 249, 136, 215, 50, 132, 72, 119, 113, 245, 167, 88, 115, 31, 224, 130, 196, 191, 177, 50, 171, 22, 100, 167, 151, 170, 166, 229, 241, 128, 218, 4, 12, 68, 54, 8, 199, 92, 97, 66, 59, 11, 167, 251, 49, 157, 75, 183, 43, 142, 131, 195, 98, 14, 218, 73, 1, 112, 17, 141, 196, 137, 193, 163, 143, 136, 170, 211, 72, 62, 33, 244, 40, 67, 184, 21, 241, 178, 169, 63, 19, 140, 0, 220, 91, 81, 151, 151, 98, 251, 244, 171, 181, 93, 89, 3, 170, 187, 13, 247, 65, 240, 170, 5, 245, 62, 81, 76, 30, 196, 196, 108, 249, 178, 175, 74, 11, 27, 236, 70, 33, 161, 136, 218, 44, 32, 159, 148, 211, 195, 115, 200, 10, 109, 220, 0, 82, 186, 224, 157, 96, 132, 97, 146, 0, 227, 50, 158, 66, 62, 55, 62, 216, 199, 140, 38, 43, 54, 134, 148, 80, 218, 37, 71, 187, 65, 181, 117, 74, 34, 178, 121, 70, 56, 198, 68, 66, 190, 109, 152, 154, 113, 149, 101, 228, 66, 177, 81, 125, 181, 90, 115, 88, 228, 150, 172, 239, 107, 117, 233, 202, 203, 223, 57, 140, 116, 82, 252, 177, 93, 176, 175, 46, 3, 148, 171, 163, 16, 86, 210, 167, 161, 34, 118, 114, 67, 113, 251, 119, 165, 85, 34, 175, 217, 134, 134, 70, 161, 118, 95, 230, 209, 197, 181, 254, 250, 235, 251, 135, 171, 38, 16, 233, 255, 208, 224, 230, 137, 211, 117, 84, 250, 150, 132, 1, 44, 70, 201, 194, 213, 35, 26, 28, 142, 204, 28, 166, 216, 29, 40, 203, 23, 165, 241, 166, 47, 222, 60, 201, 5, 2, 14, 172, 240, 131, 32, 0, 232, 39, 65, 198, 20, 107, 113, 109, 83, 7, 204, 198, 104, 148, 56, 89, 194, 153, 69, 10, 120, 114, 104, 24, 219, 21, 85, 231, 196, 161, 176, 149, 27, 80, 13, 107, 198, 101, 240, 104, 30, 45, 74, 38, 224, 117, 72, 234, 71, 195, 69, 158, 155, 206, 241, 132, 110, 51, 20, 199, 21, 183, 7, 44, 4, 99, 97, 205, 230, 166, 71, 143, 2, 184, 49, 2, 230, 211, 241, 49, 50, 47, 48, 74, 7, 189, 229, 31, 240, 24, 95, 238, 245, 55, 20, 79, 134, 100, 175, 87, 58, 9, 136, 212, 167, 9, 196, 80, 132, 159, 139, 112, 73, 139, 33, 58, 66, 21, 17, 1, 154, 21, 220, 86, 89, 174, 218, 196, 86, 88, 110, 144, 78, 109, 67, 83, 29, 130, 241, 229, 52, 134, 206, 211, 55, 62, 174, 255, 168, 75, 223, 177, 35, 236, 179, 238, 26, 136, 252, 0, 167, 129, 239, 163, 220, 169, 119, 195, 171, 51, 199, 77, 217, 166, 87, 214, 5, 71, 106, 38, 240, 251, 80, 136, 129, 101, 7, 180, 235, 213, 148, 110, 212, 239, 131, 118, 174, 28, 127, 251, 212, 201, 222, 135, 88, 67, 136, 89, 141, 81, 200, 148, 0, 78, 151, 72, 40, 216, 70, 44, 228, 73, 66, 211, 131, 228, 223, 221, 129, 211, 182, 182, 8, 196, 177, 68, 94, 114, 230, 145, 32, 87, 164, 244, 171, 245, 202, 141, 189, 236, 141, 26, 7, 202, 244, 122, 200, 137, 194, 199, 212, 113, 157, 27, 121, 242, 3, 8, 222, 81, 196, 147, 215, 180, 83, 218, 75, 164, 121, 213, 125, 142, 118, 17, 199, 234, 6, 57, 146, 53, 106, 19, 51, 13, 100, 50, 232, 128, 36, 234, 103, 240, 72, 82, 183, 5, 25, 86, 205, 208, 166, 0, 39, 173, 23, 197, 116, 191, 225, 83, 200, 24, 154, 17, 5, 139, 244, 123, 120, 47, 24, 84, 69, 61, 108, 125, 19, 152, 127, 85, 20, 131, 245, 230, 240, 13, 129, 2, 77, 67, 216, 244, 176, 17, 175, 135, 115, 119, 33, 155, 160, 24, 64, 131, 72, 162, 203, 212, 133, 133, 174, 155, 250, 101, 199, 117, 235, 250, 201, 133, 143, 98, 37, 165, 190, 159, 212, 30, 136, 217, 61, 133, 1, 90, 57, 172, 36, 237, 144, 38, 238, 213, 32, 243, 137, 112, 49, 152, 109, 211, 206, 74, 51, 191, 211, 101, 213, 214, 156, 114, 88, 165, 253, 204, 222, 73, 71, 122, 42, 121, 246, 139, 248, 90, 144, 13, 143, 28, 116, 248, 87, 63, 173, 37, 24, 98, 138, 75, 12, 10, 24, 131, 98, 124, 237, 255, 51, 140, 3, 151, 66, 158, 233, 184, 240, 196, 237, 136, 72, 95, 209, 125, 108, 106, 138, 206, 157, 250, 120, 17, 140, 40, 101, 5, 161, 175, 68, 95, 252, 246, 43, 183, 223, 130, 209, 26, 2, 14, 204, 191, 186, 10, 206, 126, 145, 236, 209, 122, 70, 194, 106, 248, 133, 109, 175, 34, 162, 20, 246, 66, 237, 118, 244, 196, 228, 164, 41, 185, 189, 77, 169, 157, 216, 9, 146, 191, 137, 170, 186, 216, 111, 209, 191, 149, 112, 105, 68, 171, 58, 21, 39, 68, 161, 64, 108, 78, 122, 28, 24, 119, 163, 224, 119, 223, 236, 69, 194, 235, 16, 188, 113, 28, 14, 253, 192, 30, 223, 140, 128, 78, 250, 170, 185, 53, 251, 249, 255, 152, 18, 81, 130, 95, 116, 169, 103, 145, 16, 122, 232, 255, 20, 227, 217, 79, 215, 191, 122, 193, 2, 68, 62, 154, 139, 57, 88, 18, 66, 222, 85, 27, 221, 73, 101, 67, 89, 10, 51, 180, 244, 39, 193, 48, 172, 246, 118, 127, 146, 135, 88, 31, 148, 57, 249, 146, 30, 22, 1, 8, 244, 225, 70, 216, 178, 25, 42, 145, 153, 118, 22, 62, 169, 123, 239, 12, 49, 240, 151, 218, 76, 154, 243, 47, 219, 151, 139, 232, 169, 206, 203, 106, 77, 119, 167, 58, 54, 20, 133, 105, 120, 251, 17, 205, 133, 236, 189, 238, 100, 220, 201, 34, 25, 49, 176, 80, 189, 72, 173, 12, 117, 196, 16, 20, 141, 106, 85, 251, 229, 160, 20, 209, 173, 82, 40, 254, 107, 0, 206, 221, 197, 235, 158, 114, 130, 20, 25, 249, 133, 23, 230, 220, 152, 135, 203, 184, 34, 52, 64, 137, 114, 145, 39, 254, 229, 94, 168, 203, 252, 89, 127, 250, 253, 202, 62, 32, 113, 247, 232, 24, 58, 36, 210, 52, 53, 11, 122, 238, 177, 163, 229, 18, 242, 180, 134, 182, 211, 149, 27, 238, 142, 254, 17, 17, 16, 209, 81, 40, 50, 188, 6, 233, 77, 245, 191, 233, 81, 204, 13, 228, 128, 27, 123, 98, 88, 154, 180, 120, 76, 173, 44, 225, 0, 109, 175, 109, 174, 183, 247, 165, 118, 227, 13, 38, 44, 132, 77, 208, 106, 78, 110, 45, 128, 128, 205, 195, 79, 47, 248, 117, 216, 226, 147, 87, 226, 210, 139, 233, 223, 10, 22, 254, 119, 231, 81, 127, 41, 116, 204, 131, 244, 154, 63, 170, 93, 123, 141, 218, 105, 102, 96, 201, 249, 96, 75, 117, 217, 25, 146, 81, 44, 116, 7, 15, 183, 252, 167, 175, 231, 245, 82, 98, 62, 156, 92, 125, 45, 32, 153, 104, 176, 229, 61, 166, 50, 98, 254, 191, 21, 249, 63, 100, 88, 48, 43, 111, 251, 159, 219, 220, 81, 76, 158, 167, 206, 222, 156, 217, 179, 253, 106, 229, 91, 252, 121, 36, 105, 114, 221, 108, 46, 26, 95, 16, 99, 29, 59, 54, 131, 80, 66, 205, 7, 79, 252, 147, 192, 244, 195, 206, 230, 96, 211, 36, 209, 232, 193, 176, 126, 68, 254, 243, 68, 182, 213, 254, 130, 48, 211, 218, 252, 164, 57, 132, 61, 118, 219, 69, 108, 153, 154, 130, 123, 80, 126, 120, 253, 239, 203, 20, 111, 98, 149, 10, 4, 16, 57, 205, 93, 196, 250, 150, 192, 205, 199, 63, 169, 141, 41, 193, 177, 233, 178, 203, 0, 156, 160, 81, 129, 226, 193, 78, 98, 230, 230, 202, 134, 0, 72, 51, 153, 238, 108, 35, 46, 94, 205, 219, 134, 152, 198, 163, 28, 35, 218, 110, 68, 19, 4, 74, 28, 101, 72, 105, 116, 129, 147, 23, 169, 206, 13, 129, 240, 211, 104, 194, 102, 113, 45, 32, 122, 6, 71, 249, 80, 71, 70, 15, 122, 98, 9, 163, 82, 216, 216, 24, 105, 104, 250, 57, 147, 226, 214, 33, 159, 171, 246, 224, 168, 157, 2, 3, 127, 176, 154, 236, 12, 163, 46, 119, 77, 167, 114, 116, 201, 229, 188, 32, 102, 61, 218, 207, 241, 97, 97, 223, 34, 20, 89, 101, 144, 249, 203, 56, 240, 109, 136, 189, 63, 188, 162, 215, 154, 112, 187, 168, 86, 85, 128, 74, 137, 13, 18, 26, 215, 111, 93, 172, 184, 86, 19, 197, 177, 21, 157, 28, 108, 212, 145, 67, 11, 204, 49, 217, 252, 7, 183, 62, 235, 120, 226, 9, 28, 3, 253, 46, 239, 31, 125, 110, 153, 206, 221, 180, 78, 187, 99, 130, 38, 1, 252, 24, 185, 76, 176, 248, 6, 69, 152, 247, 102, 119, 56, 61, 206, 96, 62, 80, 215, 115, 172, 155, 105, 220, 205, 233, 39, 166, 113, 186, 154, 6, 127, 53, 108, 149, 95, 95, 228, 109, 224, 50, 195, 231, 14, 119, 225, 46, 6, 1, 60, 196, 30, 115, 33, 179, 154, 205, 56, 32, 7, 121, 77, 94, 180, 133, 199, 107, 210, 22, 74, 152, 234, 187, 252, 147, 217, 44, 220, 166, 55, 172, 94, 167, 189, 30, 19, 104, 137, 157, 218, 9, 159, 156, 101, 92, 67, 180, 100, 150, 60, 78, 21, 82, 254, 233, 28, 78, 3, 127, 28, 181, 125, 169, 109, 143, 61, 92, 174, 231, 115, 219, 142, 190, 108, 156, 96, 91, 21, 146, 84, 86, 47, 100, 177, 107, 153, 132, 107, 77, 119, 148, 162, 167, 140, 55, 214, 250, 137, 159, 218, 157, 21, 35, 190, 22, 50, 53, 182, 60, 214, 18, 58, 229, 206, 95, 109, 103, 0, 129, 4, 235, 24, 196, 77, 56, 109, 109, 51, 122, 129, 219, 208, 123, 23, 75, 23, 92, 156, 148, 187, 6, 27, 211, 246, 23, 153, 190, 29, 182, 54, 143, 218, 63, 79, 242, 132, 170, 168, 101, 180, 62, 165, 178, 73, 133, 19, 66, 81, 93, 106, 255, 133, 138, 112, 108, 97, 245, 246, 127, 211, 65, 90, 194, 73, 34, 33, 76, 253, 97, 64, 129, 37, 210, 118, 49, 226, 91, 169, 184, 96, 98, 66, 214, 42, 128, 85, 245, 213, 161, 73, 133, 89, 65, 195, 248, 75, 154, 116, 18, 14, 207, 210, 172, 10, 152, 186, 190, 52, 245, 12, 251, 133, 74, 201, 114, 48, 245, 21, 58, 190, 143, 36, 177, 134, 224, 5, 239, 191, 100, 208, 95, 151, 45, 236, 7, 147, 39, 135, 3, 190, 243, 45, 170, 237, 56, 57, 143, 214, 114, 67, 96, 153, 217, 126, 200, 182, 141, 220, 83, 95, 176, 15, 24, 154, 227, 207, 92, 61, 70, 77, 249, 26, 214, 149, 129, 9, 179, 241, 205, 90, 217, 214, 0, 81, 221, 208, 10, 26, 23, 102, 55, 219, 240, 151, 179, 33, 7, 180, 248, 50, 4, 166, 231, 208, 132, 231, 42, 103, 244, 7, 80, 176, 85, 72, 2, 236, 112, 214, 9, 29, 252, 155, 168, 77, 231, 202, 3, 18, 208, 20, 140, 71, 183, 23, 64, 251, 228, 80, 134, 123, 145, 205, 247, 14, 137, 16, 117, 24, 34, 229, 135, 187, 63, 89, 88, 67, 240, 203, 116, 37, 87, 207, 109, 229, 79, 251, 250, 108, 110, 251, 116, 197, 36, 219, 54, 223, 179, 117, 227, 13, 62, 26, 178, 170, 235, 237, 72, 70, 178, 232, 222, 217, 13, 41, 74, 90, 106, 20, 42, 48, 232, 103, 143, 109, 133, 146, 244, 182, 127, 49, 106, 153, 4, 40, 46, 61, 64, 0, 33, 147, 62, 128, 11, 242, 84, 60, 239, 156, 211, 61, 169, 216, 105, 59, 241, 130, 14, 164, 79, 100, 74, 219, 146, 137, 178, 216, 25, 83, 38, 76, 202, 217, 60, 242, 139, 59, 144, 145, 51, 99, 92, 121, 252, 219, 231, 117, 126, 36, 57, 181, 81, 12, 91, 53, 58, 141, 233, 41, 5, 82, 248, 162, 49, 234, 242, 101, 200, 181, 184, 124, 110, 125, 169, 84, 157, 239, 166, 177, 35, 248, 166, 194, 91, 163, 222, 131, 59, 244, 205, 211, 72, 168, 108, 198, 47, 61, 155, 19, 102, 35, 209, 27, 148, 16, 73, 85, 83, 159, 194, 167, 85, 185, 32, 105, 183, 215, 113, 44, 84, 147, 170, 81, 42, 150, 85, 28, 146, 89, 197, 49, 237, 85, 92, 181, 48, 161, 222, 60, 17, 132, 240, 229, 51, 14, 100, 29, 233, 142, 67, 162, 81, 14, 9, 163, 192, 101, 215, 221, 11, 197, 227, 181, 250, 242, 205, 58, 30, 74, 11, 252, 36, 49, 217, 221, 54, 116, 110, 30, 104, 35, 192, 7, 157, 194, 138, 204, 102, 139, 212, 54, 101, 27, 69, 244, 202, 157, 42, 210, 255, 113, 48, 21, 98, 233, 204, 26, 164, 101, 71, 184, 58, 231, 115, 31, 48, 221, 36, 154, 220, 5, 147, 109, 121, 227, 147, 212, 50, 228, 28, 86, 244, 214, 215, 228, 14, 45, 142, 182, 240, 174, 124, 129, 32, 115, 153, 21, 226, 48, 192, 44, 41, 255, 39, 94, 68, 2, 21, 48, 204, 79, 203, 177, 153, 144, 40, 189, 234, 103, 217, 157, 35, 103, 208, 5, 131, 119, 209, 52, 22, 203, 81, 0, 187, 21, 75, 102, 214, 175, 246, 107, 106, 123, 159, 201, 198, 140, 104, 220, 155, 147, 21, 35, 73, 102, 59, 69, 5, 173, 242, 246, 123, 204, 189, 0, 198, 64, 225, 26, 218, 176, 86, 14, 123, 162, 240, 196, 70, 173, 231, 227, 231, 234, 19, 242, 117, 18, 57, 20, 70, 196, 149, 139, 225, 162, 115, 120, 238, 147, 227, 89, 191, 1, 166, 157, 98, 130, 245, 31, 220, 125, 192, 100, 190, 178, 3, 207, 218, 232, 195, 127, 170, 162, 66, 218, 240, 176, 148, 69, 75, 203, 36, 244, 102, 142, 103, 153, 79, 21, 219, 239, 115, 197, 220, 122, 50, 177, 104, 95, 77, 40, 109, 30, 47, 250, 199, 106, 64, 245, 90, 209, 177, 246, 130, 138, 217, 214, 183, 132, 80, 251, 118, 121, 236, 227, 84, 49, 15, 88, 26, 45, 165, 182, 172, 77, 144, 186, 138, 249, 45, 189, 22, 134, 130, 136, 65, 235, 170, 82, 47, 69, 207, 116, 35, 98, 156, 127, 195, 0, 15, 155, 171, 31, 118, 177, 121, 189, 156, 184, 66, 200, 46, 83, 78, 199, 250, 125, 124, 218, 56, 110, 227, 213, 228, 160, 122, 237, 213, 236, 26, 182, 114, 99, 114, 213, 187, 214, 3, 209, 214, 201, 28, 206, 115, 167, 104, 121, 12, 123, 220, 2, 80, 15, 147, 155, 61, 113, 111, 216, 126, 108, 117, 87, 20, 193, 9, 44, 162, 207, 188, 155, 22, 104, 122, 214, 166, 125, 97, 221, 134, 143, 98, 26, 166, 240, 182, 155, 250, 73, 108, 154, 137, 66, 41, 191, 92, 170, 139, 4, 19, 104, 13, 36, 43, 121, 150, 218, 159, 60, 110, 29, 82, 99, 105, 51, 95, 150, 12, 38, 135, 50, 39, 83, 191, 9, 83, 95, 239, 5, 238, 236, 255, 56, 136, 42, 148, 247, 211, 242, 230, 189, 126, 140, 125, 42, 196, 65, 110, 20, 252, 85, 50, 81, 153, 120, 191, 118, 180, 166, 84, 98, 92, 6, 136, 250, 72, 20, 95, 55, 131, 136, 84, 8, 159, 189, 236, 89, 207, 14, 204, 212, 141, 185, 217, 162, 33, 233, 27, 3, 128, 17, 83, 218, 80, 211, 206, 5, 27, 217, 121, 15, 75, 177, 82, 45, 107, 12, 44, 175, 152, 191, 2, 113, 211, 144, 64, 2, 84, 237, 156, 41, 54, 83, 38, 138, 146, 46, 247, 231, 72, 99, 188, 203, 181, 103, 32, 87, 176, 130, 179, 40, 244, 4, 206, 175, 15, 146, 97, 100, 158, 80, 13, 40, 114, 254, 221, 118, 79, 230, 147, 33, 76, 126, 86, 142, 45, 120, 83, 62, 106, 167, 168, 107, 32, 141, 236, 82, 95, 4, 218, 160, 20, 240, 81, 152, 104, 150, 146, 139, 45, 42, 245, 181, 48, 10, 197, 228, 69, 213, 63, 54, 231, 177, 152, 246, 43, 70, 110, 60, 206, 185, 154, 159, 37, 91, 243, 64, 52, 198, 160, 51, 167, 44, 180, 159, 191, 214, 172, 81, 183, 83, 197, 227, 250, 208, 107, 209, 202, 246, 32, 1, 224, 133, 125, 142, 202, 227, 85, 69, 170, 112, 93, 123, 43, 176, 225, 0, 146, 223, 28, 9, 74, 226, 103, 216, 21, 199, 148, 128, 239, 206, 89, 15, 79, 205, 15, 160, 65, 135, 206, 78, 144, 229, 156, 32, 201, 208, 154, 183, 227, 137, 210, 122, 61, 195, 240, 41, 170, 231, 210, 18, 65, 131, 222, 22, 161, 96, 49, 100, 18, 125, 16, 176, 35, 118, 233, 91, 133, 182, 209, 216, 162, 80, 100, 62, 224, 219, 46, 27, 181, 87, 189, 79, 165, 252, 63, 17, 209, 184, 89, 165, 209, 12, 225, 232, 181, 193, 101, 114, 100, 191, 141, 120, 81, 254, 65, 155, 46, 103, 65, 101, 95, 139, 184, 74, 27, 99, 129, 116, 119, 107, 29, 26, 237, 118, 167, 106, 64, 171, 227, 130, 235, 26, 187, 55, 149, 37, 73, 41, 191, 229, 164, 131, 24, 140, 35, 236, 11, 247, 161, 224, 185, 192, 92, 86, 174, 87, 100, 106, 144, 164, 178, 164, 242, 26, 240, 160, 84, 122, 151, 241, 159, 238, 73, 21, 232, 125, 162, 60, 128, 190, 135, 114, 207, 232, 238, 81, 47, 180, 220, 59, 187, 217, 142, 133, 125, 28, 99, 132, 41, 124, 121, 159, 131, 238, 114, 59, 144, 99, 209, 112, 37, 168, 21, 246, 117, 22, 115, 2, 78, 68, 40, 244, 252, 26, 163, 113, 206, 207, 201, 225, 126, 47, 90, 85, 106, 32, 181, 221, 27, 63, 19, 192, 25, 210, 12, 2, 74, 228, 217, 200, 134, 67, 66, 1, 103, 206, 107, 29, 114, 247, 241, 127, 9, 152, 210, 217, 109, 35, 180, 77, 52, 195, 50, 86, 245, 37, 47, 96, 150, 52, 226, 10, 88, 241, 231, 213, 132, 246, 42, 245, 103, 188, 1, 77, 245, 220, 232, 141, 43, 231, 85, 30, 73, 26, 181, 222, 246, 15, 55, 152, 28, 14, 116, 83, 248, 138, 33, 245, 68, 107, 239, 49, 37, 132, 150, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 91, 143, 38, 144, 250, 52, 197, 232, 84, 253, 128, 176, 55, 106, 128, 51, 193, 106, 219, 130, 220, 99, 125, 19, 2, 94, 195, 168, 172, 200, 184, 142, 200, 230, 75, 179, 75, 87, 228, 89, 67, 42, 200, 97, 236, 184, 125, 204, 179, 193, 111, 21, 32, 31, 10, 164, 198, 106, 117, 148, 189, 62, 21, 46, 220, 120, 243, 129, 73, 138, 108, 48, 141, 129, 198, 51, 42, 90, 20, 228, 218, 139, 214, 87, 212, 15, 40, 126, 51, 151, 117, 84, 172, 184, 120, 74, 32, 199, 146, 102, 164, 102, 195, 248, 198, 78, 203, 110, 39, 115, 128, 169, 182, 67, 67, 201, 68, 213, 62, 253, 124, 112, 243, 145, 205, 152, 123, 185, 61, 16, 217, 101, 173, 137, 39, 46, 101, 6, 178, 203, 85, 109, 105, 253, 16, 134, 134, 198, 60, 240, 57, 250, 215, 211, 64, 12, 102, 203, 155, 198, 19, 155, 97, 180, 9, 49, 148, 185, 25, 219, 34, 107, 217, 198, 166, 224, 245, 193, 153, 182, 181, 8, 60, 80, 242, 125, 255, 229, 80, 67, 48, 82, 224, 234, 231, 51, 144, 209, 183, 80, 147, 109, 241, 228, 45, 124, 39, 18, 207, 3, 19, 166, 187, 12, 127, 189, 137, 24, 243, 17, 156, 66, 45, 152, 200, 254, 20, 94, 192, 139, 209, 249, 25, 83, 33, 169, 198, 30, 92, 86, 242, 242, 65, 128, 196, 9, 113, 73, 169, 10, 250, 153, 43, 160, 158, 152, 95, 13, 1, 184, 92, 165, 74, 212, 205, 119, 126, 128, 222, 119, 168, 147, 220, 210, 235, 66, 7, 214, 227, 194, 192, 222, 219, 0, 110, 79, 231, 61, 82, 156, 247, 7, 52, 40, 127, 74, 27, 68, 154, 47, 200, 124, 27, 195, 249, 11, 171, 87, 48, 106, 32, 5, 216, 127, 66, 73, 101, 114, 89, 172, 182, 53, 201, 244, 16, 22, 156, 251, 33, 117, 212, 169, 104, 200, 201, 5, 219, 109, 3, 214, 254, 181, 234, 87, 168, 230, 134, 144, 194, 101, 186, 220, 75, 164, 101, 199, 43, 216, 148, 68, 234, 253, 94, 230, 187, 97, 171, 234, 69, 141, 132, 63, 55, 107, 57, 48, 148, 21, 77, 254, 184, 180, 251, 35, 204, 70, 64, 113, 5, 197, 147, 151, 187, 217, 68, 149, 3, 244, 163, 250, 234, 41, 109, 121, 63, 111, 201, 17, 215, 49, 84, 232, 136, 251, 33, 5, 150, 24, 52, 126, 59, 232, 188, 60, 192, 11, 143, 171, 52, 75, 189, 111, 88, 159, 225, 36, 8, 15, 151, 14, 114, 7, 40, 203, 213, 109, 97, 57, 24, 173, 21, 157, 107, 69, 218, 157, 156, 97, 93, 152, 214, 206, 13, 93, 98, 106, 111, 165, 15, 129, 32, 111, 139, 146, 8, 219, 203, 227, 108, 170, 95, 189, 32, 187, 87, 135, 109, 108, 27, 144, 180, 137, 180, 44, 41, 250, 130, 84, 110, 61, 137, 219, 8, 98, 62, 208, 125, 189, 3, 153, 88, 60, 83, 21, 248, 206, 231, 44, 7, 151, 129, 134, 60, 71, 204, 5, 137, 125, 123, 243, 134, 38, 37, 210, 15, 200, 211, 246, 227, 194, 117, 138, 209, 157, 65, 135, 214, 32, 223, 185, 57, 180, 243, 112, 212, 102, 35, 29, 222, 11, 238, 47, 93, 159, 171, 231, 61, 214, 211, 19, 182, 160, 11, 242, 106, 56, 23, 128, 66, 227, 189, 44, 235, 42, 37, 40, 5, 91, 188, 93, 136, 196, 237, 22, 10, 2, 9, 255, 21, 211, 32, 71, 84, 210, 207, 185, 195, 244, 149, 168, 73, 140, 175, 113, 37, 84, 28, 52, 156, 109, 141, 56, 135, 164, 236, 151, 252, 43, 200, 220, 149, 35, 187, 57, 169, 153, 206, 192, 182, 149, 4, 107, 16, 253, 151, 70, 237, 54, 199, 93, 137, 162, 243, 102, 166, 147, 79, 244, 117, 81, 40, 151, 158, 115, 15, 68, 76, 185, 229, 215, 236, 2, 171, 52, 25, 79, 133, 215, 81, 250, 43, 158, 104, 160, 255, 153, 242, 243, 177, 123, 76, 6, 226, 51, 149, 144, 150, 221, 38, 44, 221, 160, 219, 240, 119, 198, 227, 215, 95, 91, 231, 179, 41, 240, 146, 108, 158, 106, 53, 138, 232, 229, 112, 65, 179, 87, 41, 118, 89, 15, 31, 226, 97, 174, 61, 228, 244, 91, 121, 215, 231, 81, 181, 120, 3, 224, 141, 50, 165, 139, 52, 191, 67, 229, 231, 53, 153, 6, 17, 93, 199, 43, 229, 76, 252, 177, 4, 60, 152, 127, 98, 182, 90, 188, 167, 147, 73, 3, 34, 81, 111, 54, 177, 92, 133, 161, 135, 40, 247, 252, 117, 15, 13, 104, 237, 135, 106, 197, 199, 71, 4, 105, 247, 210, 81, 37, 82, 48, 162, 144, 205, 236, 51, 83, 195, 144, 33, 240, 128, 118, 109, 157, 186, 224, 230, 91, 78, 170, 116, 211, 148, 253, 75, 154, 127, 205, 184, 215, 194, 233, 187, 173, 192, 65, 239, 182, 235, 176, 98, 184, 182, 125, 126, 86, 85, 156, 0, 85, 254, 169, 176, 75, 85, 36, 47, 255, 34, 65, 11, 214, 42, 155, 227, 147, 200, 81, 25, 151, 165, 107, 46, 225, 157, 241, 181, 34, 248, 143, 171, 204, 171, 169, 186, 3, 217, 119, 149, 3, 231, 87, 113, 16, 27, 9, 106, 83, 28, 217, 202, 31, 158, 172, 144, 227, 94, 130, 62, 221, 10, 17, 158, 200, 144, 149, 159, 183, 17, 15, 122, 158, 195, 92, 43, 204, 82, 59, 205, 164, 25, 39, 52, 198, 218, 242, 213, 156, 159, 157, 106, 76, 146, 121, 43, 31, 76, 153, 94, 13, 156, 239, 222, 153, 203, 178, 226, 129, 143, 229, 113, 165, 163, 85, 31, 58, 15, 233, 217, 152, 226, 14, 45, 87, 169, 51, 130, 8, 218, 29, 88, 237, 211, 204, 67, 139, 25, 99, 232, 47, 107, 164, 217, 59, 70, 235, 221, 20, 227, 232, 61, 92, 126, 169, 133, 12, 225, 85, 62, 41, 155, 143, 246, 242, 146, 191, 218, 104, 120, 27, 66, 188, 240, 133, 95, 112, 69, 62, 68, 206, 151, 246, 132, 187, 135, 243, 191, 137, 195, 246, 154, 141, 81, 219, 117, 119, 91, 254, 216, 220, 179, 172, 178, 255, 227, 148, 191, 25, 1, 176, 28, 177, 85, 107, 100, 119, 102, 41, 198, 106, 189, 184, 161, 230, 56, 71, 229, 237, 3, 87, 14, 218, 31, 102, 171, 213, 57, 40, 124, 186, 242, 160, 169, 105, 27, 249, 190, 236, 223, 128, 199, 33, 112, 114, 142, 58, 17, 108, 17, 45, 76, 139, 133, 236, 241, 17, 99, 48, 60, 1, 43, 13, 212, 175, 135, 146, 103, 255, 236, 211, 212, 165, 254, 212, 63, 141, 122, 115, 72, 39, 119, 115, 144, 167, 27, 102, 115, 50, 234, 226, 201, 13, 247, 26, 234, 154, 142, 159, 98, 242, 104, 249, 36, 230, 119, 151, 1, 239, 1, 4, 88, 69, 186, 205, 220, 90, 209, 59, 78, 141, 157, 28, 206, 123, 90, 224, 129, 210, 194, 48, 86, 91, 244, 127, 62, 242, 187, 171, 93, 77, 208, 125, 44, 96, 34, 103, 224, 125, 205, 187, 165, 52, 160, 85, 206, 187, 6, 117, 6, 198, 66, 251, 109, 43, 183, 176, 32, 21, 187, 123, 88, 251, 12, 68, 107, 58, 58, 51, 68, 24, 20, 136, 6, 93, 67, 25, 3, 84, 83, 115, 241, 244, 114, 44, 185, 72, 250, 35, 163, 170, 29, 134, 145, 9, 134, 54, 236, 115, 200, 210, 85, 75, 19, 142, 2, 254, 218, 52, 94, 1, 116, 241, 54, 165, 94, 37, 198, 95, 115, 27, 43, 225, 150, 144, 122, 214, 218, 204, 235, 55, 255, 100, 133, 235, 205, 221, 169, 221, 35, 189, 120, 113, 195, 254, 219, 245, 22, 170, 241, 170, 212, 142, 19, 86, 195, 181, 102, 237, 118, 145, 119, 162, 31, 148, 96, 172, 30, 254, 162, 138, 223, 14, 50, 58, 98, 62, 184, 114, 68, 130, 68, 59, 86, 22, 110, 64, 173, 92, 36, 177, 150, 100, 51, 253, 27, 30, 105, 218, 3, 110, 238, 134, 213, 101, 155, 125, 37, 65, 13, 117, 126, 241, 172, 139, 81, 188, 145, 114, 43, 48, 232, 170, 123, 162, 25, 55, 125, 109, 198, 25, 236, 104, 114, 193, 40, 24, 236, 62, 19, 220, 246, 187, 220, 237, 33, 212, 203, 121, 252, 173, 220, 69, 55, 195, 141, 170, 229, 198, 172, 207, 216, 47, 31, 4, 119, 4, 223, 17, 1, 165, 74, 159, 212, 179, 3, 94, 188, 201, 236, 217, 103, 211, 237, 179, 88, 128, 216, 143, 115, 42, 229, 224, 214, 20, 172, 246, 6, 123, 87, 218, 4, 126, 112, 94, 195, 152, 52, 144, 126, 56, 96, 179, 90, 205, 178, 36, 183, 110, 19, 139, 184, 188, 166, 236, 192, 116, 124, 133, 45, 54, 133, 198, 118, 24, 176, 74, 203, 170, 183, 142, 121, 205, 66, 162, 234, 32, 43, 204, 130, 142, 253, 248, 22, 9, 121, 125, 194, 149, 166, 60, 224, 97, 104, 183, 14, 99, 97, 186, 163, 186, 255, 58, 243, 133, 140, 57, 16, 43, 155, 123, 159, 54, 47, 73, 75, 59, 61, 197, 181, 82, 85, 1, 8, 96, 102, 75, 26, 195, 76, 250, 255, 224, 100, 250, 240, 2, 100, 183, 246, 223, 85, 149, 220, 217, 238, 167, 235, 44, 51, 162, 190, 35, 202, 100, 194, 61, 98, 27, 29, 140, 192, 146, 138, 62, 215, 0, 53, 248, 204, 47, 11, 102, 117, 206, 77, 71, 143, 200, 225, 98, 57, 48, 177, 162, 71, 27, 159, 248, 177, 188, 167, 91, 181, 126, 60, 131, 58, 153, 110, 234, 152, 122, 251, 43, 106, 191, 71, 204, 55, 54, 97, 45, 72, 67, 236, 114, 137, 255, 235, 165, 187, 112, 214, 193, 158, 117, 114, 42, 104, 216, 142, 127, 121, 176, 32, 74, 5, 106, 164, 170, 80, 185, 162, 115, 244, 50, 65, 200, 141, 48, 222, 227, 119, 129, 165, 132, 183, 241, 49, 27, 42, 14, 193, 160, 215, 215, 53, 173, 238, 62, 205, 163, 238, 47, 164, 107, 176, 180, 121, 75, 4, 162, 50, 201, 56, 252, 171, 135, 200, 12, 248, 197, 215, 141, 97, 231, 127, 240, 45, 22, 107, 26, 167, 252, 68, 211, 109, 68, 110, 84, 253, 144, 38, 122, 128, 10, 206, 33, 88, 196, 93, 111, 66, 161, 216, 191, 2, 137, 123, 50, 94, 21, 123, 160, 137, 90, 12, 188, 179, 215, 170, 193, 69, 132, 236, 148, 130, 229, 202, 67, 31, 51, 253, 133, 242, 198, 238, 145, 234, 84, 99, 240, 24, 8, 71, 202, 16, 166, 36, 108, 26, 129, 251, 125, 19, 111, 99, 230, 136, 14, 39, 65, 185, 42, 91, 199, 0, 249, 253, 35, 206, 131, 82, 54, 215, 111, 61, 242, 155, 31, 22, 114, 233, 51, 99, 114, 121, 223, 202, 222, 196, 42, 90, 42, 109, 216, 175, 193, 225, 180, 231, 62, 203, 119, 153, 94, 227, 24, 0, 239, 26, 227, 26, 48, 50, 76, 194, 210, 1, 206, 43, 90, 249, 203, 119, 115, 71, 86, 209, 74, 110, 250, 121, 63, 73, 247, 23, 34, 201, 50, 133, 165, 177, 130, 88, 198, 141, 144, 110, 242, 211, 19, 91, 234, 118, 105, 41, 124, 224, 208, 212, 51, 3, 231, 251, 154, 122, 53, 136, 189, 11, 149, 221, 234, 179, 180, 61, 120, 123, 197, 237, 189, 182, 154, 76, 139, 100, 95, 107, 168, 37, 158, 160, 230, 79, 147, 200, 70, 151, 141, 151, 64, 179, 21, 232, 192, 211, 50, 238, 143, 123, 133, 57, 105, 117, 56, 28, 29, 146, 91, 81, 240, 142, 142, 73, 8, 218, 54, 131, 163, 93, 86, 86, 153, 166, 153, 89, 32, 214, 2, 216, 77, 139, 26, 115, 104, 152, 118, 115, 185, 179, 165, 6, 55, 179, 57, 82, 19, 240, 135, 236, 235, 221, 135, 88, 130, 186, 207, 15, 24, 81, 87, 237, 98, 123, 192, 113, 235, 230, 201, 222, 93, 29, 194, 23, 166, 36, 228, 5, 188, 64, 50, 233, 116, 109, 88, 43, 169, 171, 156, 21, 161, 142, 24, 189, 135, 25, 105, 58, 183, 33, 102, 252, 142, 117, 33, 113, 134, 234, 196, 2, 146, 75, 15, 214, 48, 238, 81, 193, 32, 216, 190, 170, 160, 73, 183, 131, 44, 95, 146, 100, 45, 115, 145, 14, 64, 107, 210, 88, 85, 246, 13, 111, 181, 11, 105, 143, 226, 170, 97, 72, 110, 89, 121, 176, 130, 124, 131, 66, 86, 163, 46, 247, 14, 228, 107, 52, 10, 150, 227, 65, 15, 126, 198, 226, 25, 88, 3, 15, 61, 247, 119, 172, 245, 199, 180, 167, 80, 109, 166, 49, 174, 111, 254, 158, 133, 158, 85, 181, 98, 165, 106, 54, 26, 14, 107, 65, 227, 255, 249, 240, 3, 214, 244, 240, 24, 147, 25, 5, 8, 211, 232, 197, 12, 144, 214, 42, 44, 65, 242, 150, 148, 120, 160, 131, 217, 201, 62, 115, 65, 217, 193, 180, 111, 89, 217, 48, 25, 70, 38, 58, 6, 207, 50, 104, 49, 124, 68, 112, 35, 190, 161, 162, 86, 157, 174, 153, 168, 5, 247, 110, 81, 53, 233, 199, 54, 52, 28, 176, 122, 107, 18, 211, 5, 169, 138, 173, 53, 111, 120, 151, 171, 234, 96, 241, 145, 153, 128, 153, 19, 203, 81, 129, 130, 154, 126, 24, 1, 125, 252, 171, 71, 115, 137, 20, 67, 102, 158, 120, 135, 20, 121, 34, 18, 72, 117, 49, 140, 134, 82, 141, 213, 222, 193, 86, 9, 172, 55, 27, 160, 99, 4, 35, 2, 82, 69, 164, 15, 23, 150, 150, 196, 114, 132, 62, 124, 210, 25, 87, 14, 132, 245, 174, 165, 164, 15, 93, 179, 39, 32, 89, 66, 42, 109, 91, 120, 35, 36, 173, 201, 211, 103, 56, 62, 62, 5, 127, 24, 44, 149, 94, 180, 20, 227, 186, 67, 31, 206, 231, 26, 241, 162, 87, 111, 89, 62, 217, 216, 110, 27, 36, 37, 83, 62, 134, 3, 122, 3, 36, 239, 91, 161, 225, 2, 175, 185, 73, 229, 74, 37, 111, 52, 169, 199, 35, 111, 183, 71, 31, 187, 126, 67, 12, 224, 206, 28, 27, 123, 180, 68, 24, 162, 47, 88, 50, 175, 74, 25, 25, 18, 168, 151, 95, 14, 239, 148, 161, 46, 38, 59, 119, 226, 217, 192, 232, 142, 135, 21, 154, 205, 77, 123, 50, 235, 38, 127, 99, 184, 191, 184, 208, 199, 85, 181, 20, 112, 55, 187, 76, 7, 98, 183, 119, 168, 255, 188, 254, 191, 127, 173, 11, 23, 30, 71, 30, 196, 244, 230, 232, 51, 51, 164, 234, 6, 55, 8, 213, 177, 117, 98, 92, 69, 222, 27, 192, 90, 108, 179, 62, 173, 143, 70, 62, 114, 200, 67, 58, 168, 19, 150, 62, 28, 127, 101, 170, 112, 169, 167, 187, 150, 242, 233, 184, 133, 181, 18, 177, 40, 80, 78, 77, 175, 201, 121, 165, 131, 3, 217, 19, 204, 91, 160, 13, 120, 174, 200, 188, 31, 236, 70, 141, 124, 167, 221, 135, 20, 141, 168, 227, 113, 220, 246, 71, 14, 92, 63, 152, 253, 55, 81, 177, 110, 97, 100, 208, 5, 179, 47, 100, 148, 58, 194, 36, 35, 23, 20, 251, 224, 89, 107, 113, 209, 139, 6, 240, 139, 172, 98, 154, 178, 155, 192, 240, 67, 97, 116, 42, 17, 237, 234, 181, 237, 222, 19, 198, 118, 198, 115, 117, 24, 214, 113, 158, 208, 128, 108, 241, 125, 178, 222, 151, 94, 252, 162, 160, 108, 72, 114, 190, 212, 63, 197, 115, 183, 147, 150, 196, 3, 210, 150, 207, 24, 198, 35, 236, 5, 100, 8, 254, 254, 220, 101, 157, 12, 184, 34, 43, 54, 7, 241, 5, 211, 112, 234, 52, 20, 182, 50, 75, 118, 92, 199, 109, 168, 130, 165, 157, 188, 223, 45, 31, 59, 136, 199, 216, 86, 181, 209, 198, 189, 134, 60, 97, 79, 208, 42, 129, 117, 103, 38, 218, 182, 224, 64, 227, 136, 211, 43, 103, 250, 253, 208, 9, 135, 128, 34, 245, 98, 201, 212, 143, 152, 12, 79, 92, 51, 96, 105, 42, 77, 125, 64, 74, 238, 229, 255, 162, 205, 206, 221, 116, 250, 148, 68, 252, 36, 253, 10, 233, 57, 66, 60, 206, 194, 125, 35, 37, 106, 243, 70, 232, 157, 84, 201, 25, 171, 124, 169, 143, 107, 176, 166, 235, 151, 13, 19, 44, 118, 20, 253, 43, 62, 34, 190, 190, 190, 203, 123, 232, 66, 71, 55, 192, 228, 198, 67, 52, 62, 4, 50, 230, 5, 3, 99, 139, 157, 58, 119, 157, 57, 81, 130, 164, 67, 118, 22, 145, 107, 246, 62, 211, 57, 252, 252, 132, 230, 3, 147, 235, 172, 77, 56, 52, 174, 134, 145, 215, 225, 65, 46, 222, 151, 73, 107, 4, 204, 144, 216, 33, 125, 99, 144, 130, 60, 157, 150, 72, 19, 193, 50, 55, 83, 141, 167, 193, 247, 230, 84, 250, 126, 193, 14, 1, 94, 25, 21, 244, 52, 121, 218, 50, 13, 184, 35, 31, 182, 107, 86, 220, 76, 156, 167, 87, 52, 82, 70, 47, 114, 82, 132, 93, 150, 110, 150, 73, 149, 28, 78, 251, 96, 100, 151, 80, 128, 167, 249, 96, 104, 169, 161, 171, 123, 153, 85, 111, 185, 168, 70, 214, 130, 84, 47, 184, 22, 81, 175, 187, 211, 156, 100, 65, 29, 181, 217, 27, 9, 242, 149, 225, 136, 59, 206, 159, 228, 218, 102, 55, 170, 159, 97, 124, 221, 44, 242, 221, 210, 201, 143, 15, 9, 179, 56, 0, 25, 67, 173, 69, 117, 92, 107, 69, 28, 148, 141, 141, 115, 45, 189, 28, 141, 18, 216, 18, 197, 79, 126, 145, 138, 67, 51, 29, 194, 149, 125, 62, 227, 229, 143, 29, 229, 89, 21, 44, 108, 88, 102, 140, 230, 137, 23, 18, 142, 165, 82, 11, 106, 215, 158, 188, 53, 148, 235, 181, 214, 46, 31, 209, 96, 187, 246, 199, 116, 133, 49, 246, 251, 15, 70, 107, 169, 167, 85, 245, 84, 132, 22, 145, 153, 25, 81, 174, 169, 229, 103, 161, 34, 143, 67, 225, 114, 150, 73, 119, 157, 194, 215, 96, 56, 199, 211, 133, 214, 254, 198, 36, 252, 55, 6, 123, 99, 39, 53, 102, 178, 155, 20, 60, 69, 192, 39, 121, 9, 41, 170, 30, 39, 160, 229, 223, 160, 9, 155, 208, 55, 168, 193, 48, 64, 142, 20, 198, 0, 14, 102, 226, 206, 145, 53, 86, 73, 22, 223, 59, 182, 203, 10, 136, 220, 34, 220, 183, 178, 101, 116, 73, 246, 104, 118, 83, 78, 110, 184, 223, 123, 239, 10, 9, 94, 181, 105, 91, 85, 145, 110, 46, 194, 76, 7, 76, 56, 205, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const unsigned char * precomputed_onetimeauth_poly1305_a[precomputed_onetimeauth_poly1305_NUM] = { precomputed_onetimeauth_poly1305 + 0, precomputed_onetimeauth_poly1305 + 16, precomputed_onetimeauth_poly1305 + 32, precomputed_onetimeauth_poly1305 + 48, precomputed_onetimeauth_poly1305 + 64, precomputed_onetimeauth_poly1305 + 80, precomputed_onetimeauth_poly1305 + 96, precomputed_onetimeauth_poly1305 + 112, precomputed_onetimeauth_poly1305 + 128, precomputed_onetimeauth_poly1305 + 144, precomputed_onetimeauth_poly1305 + 160, precomputed_onetimeauth_poly1305 + 176, precomputed_onetimeauth_poly1305 + 192, precomputed_onetimeauth_poly1305 + 208, precomputed_onetimeauth_poly1305 + 224, precomputed_onetimeauth_poly1305 + 240, precomputed_onetimeauth_poly1305 + 256, precomputed_onetimeauth_poly1305 + 272, precomputed_onetimeauth_poly1305 + 288, precomputed_onetimeauth_poly1305 + 304, precomputed_onetimeauth_poly1305 + 320, precomputed_onetimeauth_poly1305 + 336, precomputed_onetimeauth_poly1305 + 352, precomputed_onetimeauth_poly1305 + 368, precomputed_onetimeauth_poly1305 + 384, precomputed_onetimeauth_poly1305 + 400, precomputed_onetimeauth_poly1305 + 416, precomputed_onetimeauth_poly1305 + 432, precomputed_onetimeauth_poly1305 + 448, precomputed_onetimeauth_poly1305 + 464, precomputed_onetimeauth_poly1305 + 480, precomputed_onetimeauth_poly1305 + 496, precomputed_onetimeauth_poly1305 + 512, precomputed_onetimeauth_poly1305 + 528, precomputed_onetimeauth_poly1305 + 544, precomputed_onetimeauth_poly1305 + 560, precomputed_onetimeauth_poly1305 + 576, precomputed_onetimeauth_poly1305 + 592, precomputed_onetimeauth_poly1305 + 608, precomputed_onetimeauth_poly1305 + 624, precomputed_onetimeauth_poly1305 + 640, precomputed_onetimeauth_poly1305 + 656, precomputed_onetimeauth_poly1305 + 672, precomputed_onetimeauth_poly1305 + 688, precomputed_onetimeauth_poly1305 + 704, precomputed_onetimeauth_poly1305 + 720, precomputed_onetimeauth_poly1305 + 736, precomputed_onetimeauth_poly1305 + 752, precomputed_onetimeauth_poly1305 + 768, precomputed_onetimeauth_poly1305 + 784, precomputed_onetimeauth_poly1305 + 800, precomputed_onetimeauth_poly1305 + 816, precomputed_onetimeauth_poly1305 + 832, precomputed_onetimeauth_poly1305 + 848, precomputed_onetimeauth_poly1305 + 864, precomputed_onetimeauth_poly1305 + 880, precomputed_onetimeauth_poly1305 + 896, precomputed_onetimeauth_poly1305 + 912, precomputed_onetimeauth_poly1305 + 928, precomputed_onetimeauth_poly1305 + 944, precomputed_onetimeauth_poly1305 + 960, precomputed_onetimeauth_poly1305 + 976, precomputed_onetimeauth_poly1305 + 992, precomputed_onetimeauth_poly1305 + 1008, precomputed_onetimeauth_poly1305 + 1024, precomputed_onetimeauth_poly1305 + 1040, precomputed_onetimeauth_poly1305 + 1056, precomputed_onetimeauth_poly1305 + 1072, precomputed_onetimeauth_poly1305 + 1088, precomputed_onetimeauth_poly1305 + 1104, precomputed_onetimeauth_poly1305 + 1120, precomputed_onetimeauth_poly1305 + 1136, precomputed_onetimeauth_poly1305 + 1152, precomputed_onetimeauth_poly1305 + 1168, precomputed_onetimeauth_poly1305 + 1184, precomputed_onetimeauth_poly1305 + 1200, precomputed_onetimeauth_poly1305 + 1216, precomputed_onetimeauth_poly1305 + 1232, precomputed_onetimeauth_poly1305 + 1248, precomputed_onetimeauth_poly1305 + 1264, precomputed_onetimeauth_poly1305 + 1280, precomputed_onetimeauth_poly1305 + 1296, precomputed_onetimeauth_poly1305 + 1312, precomputed_onetimeauth_poly1305 + 1328, precomputed_onetimeauth_poly1305 + 1344, precomputed_onetimeauth_poly1305 + 1360, precomputed_onetimeauth_poly1305 + 1376, precomputed_onetimeauth_poly1305 + 1392, precomputed_onetimeauth_poly1305 + 1408, precomputed_onetimeauth_poly1305 + 1424, precomputed_onetimeauth_poly1305 + 1440, precomputed_onetimeauth_poly1305 + 1456, precomputed_onetimeauth_poly1305 + 1472, precomputed_onetimeauth_poly1305 + 1488, precomputed_onetimeauth_poly1305 + 1504, precomputed_onetimeauth_poly1305 + 1520, precomputed_onetimeauth_poly1305 + 1536, precomputed_onetimeauth_poly1305 + 1552, precomputed_onetimeauth_poly1305 + 1568, precomputed_onetimeauth_poly1305 + 1584, precomputed_onetimeauth_poly1305 + 1600, precomputed_onetimeauth_poly1305 + 1616, precomputed_onetimeauth_poly1305 + 1632, precomputed_onetimeauth_poly1305 + 1648, precomputed_onetimeauth_poly1305 + 1664, precomputed_onetimeauth_poly1305 + 1680, precomputed_onetimeauth_poly1305 + 1696, precomputed_onetimeauth_poly1305 + 1712, precomputed_onetimeauth_poly1305 + 1728, precomputed_onetimeauth_poly1305 + 1744, precomputed_onetimeauth_poly1305 + 1760, precomputed_onetimeauth_poly1305 + 1776, precomputed_onetimeauth_poly1305 + 1792, precomputed_onetimeauth_poly1305 + 1808, precomputed_onetimeauth_poly1305 + 1824, precomputed_onetimeauth_poly1305 + 1840, precomputed_onetimeauth_poly1305 + 1856, precomputed_onetimeauth_poly1305 + 1872, precomputed_onetimeauth_poly1305 + 1888, precomputed_onetimeauth_poly1305 + 1904, precomputed_onetimeauth_poly1305 + 1920, precomputed_onetimeauth_poly1305 + 1936, precomputed_onetimeauth_poly1305 + 1952, precomputed_onetimeauth_poly1305 + 1968, precomputed_onetimeauth_poly1305 + 1984, precomputed_onetimeauth_poly1305 + 2000, precomputed_onetimeauth_poly1305 + 2016, precomputed_onetimeauth_poly1305 + 2032, precomputed_onetimeauth_poly1305 + 2048, precomputed_onetimeauth_poly1305 + 2064, precomputed_onetimeauth_poly1305 + 2080, precomputed_onetimeauth_poly1305 + 2096, }; static const unsigned char * precomputed_onetimeauth_poly1305_m[precomputed_onetimeauth_poly1305_NUM] = { precomputed_onetimeauth_poly1305 + 2112, precomputed_onetimeauth_poly1305 + 3112, precomputed_onetimeauth_poly1305 + 3813, precomputed_onetimeauth_poly1305 + 4353, precomputed_onetimeauth_poly1305 + 4443, precomputed_onetimeauth_poly1305 + 5353, precomputed_onetimeauth_poly1305 + 5464, precomputed_onetimeauth_poly1305 + 5885, precomputed_onetimeauth_poly1305 + 6430, precomputed_onetimeauth_poly1305 + 7190, precomputed_onetimeauth_poly1305 + 8060, precomputed_onetimeauth_poly1305 + 8642, precomputed_onetimeauth_poly1305 + 8921, precomputed_onetimeauth_poly1305 + 9324, precomputed_onetimeauth_poly1305 + 9852, precomputed_onetimeauth_poly1305 + 10448, precomputed_onetimeauth_poly1305 + 11348, precomputed_onetimeauth_poly1305 + 11785, precomputed_onetimeauth_poly1305 + 12585, precomputed_onetimeauth_poly1305 + 12809, precomputed_onetimeauth_poly1305 + 13670, precomputed_onetimeauth_poly1305 + 14311, precomputed_onetimeauth_poly1305 + 15034, precomputed_onetimeauth_poly1305 + 15681, precomputed_onetimeauth_poly1305 + 16500, precomputed_onetimeauth_poly1305 + 16754, precomputed_onetimeauth_poly1305 + 17598, precomputed_onetimeauth_poly1305 + 18243, precomputed_onetimeauth_poly1305 + 18450, precomputed_onetimeauth_poly1305 + 18975, precomputed_onetimeauth_poly1305 + 19883, precomputed_onetimeauth_poly1305 + 20107, precomputed_onetimeauth_poly1305 + 20720, precomputed_onetimeauth_poly1305 + 21360, precomputed_onetimeauth_poly1305 + 22178, precomputed_onetimeauth_poly1305 + 22516, precomputed_onetimeauth_poly1305 + 23495, precomputed_onetimeauth_poly1305 + 24460, precomputed_onetimeauth_poly1305 + 25344, precomputed_onetimeauth_poly1305 + 25643, precomputed_onetimeauth_poly1305 + 25684, precomputed_onetimeauth_poly1305 + 26448, precomputed_onetimeauth_poly1305 + 27195, precomputed_onetimeauth_poly1305 + 28105, precomputed_onetimeauth_poly1305 + 28494, precomputed_onetimeauth_poly1305 + 29250, precomputed_onetimeauth_poly1305 + 29417, precomputed_onetimeauth_poly1305 + 29946, precomputed_onetimeauth_poly1305 + 30071, precomputed_onetimeauth_poly1305 + 30137, precomputed_onetimeauth_poly1305 + 30845, precomputed_onetimeauth_poly1305 + 31678, precomputed_onetimeauth_poly1305 + 32619, precomputed_onetimeauth_poly1305 + 33533, precomputed_onetimeauth_poly1305 + 34324, precomputed_onetimeauth_poly1305 + 34647, precomputed_onetimeauth_poly1305 + 34890, precomputed_onetimeauth_poly1305 + 35703, precomputed_onetimeauth_poly1305 + 35835, precomputed_onetimeauth_poly1305 + 35939, precomputed_onetimeauth_poly1305 + 36079, precomputed_onetimeauth_poly1305 + 36512, precomputed_onetimeauth_poly1305 + 36944, precomputed_onetimeauth_poly1305 + 37292, precomputed_onetimeauth_poly1305 + 38048, precomputed_onetimeauth_poly1305 + 38167, precomputed_onetimeauth_poly1305 + 38633, precomputed_onetimeauth_poly1305 + 39318, precomputed_onetimeauth_poly1305 + 39626, precomputed_onetimeauth_poly1305 + 40437, precomputed_onetimeauth_poly1305 + 40577, precomputed_onetimeauth_poly1305 + 41514, precomputed_onetimeauth_poly1305 + 42220, precomputed_onetimeauth_poly1305 + 42959, precomputed_onetimeauth_poly1305 + 43780, precomputed_onetimeauth_poly1305 + 44755, precomputed_onetimeauth_poly1305 + 44810, precomputed_onetimeauth_poly1305 + 45632, precomputed_onetimeauth_poly1305 + 46373, precomputed_onetimeauth_poly1305 + 46583, precomputed_onetimeauth_poly1305 + 47023, precomputed_onetimeauth_poly1305 + 47053, precomputed_onetimeauth_poly1305 + 47304, precomputed_onetimeauth_poly1305 + 47564, precomputed_onetimeauth_poly1305 + 48550, precomputed_onetimeauth_poly1305 + 48874, precomputed_onetimeauth_poly1305 + 49804, precomputed_onetimeauth_poly1305 + 50090, precomputed_onetimeauth_poly1305 + 50934, precomputed_onetimeauth_poly1305 + 51379, precomputed_onetimeauth_poly1305 + 52125, precomputed_onetimeauth_poly1305 + 52518, precomputed_onetimeauth_poly1305 + 53366, precomputed_onetimeauth_poly1305 + 54182, precomputed_onetimeauth_poly1305 + 54622, precomputed_onetimeauth_poly1305 + 55510, precomputed_onetimeauth_poly1305 + 56419, precomputed_onetimeauth_poly1305 + 56489, precomputed_onetimeauth_poly1305 + 56765, precomputed_onetimeauth_poly1305 + 56889, precomputed_onetimeauth_poly1305 + 57421, precomputed_onetimeauth_poly1305 + 57437, precomputed_onetimeauth_poly1305 + 57453, precomputed_onetimeauth_poly1305 + 57469, precomputed_onetimeauth_poly1305 + 57485, precomputed_onetimeauth_poly1305 + 57501, precomputed_onetimeauth_poly1305 + 57517, precomputed_onetimeauth_poly1305 + 57533, precomputed_onetimeauth_poly1305 + 57549, precomputed_onetimeauth_poly1305 + 57565, precomputed_onetimeauth_poly1305 + 57581, precomputed_onetimeauth_poly1305 + 57597, precomputed_onetimeauth_poly1305 + 57613, precomputed_onetimeauth_poly1305 + 57629, precomputed_onetimeauth_poly1305 + 57645, precomputed_onetimeauth_poly1305 + 57661, precomputed_onetimeauth_poly1305 + 57677, precomputed_onetimeauth_poly1305 + 57693, precomputed_onetimeauth_poly1305 + 57709, precomputed_onetimeauth_poly1305 + 57725, precomputed_onetimeauth_poly1305 + 57741, precomputed_onetimeauth_poly1305 + 57757, precomputed_onetimeauth_poly1305 + 57773, precomputed_onetimeauth_poly1305 + 57789, precomputed_onetimeauth_poly1305 + 57805, precomputed_onetimeauth_poly1305 + 57821, precomputed_onetimeauth_poly1305 + 57837, precomputed_onetimeauth_poly1305 + 57853, precomputed_onetimeauth_poly1305 + 57869, precomputed_onetimeauth_poly1305 + 57885, precomputed_onetimeauth_poly1305 + 57901, precomputed_onetimeauth_poly1305 + 57917, }; static const unsigned char * precomputed_onetimeauth_poly1305_k[precomputed_onetimeauth_poly1305_NUM] = { precomputed_onetimeauth_poly1305 + 57933, precomputed_onetimeauth_poly1305 + 57965, precomputed_onetimeauth_poly1305 + 57997, precomputed_onetimeauth_poly1305 + 58029, precomputed_onetimeauth_poly1305 + 58061, precomputed_onetimeauth_poly1305 + 58093, precomputed_onetimeauth_poly1305 + 58125, precomputed_onetimeauth_poly1305 + 58157, precomputed_onetimeauth_poly1305 + 58189, precomputed_onetimeauth_poly1305 + 58221, precomputed_onetimeauth_poly1305 + 58253, precomputed_onetimeauth_poly1305 + 58285, precomputed_onetimeauth_poly1305 + 58317, precomputed_onetimeauth_poly1305 + 58349, precomputed_onetimeauth_poly1305 + 58381, precomputed_onetimeauth_poly1305 + 58413, precomputed_onetimeauth_poly1305 + 58445, precomputed_onetimeauth_poly1305 + 58477, precomputed_onetimeauth_poly1305 + 58509, precomputed_onetimeauth_poly1305 + 58541, precomputed_onetimeauth_poly1305 + 58573, precomputed_onetimeauth_poly1305 + 58605, precomputed_onetimeauth_poly1305 + 58637, precomputed_onetimeauth_poly1305 + 58669, precomputed_onetimeauth_poly1305 + 58701, precomputed_onetimeauth_poly1305 + 58733, precomputed_onetimeauth_poly1305 + 58765, precomputed_onetimeauth_poly1305 + 58797, precomputed_onetimeauth_poly1305 + 58829, precomputed_onetimeauth_poly1305 + 58861, precomputed_onetimeauth_poly1305 + 58893, precomputed_onetimeauth_poly1305 + 58925, precomputed_onetimeauth_poly1305 + 58957, precomputed_onetimeauth_poly1305 + 58989, precomputed_onetimeauth_poly1305 + 59021, precomputed_onetimeauth_poly1305 + 59053, precomputed_onetimeauth_poly1305 + 59085, precomputed_onetimeauth_poly1305 + 59117, precomputed_onetimeauth_poly1305 + 59149, precomputed_onetimeauth_poly1305 + 59181, precomputed_onetimeauth_poly1305 + 59213, precomputed_onetimeauth_poly1305 + 59245, precomputed_onetimeauth_poly1305 + 59277, precomputed_onetimeauth_poly1305 + 59309, precomputed_onetimeauth_poly1305 + 59341, precomputed_onetimeauth_poly1305 + 59373, precomputed_onetimeauth_poly1305 + 59405, precomputed_onetimeauth_poly1305 + 59437, precomputed_onetimeauth_poly1305 + 59469, precomputed_onetimeauth_poly1305 + 59501, precomputed_onetimeauth_poly1305 + 59533, precomputed_onetimeauth_poly1305 + 59565, precomputed_onetimeauth_poly1305 + 59597, precomputed_onetimeauth_poly1305 + 59629, precomputed_onetimeauth_poly1305 + 59661, precomputed_onetimeauth_poly1305 + 59693, precomputed_onetimeauth_poly1305 + 59725, precomputed_onetimeauth_poly1305 + 59757, precomputed_onetimeauth_poly1305 + 59789, precomputed_onetimeauth_poly1305 + 59821, precomputed_onetimeauth_poly1305 + 59853, precomputed_onetimeauth_poly1305 + 59885, precomputed_onetimeauth_poly1305 + 59917, precomputed_onetimeauth_poly1305 + 59949, precomputed_onetimeauth_poly1305 + 59981, precomputed_onetimeauth_poly1305 + 60013, precomputed_onetimeauth_poly1305 + 60045, precomputed_onetimeauth_poly1305 + 60077, precomputed_onetimeauth_poly1305 + 60109, precomputed_onetimeauth_poly1305 + 60141, precomputed_onetimeauth_poly1305 + 60173, precomputed_onetimeauth_poly1305 + 60205, precomputed_onetimeauth_poly1305 + 60237, precomputed_onetimeauth_poly1305 + 60269, precomputed_onetimeauth_poly1305 + 60301, precomputed_onetimeauth_poly1305 + 60333, precomputed_onetimeauth_poly1305 + 60365, precomputed_onetimeauth_poly1305 + 60397, precomputed_onetimeauth_poly1305 + 60429, precomputed_onetimeauth_poly1305 + 60461, precomputed_onetimeauth_poly1305 + 60493, precomputed_onetimeauth_poly1305 + 60525, precomputed_onetimeauth_poly1305 + 60557, precomputed_onetimeauth_poly1305 + 60589, precomputed_onetimeauth_poly1305 + 60621, precomputed_onetimeauth_poly1305 + 60653, precomputed_onetimeauth_poly1305 + 60685, precomputed_onetimeauth_poly1305 + 60717, precomputed_onetimeauth_poly1305 + 60749, precomputed_onetimeauth_poly1305 + 60781, precomputed_onetimeauth_poly1305 + 60813, precomputed_onetimeauth_poly1305 + 60845, precomputed_onetimeauth_poly1305 + 60877, precomputed_onetimeauth_poly1305 + 60909, precomputed_onetimeauth_poly1305 + 60941, precomputed_onetimeauth_poly1305 + 60973, precomputed_onetimeauth_poly1305 + 61005, precomputed_onetimeauth_poly1305 + 61037, precomputed_onetimeauth_poly1305 + 61069, precomputed_onetimeauth_poly1305 + 61101, precomputed_onetimeauth_poly1305 + 61133, precomputed_onetimeauth_poly1305 + 61165, precomputed_onetimeauth_poly1305 + 61197, precomputed_onetimeauth_poly1305 + 61229, precomputed_onetimeauth_poly1305 + 61261, precomputed_onetimeauth_poly1305 + 61293, precomputed_onetimeauth_poly1305 + 61325, precomputed_onetimeauth_poly1305 + 61357, precomputed_onetimeauth_poly1305 + 61389, precomputed_onetimeauth_poly1305 + 61421, precomputed_onetimeauth_poly1305 + 61453, precomputed_onetimeauth_poly1305 + 61485, precomputed_onetimeauth_poly1305 + 61517, precomputed_onetimeauth_poly1305 + 61549, precomputed_onetimeauth_poly1305 + 61581, precomputed_onetimeauth_poly1305 + 61613, precomputed_onetimeauth_poly1305 + 61645, precomputed_onetimeauth_poly1305 + 61677, precomputed_onetimeauth_poly1305 + 61709, precomputed_onetimeauth_poly1305 + 61741, precomputed_onetimeauth_poly1305 + 61773, precomputed_onetimeauth_poly1305 + 61805, precomputed_onetimeauth_poly1305 + 61837, precomputed_onetimeauth_poly1305 + 61869, precomputed_onetimeauth_poly1305 + 61901, precomputed_onetimeauth_poly1305 + 61933, precomputed_onetimeauth_poly1305 + 61965, precomputed_onetimeauth_poly1305 + 61997, precomputed_onetimeauth_poly1305 + 62029, precomputed_onetimeauth_poly1305 + 62061, precomputed_onetimeauth_poly1305 + 62093, precomputed_onetimeauth_poly1305 + 62125, }; static const long long precomputed_onetimeauth_poly1305_mlen [precomputed_onetimeauth_poly1305_NUM] = { 1000, 701, 540, 90, 910, 111, 421, 545, 760, 870, 582, 279, 403, 528, 596, 900, 437, 800, 224, 861, 641, 723, 647, 819, 254, 844, 645, 207, 525, 908, 224, 613, 640, 818, 338, 979, 965, 884, 299, 41, 764, 747, 910, 389, 756, 167, 529, 125, 66, 708, 833, 941, 914, 791, 323, 243, 813, 132, 104, 140, 433, 432, 348, 756, 119, 466, 685, 308, 811, 140, 937, 706, 739, 821, 975, 55, 822, 741, 210, 440, 30, 251, 260, 986, 324, 930, 286, 844, 445, 746, 393, 848, 816, 440, 888, 909, 70, 276, 124, 532, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, }; static void test_onetimeauth_poly1305_impl(long long impl) { unsigned char *a = test_onetimeauth_poly1305_a; unsigned char *m = test_onetimeauth_poly1305_m; unsigned char *k = test_onetimeauth_poly1305_k; unsigned char *a2 = test_onetimeauth_poly1305_a2; unsigned char *m2 = test_onetimeauth_poly1305_m2; unsigned char *k2 = test_onetimeauth_poly1305_k2; long long alen = crypto_onetimeauth_BYTES; long long mlen; long long klen = crypto_onetimeauth_KEYBYTES; if (targetn && atol(targetn) != impl) return; crypto_onetimeauth = crypto_onetimeauth_poly1305; crypto_onetimeauth_verify = crypto_onetimeauth_poly1305_verify; for (long long checksumbig = 0; checksumbig < 2; ++checksumbig) { long long loops = checksumbig ? 32768 : 4096; long long maxtest = checksumbig ? 4096 : 128; checksum_clear(); for (long long loop = 0; loop < loops; ++loop) { int result; mlen = myrandom() % (maxtest + 1); output_prepare(a2, a, alen); input_prepare(m2, m, mlen); input_prepare(k2, k, klen); secret(m, mlen); secret(k, klen); crypto_onetimeauth(a, m, mlen, k); public(m, mlen); public(k, klen); public(a, alen); checksum(a, alen); output_compare(a2, a, alen, "crypto_onetimeauth"); input_compare(m2, m, mlen, "crypto_onetimeauth"); input_compare(k2, k, klen, "crypto_onetimeauth"); double_canary(a2, a, alen); double_canary(m2, m, mlen); double_canary(k2, k, klen); secret(m2, mlen); secret(k2, klen); crypto_onetimeauth(a2, m2, mlen, k2); public(m2, mlen); public(k2, klen); public(a2, alen); if (memcmp(a2, a, alen) != 0) fail("failure: crypto_onetimeauth is nondeterministic\n"); double_canary(a2, a, alen); double_canary(m2, m, mlen); double_canary(k2, k, klen); secret(m2, mlen); secret(k, klen); crypto_onetimeauth(m2, m2, mlen, k); public(m2, alen); public(k, klen); if (memcmp(m2, a, alen) != 0) fail("failure: crypto_onetimeauth does not handle m=a " "overlap\n"); memcpy(m2, m, mlen); secret(m, mlen); secret(k2, klen); crypto_onetimeauth(k2, m, mlen, k2); public(k2, alen); public(m, mlen); if (memcmp(k2, a, alen) != 0) fail("failure: crypto_onetimeauth does not handle k=a " "overlap\n"); memcpy(k2, k, klen); memcpy(a2, a, alen); double_canary(a2, a, alen); memcpy(m2, m, mlen); double_canary(m2, m, mlen); memcpy(k2, k, klen); double_canary(k2, k, klen); secret(a, alen); secret(m, mlen); secret(k, klen); result = crypto_onetimeauth_verify(a, m, mlen, k); public(&result, sizeof result); if (result != 0) fail("failure: crypto_onetimeauth_verify returns nonzero\n"); public(a, alen); public(m, mlen); public(k, klen); input_compare(a2, a, alen, "crypto_onetimeauth_verify"); input_compare(m2, m, mlen, "crypto_onetimeauth_verify"); input_compare(k2, k, klen, "crypto_onetimeauth_verify"); double_canary(a2, a, alen); double_canary(m2, m, mlen); double_canary(k2, k, klen); secret(a2, alen); secret(m2, mlen); secret(k2, klen); result = crypto_onetimeauth_verify(a2, m2, mlen, k2); public(&result, sizeof result); if (result != 0) fail("failure: crypto_onetimeauth_verify returns nonzero\n"); public(a2, alen); public(m2, mlen); public(k2, klen); a[myrandom() % alen] += 1 + (myrandom() % 255); if (crypto_onetimeauth_verify(a, m, mlen, k) == 0) if (memcmp(a2, a, alen) != 0) fail("crypto_onetimeauth_verify accepts modified " "authenticators"); a[myrandom() % alen] += 1 + (myrandom() % 255); if (crypto_onetimeauth_verify(a, m, mlen, k) == 0) if (memcmp(a2, a, alen) != 0) fail("crypto_onetimeauth_verify accepts modified " "authenticators"); a[myrandom() % alen] += 1 + (myrandom() % 255); if (crypto_onetimeauth_verify(a, m, mlen, k) == 0) if (memcmp(a2, a, alen) != 0) fail("crypto_onetimeauth_verify accepts modified " "authenticators"); } checksum_expected(onetimeauth_poly1305_checksums[checksumbig]); } for (long long precomp = 0; precomp < precomputed_onetimeauth_poly1305_NUM; ++precomp) { output_prepare(a2, a, crypto_onetimeauth_BYTES); input_prepare(m2, m, 4096 + crypto_onetimeauth_BYTES); mlen = precomputed_onetimeauth_poly1305_mlen[precomp]; memcpy(m, precomputed_onetimeauth_poly1305_m[precomp], mlen); memcpy(m2, precomputed_onetimeauth_poly1305_m[precomp], mlen); input_prepare(k2, k, crypto_onetimeauth_KEYBYTES); memcpy(k, precomputed_onetimeauth_poly1305_k[precomp], crypto_onetimeauth_KEYBYTES); memcpy(k2, precomputed_onetimeauth_poly1305_k[precomp], crypto_onetimeauth_KEYBYTES); crypto_onetimeauth(a, m, mlen, k); if (memcmp(a, precomputed_onetimeauth_poly1305_a[precomp], crypto_onetimeauth_BYTES)) { fail( "failure: crypto_onetimeauth fails precomputed test vectors\n"); printf("expected a %lld: ", precomp); for (long long pos = 0; pos < crypto_onetimeauth_BYTES; ++pos) printf("%02x", ((unsigned char *) precomputed_onetimeauth_poly1305_a[precomp])[pos]); printf("\n"); printf("received a %lld: ", precomp); for (long long pos = 0; pos < crypto_onetimeauth_BYTES; ++pos) printf("%02x", a[pos]); printf("\n"); } output_compare(a2, a, crypto_onetimeauth_BYTES, "crypto_onetimeauth"); input_compare(m2, m, 4096 + crypto_onetimeauth_BYTES, "crypto_onetimeauth"); input_compare(k2, k, crypto_onetimeauth_KEYBYTES, "crypto_onetimeauth"); } for (long long precomp = 0; precomp < precomputed_onetimeauth_poly1305_NUM; ++precomp) { input_prepare(a2, a, crypto_onetimeauth_BYTES); memcpy(a, precomputed_onetimeauth_poly1305_a[precomp], crypto_onetimeauth_BYTES); memcpy(a2, precomputed_onetimeauth_poly1305_a[precomp], crypto_onetimeauth_BYTES); input_prepare(m2, m, 4096 + crypto_onetimeauth_BYTES); mlen = precomputed_onetimeauth_poly1305_mlen[precomp]; memcpy(m, precomputed_onetimeauth_poly1305_m[precomp], mlen); memcpy(m2, precomputed_onetimeauth_poly1305_m[precomp], mlen); input_prepare(k2, k, crypto_onetimeauth_KEYBYTES); memcpy(k, precomputed_onetimeauth_poly1305_k[precomp], crypto_onetimeauth_KEYBYTES); memcpy(k2, precomputed_onetimeauth_poly1305_k[precomp], crypto_onetimeauth_KEYBYTES); crypto_onetimeauth_verify(a, m, mlen, k); input_compare(a2, a, crypto_onetimeauth_BYTES, "crypto_onetimeauth_verify"); input_compare(m2, m, 4096 + crypto_onetimeauth_BYTES, "crypto_onetimeauth_verify"); input_compare(k2, k, crypto_onetimeauth_KEYBYTES, "crypto_onetimeauth_verify"); } } void test_onetimeauth_poly1305(void) { long long maxalloc = 0; if (targeto && strcmp(targeto, "onetimeauth")) return; if (targetp && strcmp(targetp, "poly1305")) return; storage_onetimeauth_poly1305_a = callocplus(crypto_onetimeauth_BYTES); test_onetimeauth_poly1305_a = aligned(storage_onetimeauth_poly1305_a, crypto_onetimeauth_BYTES); if (crypto_onetimeauth_BYTES > maxalloc) maxalloc = crypto_onetimeauth_BYTES; storage_onetimeauth_poly1305_m = callocplus(4096 + crypto_onetimeauth_BYTES); test_onetimeauth_poly1305_m = aligned(storage_onetimeauth_poly1305_m, 4096 + crypto_onetimeauth_BYTES); if (4096 + crypto_onetimeauth_BYTES > maxalloc) maxalloc = 4096 + crypto_onetimeauth_BYTES; storage_onetimeauth_poly1305_k = callocplus(crypto_onetimeauth_KEYBYTES); test_onetimeauth_poly1305_k = aligned(storage_onetimeauth_poly1305_k, crypto_onetimeauth_KEYBYTES); if (crypto_onetimeauth_KEYBYTES > maxalloc) maxalloc = crypto_onetimeauth_KEYBYTES; storage_onetimeauth_poly1305_a2 = callocplus(maxalloc); test_onetimeauth_poly1305_a2 = aligned(storage_onetimeauth_poly1305_a2, crypto_onetimeauth_BYTES); storage_onetimeauth_poly1305_m2 = callocplus(maxalloc); test_onetimeauth_poly1305_m2 = aligned(storage_onetimeauth_poly1305_m2, 4096 + crypto_onetimeauth_BYTES); storage_onetimeauth_poly1305_k2 = callocplus(maxalloc); test_onetimeauth_poly1305_k2 = aligned(storage_onetimeauth_poly1305_k2, crypto_onetimeauth_KEYBYTES); for (long long offset = 0; offset < 2; ++offset) { if (targetoffset && atol(targetoffset) != offset) continue; if (offset && valgrind) break; printf("onetimeauth_poly1305 offset %lld\n", offset); forked(test_onetimeauth_poly1305_impl, -1); ++test_onetimeauth_poly1305_a; ++test_onetimeauth_poly1305_m; ++test_onetimeauth_poly1305_k; ++test_onetimeauth_poly1305_a2; ++test_onetimeauth_poly1305_m2; ++test_onetimeauth_poly1305_k2; } free(storage_onetimeauth_poly1305_k2); free(storage_onetimeauth_poly1305_m2); free(storage_onetimeauth_poly1305_a2); free(storage_onetimeauth_poly1305_k); free(storage_onetimeauth_poly1305_m); free(storage_onetimeauth_poly1305_a); } #undef crypto_onetimeauth_BYTES #undef crypto_onetimeauth_KEYBYTES tinyssh-20250501/_crypto-test_sign_ed25519.inc000066400000000000000000000335241500472222400207050ustar00rootroot00000000000000/* ----- sign/ed25519, derived from supercop/crypto_sign/try.c */ /* derived from djb work from lib25519/libntruprime mj modifications: - rename files to test-crypto.c and _crypto_<>.<>.inc - fix compiler warnings - include crypto.h - use less rounds for valgrind test - reformat using clang-format */ #include #include #include #include #include "crypto.h" #define fail ((ok = 0), printf) static const char *sign_ed25519_checksums[] = { "ce11fd7c1eac4dd0bc5eec49b26ad1e91aef696fae50ce377dbd806dc394da01", "2ed857f17c917a8185e6c296303a11772ae45683a5e7cb5b095489bad65fffde", }; static int (*crypto_sign_keypair)(unsigned char *, unsigned char *); static int (*crypto_sign)(unsigned char *, unsigned long long *, const unsigned char *, unsigned long long, const unsigned char *); static int (*crypto_sign_open)(unsigned char *, unsigned long long *, const unsigned char *, unsigned long long, const unsigned char *); #define crypto_sign_SECRETKEYBYTES crypto_sign_ed25519_SECRETKEYBYTES #define crypto_sign_PUBLICKEYBYTES crypto_sign_ed25519_PUBLICKEYBYTES #define crypto_sign_BYTES crypto_sign_ed25519_BYTES static void *storage_sign_ed25519_p; static unsigned char *test_sign_ed25519_p; static void *storage_sign_ed25519_s; static unsigned char *test_sign_ed25519_s; static void *storage_sign_ed25519_m; static unsigned char *test_sign_ed25519_m; static void *storage_sign_ed25519_c; static unsigned char *test_sign_ed25519_c; static void *storage_sign_ed25519_t; static unsigned char *test_sign_ed25519_t; static void *storage_sign_ed25519_p2; static unsigned char *test_sign_ed25519_p2; static void *storage_sign_ed25519_s2; static unsigned char *test_sign_ed25519_s2; static void *storage_sign_ed25519_m2; static unsigned char *test_sign_ed25519_m2; static void *storage_sign_ed25519_c2; static unsigned char *test_sign_ed25519_c2; static void *storage_sign_ed25519_t2; static unsigned char *test_sign_ed25519_t2; static void test_sign_ed25519_impl(long long impl) { unsigned char *p = test_sign_ed25519_p; unsigned char *s = test_sign_ed25519_s; unsigned char *m = test_sign_ed25519_m; unsigned char *c = test_sign_ed25519_c; unsigned char *t = test_sign_ed25519_t; unsigned char *p2 = test_sign_ed25519_p2; unsigned char *s2 = test_sign_ed25519_s2; unsigned char *m2 = test_sign_ed25519_m2; unsigned char *c2 = test_sign_ed25519_c2; unsigned char *t2 = test_sign_ed25519_t2; unsigned long long plen = crypto_sign_PUBLICKEYBYTES; unsigned long long slen = crypto_sign_SECRETKEYBYTES; unsigned long long mlen; unsigned long long clen; unsigned long long tlen; if (targetn && atol(targetn) != impl) return; crypto_sign_keypair = crypto_sign_ed25519_keypair; crypto_sign = crypto_sign_ed25519; crypto_sign_open = crypto_sign_ed25519_open; for (long long checksumbig = 0; checksumbig < 2; ++checksumbig) { long long loops = checksumbig ? 64 : 8; long long maxtest = checksumbig ? 4096 : 128; if (checksumbig && valgrind) break; checksum_clear(); for (long long loop = 0; loop < loops; ++loop) { int result; mlen = myrandom() % (maxtest + 1); output_prepare(p2, p, plen); output_prepare(s2, s, slen); crypto_sign_keypair(p, s); public(p, plen); public(s, slen); checksum(p, plen); checksum(s, slen); output_compare(p2, p, plen, "crypto_sign_keypair"); output_compare(s2, s, slen, "crypto_sign_keypair"); clen = mlen + crypto_sign_BYTES; output_prepare(c2, c, clen); input_prepare(m2, m, mlen); memcpy(s2, s, slen); double_canary(s2, s, slen); secret(m, mlen); secret(s, slen); crypto_sign(c, &clen, m, mlen, s); public(m, mlen); public(s, slen); public(c, clen); if (clen < mlen) fail( "failure: crypto_sign returns smaller output than input\n"); if (clen > mlen + crypto_sign_BYTES) fail("failure: crypto_sign returns more than crypto_sign_BYTES " "extra bytes\n"); checksum(c, clen); output_compare(c2, c, clen, "crypto_sign"); input_compare(m2, m, mlen, "crypto_sign"); input_compare(s2, s, slen, "crypto_sign"); tlen = clen; output_prepare(t2, t, tlen); memcpy(c2, c, clen); double_canary(c2, c, clen); memcpy(p2, p, plen); double_canary(p2, p, plen); public(c, clen); public(p, plen); result = crypto_sign_open(t, &tlen, c, clen, p); public(&result, sizeof result); if (result != 0) fail("failure: crypto_sign_open returns nonzero\n"); public(c, clen); public(p, plen); public(t, tlen); if (tlen != mlen) fail("failure: crypto_sign_open does not match mlen\n"); if (memcmp(t, m, mlen) != 0) fail("failure: crypto_sign_open does not match m\n"); checksum(t, tlen); output_compare(t2, t, clen, "crypto_sign_open"); input_compare(c2, c, clen, "crypto_sign_open"); input_compare(p2, p, plen, "crypto_sign_open"); double_canary(t2, t, tlen); double_canary(c2, c, clen); double_canary(p2, p, plen); public(c2, clen); public(p2, plen); result = crypto_sign_open(t2, &tlen, c2, clen, p2); public(&result, sizeof result); if (result != 0) fail("failure: crypto_sign_open returns nonzero\n"); public(c2, clen); public(p2, plen); public(t2, tlen); if (memcmp(t2, t, tlen) != 0) fail("failure: crypto_sign_open is nondeterministic\n"); double_canary(t2, t, tlen); double_canary(c2, c, clen); double_canary(p2, p, plen); public(c2, clen); public(p, plen); result = crypto_sign_open(c2, &tlen, c2, clen, p); public(&result, sizeof result); if (result != 0) fail("failure: crypto_sign_open with c=t overlap returns " "nonzero\n"); public(c2, tlen); public(p, plen); if (memcmp(c2, t, tlen) != 0) fail("failure: crypto_sign_open does not handle c=t overlap\n"); memcpy(c2, c, clen); public(c, clen); public(p2, plen); result = crypto_sign_open(p2, &tlen, c, clen, p2); public(&result, sizeof result); if (result != 0) fail("failure: crypto_sign_open with p=t overlap returns " "nonzero\n"); public(p2, tlen); public(c, clen); if (memcmp(p2, t, tlen) != 0) fail("failure: crypto_sign_open does not handle p=t overlap\n"); memcpy(p2, p, plen); c[myrandom() % clen] += 1 + (myrandom() % 255); if (crypto_sign_open(t, &tlen, c, clen, p) == 0) if ((tlen != mlen) || (memcmp(t, m, mlen) != 0)) fail( "failure: crypto_sign_open allows trivial forgeries\n"); c[myrandom() % clen] += 1 + (myrandom() % 255); if (crypto_sign_open(t, &tlen, c, clen, p) == 0) if ((tlen != mlen) || (memcmp(t, m, mlen) != 0)) fail( "failure: crypto_sign_open allows trivial forgeries\n"); c[myrandom() % clen] += 1 + (myrandom() % 255); if (crypto_sign_open(t, &tlen, c, clen, p) == 0) if ((tlen != mlen) || (memcmp(t, m, mlen) != 0)) fail( "failure: crypto_sign_open allows trivial forgeries\n"); } checksum_expected(sign_ed25519_checksums[checksumbig]); } } void test_sign_ed25519(void) { long long maxalloc = 0; if (targeto && strcmp(targeto, "sign")) return; if (targetp && strcmp(targetp, "ed25519")) return; storage_sign_ed25519_p = callocplus(4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); test_sign_ed25519_p = aligned(storage_sign_ed25519_p, 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); if (4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES > maxalloc) maxalloc = 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES; storage_sign_ed25519_s = callocplus(4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); test_sign_ed25519_s = aligned(storage_sign_ed25519_s, 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); if (4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES > maxalloc) maxalloc = 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES; storage_sign_ed25519_m = callocplus(4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); test_sign_ed25519_m = aligned(storage_sign_ed25519_m, 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); if (4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES > maxalloc) maxalloc = 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES; storage_sign_ed25519_c = callocplus(4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); test_sign_ed25519_c = aligned(storage_sign_ed25519_c, 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); if (4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES > maxalloc) maxalloc = 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES; storage_sign_ed25519_t = callocplus(4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); test_sign_ed25519_t = aligned(storage_sign_ed25519_t, 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); if (4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES > maxalloc) maxalloc = 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES; storage_sign_ed25519_p2 = callocplus(maxalloc); test_sign_ed25519_p2 = aligned(storage_sign_ed25519_p2, 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); storage_sign_ed25519_s2 = callocplus(maxalloc); test_sign_ed25519_s2 = aligned(storage_sign_ed25519_s2, 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); storage_sign_ed25519_m2 = callocplus(maxalloc); test_sign_ed25519_m2 = aligned(storage_sign_ed25519_m2, 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); storage_sign_ed25519_c2 = callocplus(maxalloc); test_sign_ed25519_c2 = aligned(storage_sign_ed25519_c2, 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); storage_sign_ed25519_t2 = callocplus(maxalloc); test_sign_ed25519_t2 = aligned(storage_sign_ed25519_t2, 4096 + crypto_sign_BYTES + crypto_sign_PUBLICKEYBYTES + crypto_sign_SECRETKEYBYTES); for (long long offset = 0; offset < 2; ++offset) { if (targetoffset && atol(targetoffset) != offset) continue; if (offset && valgrind) break; printf("sign_ed25519 offset %lld\n", offset); forked(test_sign_ed25519_impl, -1); ++test_sign_ed25519_p; ++test_sign_ed25519_s; ++test_sign_ed25519_m; ++test_sign_ed25519_c; ++test_sign_ed25519_t; ++test_sign_ed25519_p2; ++test_sign_ed25519_s2; ++test_sign_ed25519_m2; ++test_sign_ed25519_c2; ++test_sign_ed25519_t2; } free(storage_sign_ed25519_t2); free(storage_sign_ed25519_c2); free(storage_sign_ed25519_m2); free(storage_sign_ed25519_s2); free(storage_sign_ed25519_p2); free(storage_sign_ed25519_t); free(storage_sign_ed25519_c); free(storage_sign_ed25519_m); free(storage_sign_ed25519_s); free(storage_sign_ed25519_p); } #undef crypto_sign_SECRETKEYBYTES #undef crypto_sign_PUBLICKEYBYTES #undef crypto_sign_BYTES tinyssh-20250501/_crypto-test_sort_uint32.inc000066400000000000000000000064151500472222400210610ustar00rootroot00000000000000/* ----- sort/uint32, derived from supercop/crypto_sort/try.c */ /* derived from djb work from lib25519/libntruprime mj modifications: - rename files to test-crypto.c and _crypto_<>.<>.inc - fix compiler warnings - include crypto.h - use less rounds for valgrind test - reformat using clang-format */ #include #include #include #include #include "crypto.h" #define fail ((ok = 0), printf) static const char *sort_uint32_checksums[] = { "83fc714d7acc0375aa6657bd36d3324a6cbc503f68019345651be8a88534c3e2", "30921a0be2d73a185181f0ec842fa0fa73cd6e958fc03411d435f14a3fc64c89", }; static void (*crypto_sort)(void *, long long); #define crypto_sort_BYTES crypto_sort_uint32_BYTES static void *storage_sort_uint32_x; static unsigned char *test_sort_uint32_x; static void *storage_sort_uint32_x2; static unsigned char *test_sort_uint32_x2; static void test_sort_uint32_impl(long long impl) { unsigned char *x = test_sort_uint32_x; unsigned char *x2 = test_sort_uint32_x2; long long xlen; long long xwords; if (targetn && atol(targetn) != impl) return; crypto_sort = crypto_sort_uint32; for (long long checksumbig = 0; checksumbig < 2; ++checksumbig) { long long loops = checksumbig ? 4096 : 1024; long long maxtest = checksumbig ? 4096 : 128; if (checksumbig && valgrind) break; checksum_clear(); for (long long loop = 0; loop < loops; ++loop) { xwords = myrandom() % (maxtest + 1); xlen = xwords * crypto_sort_BYTES; input_prepare(x2, x, xlen); endianness(x, xwords, crypto_sort_BYTES); secret(x, xlen); crypto_sort(x, xwords); public(x, xlen); endianness(x, xwords, crypto_sort_BYTES); checksum(x, xlen); output_compare(x2, x, xlen, "crypto_sort"); double_canary(x2, x, xlen); endianness(x2, xwords, crypto_sort_BYTES); secret(x2, xlen); crypto_sort(x2, xwords); public(x2, xlen); endianness(x2, xwords, crypto_sort_BYTES); if (memcmp(x2, x, xlen) != 0) fail("failure: crypto_sort is nondeterministic\n"); } checksum_expected(sort_uint32_checksums[checksumbig]); } } void test_sort_uint32(void) { long long maxalloc = 0; if (targeto && strcmp(targeto, "sort")) return; if (targetp && strcmp(targetp, "uint32")) return; storage_sort_uint32_x = callocplus(crypto_sort_uint32_BYTES * 4096); test_sort_uint32_x = aligned(storage_sort_uint32_x, crypto_sort_uint32_BYTES * 4096); if (crypto_sort_uint32_BYTES * 4096 > maxalloc) maxalloc = crypto_sort_uint32_BYTES * 4096; storage_sort_uint32_x2 = callocplus(maxalloc); test_sort_uint32_x2 = aligned(storage_sort_uint32_x2, crypto_sort_uint32_BYTES * 4096); for (long long offset = 0; offset < 1; ++offset) { if (targetoffset && atol(targetoffset) != offset) continue; if (offset && valgrind) break; printf("sort_uint32 offset %lld\n", offset); forked(test_sort_uint32_impl, -1); ++test_sort_uint32_x; ++test_sort_uint32_x2; } free(storage_sort_uint32_x2); free(storage_sort_uint32_x); } #undef crypto_sort_BYTES tinyssh-20250501/_crypto-test_verify_16.inc000066400000000000000000000040071500472222400204730ustar00rootroot00000000000000/* ----- verify, derived from supercop/crypto_verify/try.c */ /* derived from djb work from lib25519/libntruprime mj modifications: - rename files to test-crypto.c and _crypto_<>.<>.inc - fix compiler warnings - include crypto.h - use less rounds for valgrind test - reformat using clang-format */ #include #include #include #include #include "crypto.h" static unsigned char *test_verify_16_x; static unsigned char *test_verify_16_y; static void test_verify_16_check(void) { unsigned char *x = test_verify_16_x; unsigned char *y = test_verify_16_y; int r; secret(x, 16); secret(y, 16); r = crypto_verify_16(x, y); public(x, 16); public(y, 16); public(&r, sizeof r); if (r == 0) { if (memcmp(x, y, 16)) fail("failure: different strings pass verify\n"); } else if (r == -1) { if (!memcmp(x, y, 16)) fail("failure: equal strings fail verify\n"); } else { fail("failure: weird return value\n"); } } void test_verify_16_impl(long long impl) { unsigned char *x = test_verify_16_x; unsigned char *y = test_verify_16_y; if (targetn && atol(targetn) != impl) return; randombytes(x, 16); randombytes(y, 16); test_verify_16_check(); memcpy(y, x, 16); test_verify_16_check(); y[myrandom() % 16] = myrandom(); test_verify_16_check(); y[myrandom() % 16] = myrandom(); test_verify_16_check(); y[myrandom() % 16] = myrandom(); test_verify_16_check(); } static void test_verify_16(void) { if (targeto && strcmp(targeto, "verify")) return; if (targetp && strcmp(targetp, "16")) return; test_verify_16_x = callocplus(16); test_verify_16_y = callocplus(16); for (long long offset = 0; offset < 2; ++offset) { if (targetoffset && atol(targetoffset) != offset) continue; if (offset && valgrind) break; printf("verify_16 offset %lld\n", offset); forked(test_verify_16_impl, -1); ++test_verify_16_x; ++test_verify_16_y; } } tinyssh-20250501/_crypto-test_verify_32.inc000066400000000000000000000040071500472222400204710ustar00rootroot00000000000000/* ----- verify, derived from supercop/crypto_verify/try.c */ /* derived from djb work from lib25519/libntruprime mj modifications: - rename files to test-crypto.c and _crypto_<>.<>.inc - fix compiler warnings - include crypto.h - use less rounds for valgrind test - reformat using clang-format */ #include #include #include #include #include "crypto.h" static unsigned char *test_verify_32_x; static unsigned char *test_verify_32_y; static void test_verify_32_check(void) { unsigned char *x = test_verify_32_x; unsigned char *y = test_verify_32_y; int r; secret(x, 32); secret(y, 32); r = crypto_verify_32(x, y); public(x, 32); public(y, 32); public(&r, sizeof r); if (r == 0) { if (memcmp(x, y, 32)) fail("failure: different strings pass verify\n"); } else if (r == -1) { if (!memcmp(x, y, 32)) fail("failure: equal strings fail verify\n"); } else { fail("failure: weird return value\n"); } } void test_verify_32_impl(long long impl) { unsigned char *x = test_verify_32_x; unsigned char *y = test_verify_32_y; if (targetn && atol(targetn) != impl) return; randombytes(x, 32); randombytes(y, 32); test_verify_32_check(); memcpy(y, x, 32); test_verify_32_check(); y[myrandom() % 32] = myrandom(); test_verify_32_check(); y[myrandom() % 32] = myrandom(); test_verify_32_check(); y[myrandom() % 32] = myrandom(); test_verify_32_check(); } static void test_verify_32(void) { if (targeto && strcmp(targeto, "verify")) return; if (targetp && strcmp(targetp, "32")) return; test_verify_32_x = callocplus(32); test_verify_32_y = callocplus(32); for (long long offset = 0; offset < 2; ++offset) { if (targetoffset && atol(targetoffset) != offset) continue; if (offset && valgrind) break; printf("verify_32 offset %lld\n", offset); forked(test_verify_32_impl, -1); ++test_verify_32_x; ++test_verify_32_y; } } tinyssh-20250501/_tinysshd-printkex.c000066400000000000000000000110101500472222400174540ustar00rootroot00000000000000/* 20141210 Jan Mojzis Public domain. */ #include #include #include #include "log.h" #include "packet.h" #include "ssh.h" #include "bug.h" #include "packetparser.h" #include "global.h" static void cleanup(void) { global_purge(); } __attribute__((noreturn)) static void die_fatal(const char *trouble, const char *d, const char *fn) { cleanup(); if (d) { if (fn) log_f5(trouble, " ", d, "/", fn); else log_f3(trouble, " ", d); } else { log_f1(trouble); } _exit(111); } static int packet_kex_receive_(void) { struct buf *b = &packet.kexrecv; long long pos = 0; crypto_uint8 ch; crypto_uint32 len; if (!packet_getall(b, SSH_MSG_KEXINIT)) return 0; /* parse packet */ pos = packetparser_uint8(b->buf, b->len, pos, &ch); /* SSH_MSG_KEXINIT */ if (ch != SSH_MSG_KEXINIT) bug_proto(); pos = packetparser_skip(b->buf, b->len, pos, 16); /* cookie */ pos = packetparser_uint32(b->buf, b->len, pos, &len); /* kex algorithms */ pos = packetparser_skip(b->buf, b->len, pos, len); log_i2("kex algorithms: ", (char *) b->buf + pos - len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* server host key algorithms */ pos = packetparser_skip(b->buf, b->len, pos, len); log_i2("server host key algorithms: ", (char *) b->buf + pos - len); pos = packetparser_uint32( b->buf, b->len, pos, &len); /* encryption algorithms client to server */ pos = packetparser_skip(b->buf, b->len, pos, len); log_i2("encryption algorithms client to server: ", (char *) b->buf + pos - len); pos = packetparser_uint32( b->buf, b->len, pos, &len); /* encryption algorithms server to client */ pos = packetparser_skip(b->buf, b->len, pos, len); log_i2("encryption algorithms server to client: ", (char *) b->buf + pos - len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* mac algorithms client to server */ pos = packetparser_skip(b->buf, b->len, pos, len); log_i2("mac algorithms client to server: ", (char *) b->buf + pos - len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* mac algorithms server to client */ pos = packetparser_skip(b->buf, b->len, pos, len); log_i2("mac algorithms server to client: ", (char *) b->buf + pos - len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* compress algorithms client to server */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* compress algorithms server to client */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* languages client to server */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* languages server to client */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_uint8(b->buf, b->len, pos, &ch); /* kex first packet follows */ pos = packetparser_uint32(b->buf, b->len, pos, &len); /* reserved */ return 1; } int main(int argc, char **argv) { pid_t pid; int tochild[2] = {-1, -1}; int fromchild[2] = {-1, -1}; if (argc < 2) _exit(111); if (!argv[0]) _exit(111); if (!argv[1]) _exit(111); ++argv; if (pipe(tochild) == -1) _exit(111); if (pipe(fromchild) == -1) _exit(111); pid = fork(); if (pid == -1) _exit(111); if (pid == 0) { close(tochild[1]); close(fromchild[0]); close(2); if (dup2(tochild[0], 0) == -1) _exit(111); if (dup2(fromchild[1], 1) == -1) _exit(111); execvp(*argv, argv); _exit(111); } close(tochild[0]); close(fromchild[1]); close(0); if (dup2(fromchild[0], 0) == -1) _exit(111); close(1); if (dup2(tochild[1], 1) == -1) _exit(111); signal(SIGPIPE, SIG_IGN); global_init(); log_init(2, "_tinysshd-printkex", 0, 0); if (!packet_hello_receive()) die_fatal("unable to receive hello-string", 0, 0); if (!packet_hello_send()) die_fatal("unable to send hello-string", 0, 0); if (!packet_kex_receive_()) die_fatal("unable to receive kex-message", 0, 0); _exit(111); } tinyssh-20250501/_tinysshd-speed.c000066400000000000000000000160421500472222400167220ustar00rootroot00000000000000#include #include #include #include "crypto.h" static unsigned char sk[2560]; static unsigned char pk[2560]; static unsigned char a[16]; static unsigned char n[8]; static unsigned char k[64]; static unsigned char h[64]; static unsigned char space[10240]; static unsigned char m[51200]; static unsigned char sm[51200]; static unsigned long long smlen; static unsigned long long mlen; static const char *implementation, *version; static int flagtimeout; static void timeout(int x) { flagtimeout = x = 1; signal(SIGALRM, timeout); } int main(void) { long long count; signal(SIGALRM, timeout); /* randombytes test */ alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { randombytes(space, sizeof space); ++count; } printf("randombytes: %lld MB/s (%s)\n", count / 100, randombytes_source()); #ifdef crypto_hash_sha512_IMPLEMENTATION implementation = crypto_hash_sha512_IMPLEMENTATION; #else implementation = "unknown"; #endif #ifdef crypto_hash_sha512_VERSION version = crypto_hash_sha512_VERSION; #else version = "unknown"; #endif /* sha512 test */ alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_hash_sha512(h, space, sizeof space) != 0) return 111; ++count; } printf("crypto_hash_sha512: %lld MB/s (%s, %s)\n", count / 100, implementation, version); #ifdef crypto_hash_sha256_IMPLEMENTATION implementation = crypto_hash_sha256_IMPLEMENTATION; #else implementation = "unknown"; #endif #ifdef crypto_hash_sha256_VERSION version = crypto_hash_sha256_VERSION; #else version = "unknown"; #endif /* sha256 test */ alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_hash_sha256(h, space, sizeof space) != 0) return 111; ++count; } printf("crypto_hash_sha256: %lld MB/s (%s, %s)\n", count / 100, implementation, version); #ifdef crypto_stream_chacha20_IMPLEMENTATION implementation = crypto_stream_chacha20_IMPLEMENTATION; #else implementation = "unknown"; #endif #ifdef crypto_stream_chacha20_VERSION version = crypto_stream_chacha20_VERSION; #else version = "unknown"; #endif /* chacha20 test */ alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_stream_chacha20_xor(space, space, sizeof space, n, k) != 0) return 111; ++count; } printf("crypto_stream_chacha20_xor: %lld MB/s (%s, %s)\n", count / 100, implementation, version); #ifdef crypto_onetimeauth_poly1305_IMPLEMENTATION implementation = crypto_onetimeauth_poly1305_IMPLEMENTATION; #else implementation = "unknown"; #endif #ifdef crypto_onetimeauth_poly1305_VERSION version = crypto_onetimeauth_poly1305_VERSION; #else version = "unknown"; #endif /* onetimeauth test */ alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_onetimeauth_poly1305(a, space, sizeof space, k) != 0) return 111; ++count; } printf("crypto_onetimeauth_poly1305: %lld MB/s (%s, %s)\n", count / 100, implementation, version); #ifdef crypto_scalarmult_curve25519_IMPLEMENTATION implementation = crypto_scalarmult_curve25519_IMPLEMENTATION; #else implementation = "unknown"; #endif #ifdef crypto_scalarmult_curve25519_VERSION version = crypto_scalarmult_curve25519_VERSION; #else version = "unknown"; #endif /* x25519 test */ randombytes(sk, crypto_scalarmult_curve25519_SCALARBYTES); crypto_scalarmult_curve25519_base(pk, sk); alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_scalarmult_curve25519(k, sk, pk) != 0) return 111; ++count; } printf("crypto_scalarmult_curve25519: %lld dh/s (%s, %s)\n", count, implementation, version); #ifdef crypto_sign_ed25519_IMPLEMENTATION implementation = crypto_sign_ed25519_IMPLEMENTATION; #else implementation = "unknown"; #endif #ifdef crypto_sign_ed25519_VERSION version = crypto_sign_ed25519_VERSION; #else version = "unknown"; #endif /* ed25519 test */ alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_sign_ed25519_keypair(pk, sk) != 0) return 111; ++count; } printf("crypto_sign_ed25519_keypair: %lld keypairs/s (%s, %s)\n", count, implementation, version); alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_sign_ed25519(sm, &smlen, m + crypto_sign_ed25519_BYTES, sizeof(m) - crypto_sign_ed25519_BYTES, sk) != 0) return 111; ++count; } printf("crypto_sign_ed25519: %lld sigs/s (%s, %s)\n", count, implementation, version); alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_sign_ed25519_open(m, &mlen, sm, sizeof sm, pk) != 0) return 111; ++count; } printf("crypto_sign_ed25519_open: %lld sigs/s (%s, %s)\n", count, implementation, version); #ifdef crypto_kem_sntrup4591761_IMPLEMENTATION alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_kem_sntrup4591761_keypair(pk, sk) != 0) return 111; ++count; } printf("crypto_kem_sntrup4591761_keypair: %lld keypairs/s (%s)\n", count, crypto_kem_sntrup4591761_IMPLEMENTATION); alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_kem_sntrup4591761_enc(c, k, pk) != 0) return 111; ++count; } printf("crypto_kem_sntrup4591761_enc: %lld encryptions/s (%s)\n", count, crypto_kem_sntrup4591761_IMPLEMENTATION); alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_kem_sntrup4591761_dec(k, c, sk) != 0) return 111; ++count; } printf("crypto_kem_sntrup4591761_dec: %lld decryptions/s (%s)\n", count, crypto_kem_sntrup4591761_IMPLEMENTATION); #endif #ifdef crypto_kem_sntrup4591761x25519_IMPLEMENTATION alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_kem_sntrup4591761x25519_keypair(pk, sk) != 0) return 111; ++count; } printf("crypto_kem_sntrup4591761x25519_keypair: %lld keypairs/s (%s)\n", count, crypto_kem_sntrup4591761x25519_IMPLEMENTATION); alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_kem_sntrup4591761x25519_enc(c, k, pk) != 0) return 111; ++count; } printf("crypto_kem_sntrup4591761x25519_enc: %lld encryptions/s (%s)\n", count, crypto_kem_sntrup4591761x25519_IMPLEMENTATION); alarm(1); flagtimeout = 0; count = 0; while (!flagtimeout) { if (crypto_kem_sntrup4591761x25519_dec(k, c, sk) != 0) return 111; ++count; } printf("crypto_kem_sntrup4591761x25519_dec: %lld decryptions/s (%s)\n", count, crypto_kem_sntrup4591761x25519_IMPLEMENTATION); #endif return 0; } tinyssh-20250501/_tinysshd-test-hello1.c000066400000000000000000000017101500472222400177570ustar00rootroot00000000000000/* 20160225 Jan Mojzis Public domain. */ #include #include #include int main(int argc, char **argv) { pid_t pid; int tochild[2] = {-1, -1}; int fromchild[2] = {-1, -1}; if (argc < 2) _exit(111); if (!argv[0]) _exit(111); if (!argv[1]) _exit(111); ++argv; if (pipe(tochild) == -1) _exit(111); if (pipe(fromchild) == -1) _exit(111); pid = fork(); if (pid == -1) _exit(111); if (pid == 0) { close(tochild[1]); close(fromchild[0]); close(1); /* simulate closed connection */ if (dup2(tochild[0], 0) == -1) _exit(111); if (dup2(fromchild[1], 1) == -1) _exit(111); execvp(*argv, argv); _exit(111); } close(tochild[0]); close(fromchild[1]); close(0); if (dup2(fromchild[0], 0) == -1) _exit(111); close(1); if (dup2(tochild[1], 1) == -1) _exit(111); signal(SIGPIPE, SIG_IGN); _exit(111); } tinyssh-20250501/_tinysshd-test-hello2.c000066400000000000000000000035701500472222400177660ustar00rootroot00000000000000/* 20160225 Jan Mojzis Public domain. */ #include #include #include #include "log.h" #include "packet.h" #include "global.h" #include "str.h" #include "writeall.h" static void cleanup(void) { global_purge(); } __attribute__((noreturn)) static void die_fatal(const char *trouble, const char *d, const char *fn) { cleanup(); if (d) { if (fn) log_f5(trouble, " ", d, "/", fn); else log_f3(trouble, " ", d); } else { log_f1(trouble); } _exit(111); } int main(int argc, char **argv) { pid_t pid; int tochild[2] = {-1, -1}; int fromchild[2] = {-1, -1}; const char *message; long long messagelen; if (argc < 2) _exit(111); if (!argv[0]) _exit(111); if (!argv[1]) _exit(111); if (!argv[2]) _exit(111); ++argv; message = *argv; messagelen = str_len(message); ++argv; if (pipe(tochild) == -1) _exit(111); if (pipe(fromchild) == -1) _exit(111); pid = fork(); if (pid == -1) _exit(111); if (pid == 0) { close(tochild[1]); close(fromchild[0]); if (dup2(tochild[0], 0) == -1) _exit(111); if (dup2(fromchild[1], 1) == -1) _exit(111); execvp(*argv, argv); _exit(111); } close(tochild[0]); close(fromchild[1]); close(0); if (dup2(fromchild[0], 0) == -1) _exit(111); close(1); if (dup2(tochild[1], 1) == -1) _exit(111); signal(SIGPIPE, SIG_IGN); global_init(); if (!packet_hello_receive()) die_fatal("unable to receive hello-string", 0, 0); if (messagelen) { if (writeall(1, message, messagelen) == -1) die_fatal("unable to write hello-string", 0, 0); if (writeall(1, "\r\n", 2) == -1) die_fatal("unable to write hello-string", 0, 0); } _exit(111); } tinyssh-20250501/_tinysshd-test-kex1.c000066400000000000000000000032521500472222400174460ustar00rootroot00000000000000/* 20160226 20241215 - reformated using clang-format Jan Mojzis Public domain. */ #include #include #include #include "log.h" #include "packet.h" #include "ssh.h" #include "bug.h" #include "packetparser.h" #include "global.h" static void cleanup(void) { global_purge(); } __attribute__((noreturn)) static void die_fatal(const char *trouble, const char *d, const char *fn) { cleanup(); if (d) { if (fn) log_f5(trouble, " ", d, "/", fn); else log_f3(trouble, " ", d); } else { log_f1(trouble); } _exit(111); } int main(int argc, char **argv) { pid_t pid; int tochild[2] = {-1, -1}; int fromchild[2] = {-1, -1}; if (argc < 2) _exit(111); if (!argv[0]) _exit(111); if (!argv[1]) _exit(111); ++argv; if (pipe(tochild) == -1) _exit(111); if (pipe(fromchild) == -1) _exit(111); pid = fork(); if (pid == -1) _exit(111); if (pid == 0) { close(tochild[1]); close(fromchild[0]); if (dup2(tochild[0], 0) == -1) _exit(111); if (dup2(fromchild[1], 1) == -1) _exit(111); execvp(*argv, argv); _exit(111); } close(tochild[0]); close(fromchild[1]); close(0); if (dup2(fromchild[0], 0) == -1) _exit(111); close(1); if (dup2(tochild[1], 1) == -1) _exit(111); signal(SIGPIPE, SIG_IGN); global_init(); log_init(2, "_tinysshd-test-kex1", 0, 0); if (!packet_hello_receive()) die_fatal("unable to receive hello-string", 0, 0); if (!packet_hello_send()) die_fatal("unable to send hello-string", 0, 0); _exit(111); } tinyssh-20250501/_tinysshd-test-kex2.c000066400000000000000000000130661500472222400174530ustar00rootroot00000000000000/* 20160226 Jan Mojzis Public domain. */ #include #include #include #include "log.h" #include "packet.h" #include "ssh.h" #include "bug.h" #include "packetparser.h" #include "global.h" static void cleanup(void) { global_purge(); } __attribute__((noreturn)) static void die_fatal(const char *trouble, const char *d, const char *fn) { cleanup(); if (d) { if (fn) log_f5(trouble, " ", d, "/", fn); else log_f3(trouble, " ", d); } else { log_f1(trouble); } _exit(111); } static int packet_disconnect_(struct buf *b) { buf_purge(b); buf_putnum8(b, SSH_MSG_DISCONNECT); /* byte SSH_MSG_DISCONNECT */ buf_putnum32(b, 0); /* uint32 reason code */ buf_putstring(b, "bye"); /* string description in ISO-10646 UTF-8 encoding [RFC3629] */ buf_putstring(b, ""); /* string language tag [RFC3066] */ packet_put(b); return packet_sendall(); } #if 0 static int _packet_debug(struct buf *b) { buf_purge(b); buf_putnum8(b, SSH_MSG_DEBUG); /* SSH_MSG_DEBUG */ buf_putnum8(b, 1); /* always_display */ buf_putstring(b, "test message"); /* message in ISO-10646 UTF-8 encoding [RFC3629] */ buf_putstring(b, ""); /* language tag [RFC3066] */ packet_put(b); return packet_sendall(); } #endif static int packet_kex_receive_(void) { struct buf *b = &packet.kexrecv; long long pos = 0; crypto_uint8 ch; crypto_uint32 len; if (!packet_getall(b, SSH_MSG_KEXINIT)) return 0; /* parse packet */ pos = packetparser_uint8(b->buf, b->len, pos, &ch); /* SSH_MSG_KEXINIT */ if (ch != SSH_MSG_KEXINIT) bug_proto(); pos = packetparser_skip(b->buf, b->len, pos, 16); /* cookie */ pos = packetparser_uint32(b->buf, b->len, pos, &len); /* kex algorithms */ pos = packetparser_skip(b->buf, b->len, pos, len); log_i2("kex algorithms: ", (char *) b->buf + pos - len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* server host key algorithms */ pos = packetparser_skip(b->buf, b->len, pos, len); log_i2("server host key algorithms: ", (char *) b->buf + pos - len); pos = packetparser_uint32( b->buf, b->len, pos, &len); /* encryption algorithms client to server */ pos = packetparser_skip(b->buf, b->len, pos, len); log_i2("encryption algorithms client to server: ", (char *) b->buf + pos - len); pos = packetparser_uint32( b->buf, b->len, pos, &len); /* encryption algorithms server to client */ pos = packetparser_skip(b->buf, b->len, pos, len); log_i2("encryption algorithms server to client: ", (char *) b->buf + pos - len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* mac algorithms client to server */ pos = packetparser_skip(b->buf, b->len, pos, len); log_i2("mac algorithms client to server: ", (char *) b->buf + pos - len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* mac algorithms server to client */ pos = packetparser_skip(b->buf, b->len, pos, len); log_i2("mac algorithms server to client: ", (char *) b->buf + pos - len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* compress algorithms client to server */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* compress algorithms server to client */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* languages client to server */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* languages server to client */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_uint8(b->buf, b->len, pos, &ch); /* kex first packet follows */ pos = packetparser_uint32(b->buf, b->len, pos, &len); /* reserved */ return 1; } static unsigned char bspace[1024]; static struct buf b; int main(int argc, char **argv) { pid_t pid; int tochild[2] = {-1, -1}; int fromchild[2] = {-1, -1}; if (argc < 2) _exit(111); if (!argv[0]) _exit(111); if (!argv[1]) _exit(111); ++argv; buf_init(&b, bspace, sizeof bspace); if (pipe(tochild) == -1) _exit(111); if (pipe(fromchild) == -1) _exit(111); pid = fork(); if (pid == -1) _exit(111); if (pid == 0) { close(tochild[1]); close(fromchild[0]); if (dup2(tochild[0], 0) == -1) _exit(111); if (dup2(fromchild[1], 1) == -1) _exit(111); execvp(*argv, argv); _exit(111); } close(tochild[0]); close(fromchild[1]); close(0); if (dup2(fromchild[0], 0) == -1) _exit(111); close(1); if (dup2(tochild[1], 1) == -1) _exit(111); signal(SIGPIPE, SIG_IGN); global_init(); log_init(0, "_tinysshd-test-kex1", 0, 0); if (!packet_hello_receive()) die_fatal("unable to receive hello-string", 0, 0); if (!packet_hello_send()) die_fatal("unable to send hello-string", 0, 0); if (!packet_kex_receive_()) die_fatal("unable to receive kex-message", 0, 0); if (!packet_disconnect_(&b)) die_fatal("unable to send disconnect-message", 0, 0); _exit(111); } tinyssh-20250501/_tinysshd-unauthenticated.c000066400000000000000000000051301500472222400210030ustar00rootroot00000000000000/* 20141210 Jan Mojzis Public domain. */ #include #include #include #include "log.h" #include "packet.h" #include "ssh.h" #include "bug.h" #include "packetparser.h" #include "global.h" static void cleanup(void) { global_purge(); } __attribute__((noreturn)) static void die_fatal(const char *trouble, const char *d, const char *fn) { cleanup(); if (d) { if (fn) log_f5(trouble, " ", d, "/", fn); else log_f3(trouble, " ", d); } else { log_f1(trouble); } _exit(111); } static int packet_debug_(struct buf *b) { buf_purge(b); buf_putnum8(b, SSH_MSG_DEBUG); /* SSH_MSG_DEBUG */ buf_putnum8(b, 1); /* always_display */ buf_putstring( b, "test message"); /* message in ISO-10646 UTF-8 encoding [RFC3629] */ buf_putstring(b, ""); /* language tag [RFC3066] */ packet_put(b); return packet_sendall(); } static unsigned char bspace[1024]; static struct buf b; int main(int argc, char **argv) { pid_t pid; int tochild[2] = {-1, -1}; int fromchild[2] = {-1, -1}; long long i; if (argc < 2) _exit(111); if (!argv[0]) _exit(111); if (!argv[1]) _exit(111); ++argv; buf_init(&b, bspace, sizeof bspace); if (pipe(tochild) == -1) _exit(111); if (pipe(fromchild) == -1) _exit(111); pid = fork(); if (pid == -1) _exit(111); if (pid == 0) { close(tochild[1]); close(fromchild[0]); close(2); if (dup2(tochild[0], 0) == -1) _exit(111); if (dup2(fromchild[1], 1) == -1) _exit(111); execvp(*argv, argv); _exit(111); } close(tochild[0]); close(fromchild[1]); close(0); if (dup2(fromchild[0], 0) == -1) _exit(111); close(1); if (dup2(tochild[1], 1) == -1) _exit(111); signal(SIGPIPE, SIG_IGN); global_init(); log_init(1, "_tinysshd-unauthenticated", 0, 0); if (!packet_hello_receive()) die_fatal("unable to receive hello-string", 0, 0); if (!packet_hello_send()) die_fatal("unable to send hello-string", 0, 0); for (i = 1; i < 100 * PACKET_UNAUTHENTICATED_MESSAGES; ++i) { if (!packet_debug_(&b)) { if (i < PACKET_UNAUTHENTICATED_MESSAGES) die_fatal( "unable to send debug message - parent died too early", 0, 0); _exit(0); /* limitation works */ } if (i > PACKET_UNAUTHENTICATED_MESSAGES) usleep(1000); /* XXX */ } die_fatal("limitation is not working !!!!!!!!!!", 0, 0); } tinyssh-20250501/blocking.c000066400000000000000000000005051500472222400154050ustar00rootroot00000000000000/* taken from nacl-20110221, from from curvecp/blocking.c - reformated using clang-format */ #include #include "blocking.h" void blocking_enable(int fd) { fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK); } void blocking_disable(int fd) { fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK); } tinyssh-20250501/blocking.h000066400000000000000000000001741500472222400154140ustar00rootroot00000000000000#ifndef BLOCKING_H____ #define BLOCKING_H____ extern void blocking_enable(int); extern void blocking_disable(int); #endif tinyssh-20250501/buf.c000066400000000000000000000137161500472222400144010ustar00rootroot00000000000000/* 20140108 20241208 - reformated using clang-format Jan Mojzis Public domain. The 'buf' library holds a string in allocated space. The string length is limited by allocated memory. All 'buf_put*' functions checks the limit and if the string exceeds the limit, 'buf_put*' function immediately exits with 111 status code. */ #include "byte.h" #include "str.h" #include "purge.h" #include "randombytes.h" #include "crypto_uint32.h" #include "bug.h" #include "buf.h" /* Initialize 'b' structure. */ void buf_init_(const char *fn, unsigned long long line, struct buf *b, unsigned char *buf, long long alloc) { if (!b || !buf || alloc <= 0 || alloc > 1073741824) bug_inval_(fn, line); b->buf = buf; b->len = 0; b->alloc = alloc; purge(b->buf, b->alloc); } /* Remove content of 'b'. */ void buf_purge_(const char *fn, unsigned long long line, struct buf *b) { if (!b || b->len < 0 || b->len > 1073741824 || b->alloc <= 0 || b->alloc > 1073741824 || !b->buf) bug_inval_(fn, line); purge(b->buf, b->len); b->len = 0; } /* Retun if 'b' has available space for string of length 'len'. */ int buf_ready_(const char *fn, unsigned long long line, struct buf *b, long long len) { if (!b || b->len < 0 || b->len > 1073741824 || b->alloc <= 0 || b->alloc > 1073741824 || !b->buf || len < 0 || len > 1073741824) bug_inval_(fn, line); return (b->len + len < b->alloc); } /* Put string 'x' of length 'len'. */ int buf_put_(const char *fn, unsigned long long line, struct buf *b, const unsigned char *x, long long len) { if (!b || b->len < 0 || b->len > 1073741824 || b->alloc <= 0 || b->alloc > 1073741824 || !b->buf || !x || len < 0 || len > 1073741824) bug_inval_(fn, line); if (b->len + len >= b->alloc) bug_nomem_(fn, line); byte_copy(b->buf + b->len, len, x); b->len += len; return 1; } /* Put 0-terminated string 'x'. */ int buf_puts_(const char *fn, unsigned long long line, struct buf *b, const char *x) { return buf_put_(fn, line, b, (const unsigned char *) x, str_len(x)); } /* Put zero bytes of length 'len'. */ int buf_putzerobytes_(const char *fn, unsigned long long line, struct buf *b, long long len) { if (!b || b->len < 0 || b->len > 1073741824 || b->alloc <= 0 || b->alloc > 1073741824 || !b->buf || len < 0 || len > 1073741824) bug_inval_(fn, line); if (b->len + len >= b->alloc) bug_nomem_(fn, line); byte_zero(b->buf + b->len, len); b->len += len; return 1; } /* Put random bytes of length 'len'. */ int buf_putrandombytes_(const char *fn, unsigned long long line, struct buf *b, long long len) { if (!b || b->len < 0 || b->len > 1073741824 || b->alloc <= 0 || b->alloc > 1073741824 || !b->buf || len < 0 || len > 1073741824) bug_inval_(fn, line); if (b->len + len >= b->alloc) bug_nomem_(fn, line); randombytes(b->buf + b->len, len); b->len += len; return 1; } /* Put padding of length 'len'. */ int buf_putpadding_(const char *fn, unsigned long long line, struct buf *b, long long len) { if (!b || b->len < 0 || b->len > 1073741824 || b->alloc <= 0 || b->alloc > 1073741824 || !b->buf || len < 0 || len > 1073741824) bug_inval_(fn, line); if (b->len + len >= b->alloc) bug_nomem_(fn, line); purge(b->buf + b->len, len); b->len += len; return 1; } /* Put 32-bit unsigned integer in big-endian format. */ int buf_putnum32_(const char *fn, unsigned long long line, struct buf *b, crypto_uint32 x) { unsigned char s[4]; crypto_uint32_store_bigendian(s, x); return buf_put_(fn, line, b, s, sizeof s); } /* Put 8-bit unsigned integer. */ int buf_putnum8_(const char *fn, unsigned long long line, struct buf *b, crypto_uint8 u) { return buf_put_(fn, line, b, &u, 1); } /* Put string 'x' of length 'len' and format it as a SSH-string. */ int buf_putstringlen_(const char *fn, unsigned long long line, struct buf *b, const unsigned char *x, long long len) { if (!buf_putnum32_(fn, line, b, len)) return 0; return buf_put_(fn, line, b, x, len); } /* Put 0-terminated string 'x' and format it as a SSH-string. */ int buf_putstring_(const char *fn, unsigned long long line, struct buf *b, const char *x) { return buf_putstringlen_(fn, line, b, (const unsigned char *) x, str_len(x)); } /* Put SSH shared secret (bignum formated into wire format) */ int buf_putsharedsecret_(const char *fn, unsigned long long line, struct buf *b, const unsigned char *x, long long len) { long long pos; if (len < 0 || len > 1073741824 || !b || !x) bug_inval_(fn, line); for (pos = 0; pos < len; ++pos) if (x[pos]) break; if (x[pos] & 0x80) { buf_putnum32_(fn, line, b, len - pos + 1); buf_putnum8_(fn, line, b, 0); } else { buf_putnum32_(fn, line, b, len - pos + 0); } return buf_put_(fn, line, b, x + pos, len - pos); } /* Put string 'x' of length 'len' and encode it into base64. */ static const unsigned char b64chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int buf_putbase64_(const char *fn, unsigned long long line, struct buf *b, const unsigned char *x, long long len) { long long i; unsigned long long bits = 0, v = 0; unsigned char ch; if (len < 0 || len > 1073741824 || !b || !x) bug_inval_(fn, line); for (i = 0; i < len; ++i) { v <<= 8; v += x[i]; bits += 8; while (bits > 6) { ch = b64chars[((v >> (bits - 6)) & 63)]; buf_putnum8_(fn, line, b, ch); bits -= 6; } } if (bits) { v <<= (6 - bits); ch = b64chars[v & 63]; buf_putnum8_(fn, line, b, ch); } while (b->len & 3) { buf_putnum8_(fn, line, b, '='); } return 1; } tinyssh-20250501/buf.h000066400000000000000000000061241500472222400144010ustar00rootroot00000000000000/* 20140108 20241208 - reformated using clang-format Jan Mojzis Public domain. */ #ifndef BUF_H____ #define BUF_H____ #include "crypto_uint8.h" #include "crypto_uint32.h" struct buf { unsigned char *buf; long long len; long long alloc; }; extern void buf_init_(const char *, unsigned long long, struct buf *, unsigned char *, long long); extern void buf_purge_(const char *, unsigned long long, struct buf *); extern int buf_ready_(const char *, unsigned long long, struct buf *, long long); extern int buf_put_(const char *, unsigned long long, struct buf *, const unsigned char *, long long); extern int buf_puts_(const char *, unsigned long long, struct buf *, const char *); extern int buf_putzerobytes_(const char *, unsigned long long, struct buf *, long long); extern int buf_putrandombytes_(const char *, unsigned long long, struct buf *, long long); extern int buf_putpadding_(const char *, unsigned long long, struct buf *, long long); extern int buf_putnum32_(const char *, unsigned long long, struct buf *, crypto_uint32); extern int buf_putnum8_(const char *, unsigned long long, struct buf *, crypto_uint8); extern int buf_putstringlen_(const char *, unsigned long long, struct buf *, const unsigned char *, long long); extern int buf_putstring_(const char *, unsigned long long, struct buf *, const char *); extern int buf_putsharedsecret_(const char *, unsigned long long, struct buf *, const unsigned char *, long long); extern int buf_putbase64_(const char *, unsigned long long, struct buf *, const unsigned char *, long long); #define buf_init(a, b, cc) buf_init_(__FILE__, __LINE__, (a), (b), (cc)) #define buf_purge(a) buf_purge_(__FILE__, __LINE__, (a)) #define buf_ready(a, b) buf_ready_(__FILE__, __LINE__, (a), (b)) #define buf_put(a, b, cc) buf_put_(__FILE__, __LINE__, (a), (b), (cc)) #define buf_puts(a, b) buf_puts_(__FILE__, __LINE__, (a), (b)) #define buf_putzerobytes(a, b) buf_putzerobytes_(__FILE__, __LINE__, (a), (b)) #define buf_putrandombytes(a, b) \ buf_putrandombytes_(__FILE__, __LINE__, (a), (b)) #define buf_putpadding(a, b) buf_putpadding_(__FILE__, __LINE__, (a), (b)) #define buf_putnum32(a, b) buf_putnum32_(__FILE__, __LINE__, (a), (b)) #define buf_putnum8(a, b) buf_putnum8_(__FILE__, __LINE__, (a), (b)) #define buf_putstringlen(a, b, cc) \ buf_putstringlen_(__FILE__, __LINE__, (a), (b), (cc)) #define buf_putstring(a, b) buf_putstring_(__FILE__, __LINE__, (a), (b)) #define buf_putsharedsecret(a, b, cc) \ buf_putsharedsecret_(__FILE__, __LINE__, (a), (b), (cc)) #define buf_putbase64(a, b, cc) \ buf_putbase64_(__FILE__, __LINE__, (a), (b), (cc)) #endif tinyssh-20250501/bug.h000066400000000000000000000047531500472222400144100ustar00rootroot00000000000000#ifndef BUG_H____ #define BUG_H____ #include #include "global.h" #include "e.h" #include "log.h" #define bug_(a, b) \ do { \ log_9_(-1, 0, a, b, 0, 0, 0, 0, 0, 0, 0, 0, 0); \ global_die(111); \ } while (0) #define bug() bug_(__FILE__, __LINE__) #define bug_nomem() \ do { \ errno = ENOMEM; \ bug(); \ } while (0) #define bug_proto() \ do { \ errno = EPROTO; \ bug(); \ } while (0) #define bug_inval() \ do { \ errno = EINVAL; \ bug(); \ } while (0) #define bug_nomem_(a, b) \ do { \ errno = ENOMEM; \ bug_(a, b); \ } while (0) #define bug_proto_(a, b) \ do { \ errno = EPROTO; \ bug_(a, b); \ } while (0) #define bug_inval_(a, b) \ do { \ errno = EINVAL; \ bug_(a, b); \ } while (0) #endif tinyssh-20250501/byte.c000066400000000000000000000013061500472222400145600ustar00rootroot00000000000000/* 20241205 */ #include "crypto_int16.h" #include "byte.h" void byte_copy(void *yv, long long ylen, const void *xv) { long long i; const char *x = xv; char *y = yv; for (i = 0; i < ylen; ++i) y[i] = x[i]; } int byte_isequal(const void *yv, long long ylen, const void *xv) { long long i; const unsigned char *y = yv; const unsigned char *x = xv; unsigned char diff = 0; for (i = 0; i < ylen; ++i) diff |= x[i] ^ y[i]; return crypto_int16_zero_01(diff); } void byte_zero(void *yv, long long ylen) { long long i; volatile char *y = yv; for (i = 0; i < ylen; ++i) y[i] = 0; #ifdef __GNUC__ __asm__ __volatile__("" : : "r"(yv) : "memory"); #endif } tinyssh-20250501/byte.h000066400000000000000000000003211500472222400145610ustar00rootroot00000000000000#ifndef BYTE_H____ #define BYTE_H____ extern void byte_zero(void *, long long); extern void byte_copy(void *, long long, const void *); extern int byte_isequal(const void *, long long, const void *); #endif tinyssh-20250501/channel.c000066400000000000000000000276161500472222400152410ustar00rootroot00000000000000/* 20140124 20241209 - reformated using clang-format Jan Mojzis Public domain. The 'channel' library is used to handle data from/to SSH channel (rfc4254). */ #include #include #include #include #include #include #include extern char *ptsname(int); #include "byte.h" #include "bug.h" #include "newenv.h" #include "e.h" #include "purge.h" #include "connectioninfo.h" #include "iptostr.h" #include "porttostr.h" #include "buf.h" #include "str.h" #include "logsys.h" #include "loginshell.h" #include "trymlock.h" #include "limit.h" #include "channel.h" /* 1. channel not open: maxpacket == 0, pid == 0 2. channel open: maxpacket != 0, pid == 0 3. child executed: maxpacket != 0, pid > 0, fd[01] != -1 4. child eof: maxpacket != 0, pid > 0, fd[12] == -1 5. child died: maxpacket != 0, pid == -1 */ struct channel channel = {0}; /* The 'channel_open' function opens the channel. It sets 'localwindow' and maxpacket, values obtained from from SSH_MSG_CHANNEL_OPEN message. Function also obtaines connection information and sets environment variables PATH, SSH_CONNECTION and MAIL. */ int channel_open(const char *user, crypto_uint32 id, crypto_uint32 remotewindow, crypto_uint32 maxpacket, crypto_uint32 *localwindow) { struct buf b = {channel.buf0, 0, CHANNEL_BUFSIZE}; if (!localwindow) bug_inval(); if (!maxpacket) bug_inval(); if (!remotewindow) bug_inval(); if (channel.maxpacket != 0) return 0; if (channel.pid != 0) return 0; /* copy user-name */ if (!str_copyn(channel.user, sizeof channel.user, user)) bug_nomem(); /* set id, maxpacket, remotewindow, localwindow */ channel.id = id; channel.maxpacket = maxpacket; channel.remotewindow = remotewindow; channel.localwindow = *localwindow = CHANNEL_BUFSIZE; /* copy PATH */ if (!newenv_copyenv("PATH")) { if (!newenv_env("PATH", "/bin:/usr/bin")) return 0; } /* create env. SSH_CONNECTION */ connectioninfo(channel.localip, channel.localport, channel.remoteip, channel.remoteport); buf_purge(&b); buf_puts(&b, channel.remoteip); buf_puts(&b, " "); buf_puts(&b, channel.remoteport); buf_puts(&b, " "); buf_puts(&b, channel.localip); buf_puts(&b, " "); buf_puts(&b, channel.localport); buf_putnum8(&b, 0); if (!newenv_env("SSH_CONNECTION", (char *) b.buf)) return 0; #ifdef _PATH_MAILDIR /* create env. MAIL */ buf_purge(&b); buf_puts(&b, _PATH_MAILDIR); buf_puts(&b, "/"); buf_puts(&b, user); buf_putnum8(&b, 0); if (!newenv_env("MAIL", (char *) b.buf)) return 0; #endif purge(channel.buf0, sizeof channel.buf0); return 1; } /* The 'channel_openterminal' function opens terminal, sets environment variable TERM and initial terminal windowsize. */ int channel_openterminal(const char *name, crypto_uint32 a, crypto_uint32 b, crypto_uint32 x, crypto_uint32 y) { if (channel.maxpacket == 0) bug_proto(); if (channel.pid != 0) bug_proto(); if (channel.flagterminal == 1) bug_proto(); if (!channel_openpty(&channel.master, &channel.slave)) return 0; if (!newenv_env("TERM", name)) return 0; channel.flagterminal = 1; channel.a = a; channel.b = b; channel.x = x; channel.y = y; return 1; } /* The 'channel_ptyresize' function sets new terminal windowsize. */ void channel_ptyresize(crypto_uint32 a, crypto_uint32 b, crypto_uint32 x, crypto_uint32 y) { struct winsize w; if (channel.maxpacket == 0) bug_proto(); if (channel.pid <= 0) bug_proto(); if (!a && !b && !x && !y) return; w.ws_col = a; w.ws_row = b; w.ws_xpixel = x; w.ws_ypixel = y; ioctl(channel.fd0, TIOCSWINSZ, &w); } /* The 'channel_env' adds new environment variable sent from client. */ int channel_env(const char *x, const char *y) { if (channel.maxpacket == 0) bug_proto(); if (channel.pid != 0) bug_proto(); if (!x || !y) bug_inval(); return newenv_lowenv(x, y); } /* The 'channel_exec' function executes new process. If terminal is requsted, than users shell is executed, if exec is requested, than command 'cmd' is executed. Process is executed under appropriate users UID. */ int channel_exec(const char *cmd) { char *run[4]; char *shell; char *name; int fd[3]; char ln[NAME_MAX + 2]; if (channel.maxpacket == 0) bug_proto(); if (channel.pid != 0) bug_proto(); if (channel.flagterminal) { channel.pid = channel_forkpty(fd, channel.master, channel.slave); if (channel.pid > 0) { name = ptsname(fd[0]); if (!name) bug(); if (!str_copyn(channel.termname, sizeof channel.termname, name)) bug_nomem(); } } else { channel.pid = channel_fork(fd); } if (channel.pid == -1) return 0; if (channel.pid == 0) { logsys_login(channel.user, channel.remoteip, 0, 0); if (!channel_droppriv(channel.user, &shell)) _exit(111); if (cmd) { run[0] = shell; run[1] = (char *) "-c"; run[2] = (char *) cmd; run[3] = 0; } else { if (!loginshell(ln, sizeof ln, shell)) bug(); run[0] = ln; run[1] = 0; } signal(SIGPIPE, SIG_DFL); newenv_exec(shell, run); _exit(111); } channel.fd0 = fd[0]; channel.fd1 = fd[1]; channel.fd2 = fd[2]; channel.len0 = 0; newenv_purge(); if (channel.flagterminal && channel.pid > 0) { channel_ptyresize(channel.a, channel.b, channel.x, channel.y); } return 1; } /* The 'channel_put' function adds data from client to childs buffer. */ void channel_put(unsigned char *buf, long long len) { if (channel.maxpacket == 0) bug_proto(); if (channel.pid <= 0) bug_proto(); if (channel.fd0 == -1) bug_proto(); if (!buf || len < 0) bug_inval(); if (channel.len0 + len > CHANNEL_BUFSIZE) bug_nomem(); byte_copy(channel.buf0 + channel.len0, len, buf); channel.len0 += len; channel.localwindow -= len; } /* The 'channel_puteof' function adds information that remote side closed standard output. */ void channel_puteof(void) { if (channel.maxpacket == 0) bug_proto(); if (channel.pid == 0) bug_proto(); if (channel.fd0 == -1) bug_proto(); channel.remoteeof = 1; if (channel.len0 == 0 && !channel.flagterminal) { close(channel.fd0); channel.fd0 = -1; } } /* The 'channel_putisready' function returns if child is ready accept data. */ int channel_putisready(void) { if (channel.maxpacket == 0) return 0; if (channel.pid <= 0) return 0; if (channel.fd0 == -1) return 0; return (CHANNEL_BUFSIZE > channel.len0); } /* The 'channel_read' function reads data from childs standard output. */ long long channel_read(unsigned char *buf, long long len) { long long r; if (channel.maxpacket == 0) bug_proto(); if (channel.pid <= 0) bug_proto(); if (channel.fd1 == -1) bug_proto(); if (!buf || len < 0) bug_inval(); if (channel.remotewindow <= 0) return 0; r = len; if (r > 1048576) r = 1048576; if (r > channel.remotewindow) r = channel.remotewindow; r = read(channel.fd1, buf, r); if (r == -1) { if (errno == EINTR) return 0; if (errno == EAGAIN) return 0; if (errno == EWOULDBLOCK) return 0; } if (r <= 0) { channel.fd1 = -1; return 0; } channel.remotewindow -= r; return r; } /* The 'channel_extendedread' function reads data from childs error output. */ long long channel_extendedread(unsigned char *buf, long long len) { long long r; if (channel.maxpacket == 0) bug_proto(); if (channel.pid <= 0) bug_proto(); if (channel.fd2 == -1) bug_proto(); if (!buf || len < 0) bug_inval(); if (channel.remotewindow <= 0) return 0; r = len; if (r > 1048576) r = 1048576; if (r > channel.remotewindow) r = channel.remotewindow; r = read(channel.fd2, buf, r); if (r == -1) { if (errno == EINTR) return 0; if (errno == EAGAIN) return 0; if (errno == EWOULDBLOCK) return 0; } if (r <= 0) { channel.fd2 = -1; return 0; } channel.remotewindow -= r; return r; } /* The 'channel_readisready' function returns if we can read data from childs standard output. */ int channel_readisready(void) { if (channel.maxpacket == 0 || channel.pid == 0) return 0; if (channel.fd1 == -1) return 0; return (channel.remotewindow > 0); } /* The 'channel_extendedreadisready' function returns if we can read data from childs error output. */ int channel_extendedreadisready(void) { if (channel.maxpacket == 0 || channel.pid == 0) return 0; if (channel.fd2 == -1) return 0; return (channel.remotewindow > 0); } /* The 'channel_write' function writes data to childs standard input. */ int channel_write(void) { long long w; if (channel.maxpacket == 0) bug_proto(); if (channel.pid <= 0) bug_proto(); if (channel.fd0 == -1) bug_proto(); if (channel.len0 <= 0) return 1; w = write(channel.fd0, channel.buf0, channel.len0); if (w == -1) { if (errno == EINTR) return 1; if (errno == EAGAIN) return 1; if (errno == EWOULDBLOCK) return 1; } if (w <= 0) { channel.fd0 = -1; return 0; } byte_copy(channel.buf0, channel.len0 - w, channel.buf0 + w); purge(channel.buf0 + channel.len0 - w, w); channel.len0 -= w; if (channel.remoteeof && channel.len0 == 0 && !channel.flagterminal) { close(channel.fd0); channel.fd0 = -1; } return 1; } /* The 'channel_writeisready' function returns if we can write data to childs standard input. */ int channel_writeisready(void) { if (channel.maxpacket == 0) return 0; if (channel.pid <= 0) return 0; if (channel.fd0 == -1) return 0; return (channel.len0 > 0); } /* The 'channel_iseof' function returns if child closed standard and error output. */ int channel_iseof(void) { if (channel.maxpacket == 0) return 0; if (channel.pid == 0) return 0; if (channel.pid == -1) return 1; return (channel.fd1 == -1 && channel.fd2 == -1); } /* The 'channel_waitnohang' function returns if child exited or was killed. */ int channel_waitnohang(int *s, int *e) { int r, status; if (!s || !e) bug_inval(); if (channel.maxpacket == 0) bug_proto(); if (channel.pid <= 0) return 0; do { r = waitpid(channel.pid, &status, WNOHANG); } while (r == -1 && errno == EINTR); if (r <= 0) return 0; if (channel.flagterminal) { logsys_logout(channel.user, channel.remoteip, channel.termname, channel.pid); } if (WIFEXITED(status)) { *e = WEXITSTATUS(status); *s = 0; } else if (WIFSIGNALED(status)) { *e = 0; *s = WTERMSIG(status); } else { *e = *s = -1; } channel.pid = -1; return 1; } /* Remove sentitive data from allocated memory. */ void channel_purge(void) { purge(&channel, sizeof channel); trymunlock(&channel, sizeof channel); } /* Initialize channel structure. */ void channel_init(void) { trymlock(&channel, sizeof channel); purge(&channel, sizeof channel); channel.maxpacket = 0; channel.remoteeof = 0; channel.len0 = 0; channel.pid = 0; channel.flagterminal = 0; channel.master = -1; channel.slave = -1; } int channel_getfd0(void) { return channel.fd0; } int channel_getfd1(void) { return channel.fd1; } int channel_getfd2(void) { return channel.fd2; } long long channel_getlen0(void) { return channel.len0; } crypto_uint32 channel_getid(void) { return channel.id; } crypto_uint32 channel_getlocalwindow(void) { return channel.localwindow; } void channel_incrementremotewindow(crypto_uint32 x) { channel.remotewindow += x; } void channel_incrementlocalwindow(crypto_uint32 x) { channel.localwindow += x; } tinyssh-20250501/channel.h000066400000000000000000000053101500472222400152310ustar00rootroot00000000000000#ifndef CHANNEL_H____ #define CHANNEL_H____ #include "crypto_uint32.h" #include "iptostr.h" #include "porttostr.h" #include "limit.h" #define CHANNEL_BUFSIZE 131072 struct channel { /* channel */ crypto_uint32 maxpacket; crypto_uint32 id; crypto_uint32 localwindow; crypto_uint32 remotewindow; /* child */ unsigned char buf0[CHANNEL_BUFSIZE]; long long len0; long long pid; int fd0; int fd1; int fd2; int status; /* ip */ char localip[IPTOSTR_LEN]; char localport[PORTTOSTR_LEN]; char remoteip[IPTOSTR_LEN]; char remoteport[PORTTOSTR_LEN]; /* terminal */ char user[LOGIN_NAME_MAX + 1]; char termname[TTY_NAME_MAX + 1]; int flagterminal; int master; int slave; int a; int b; int x; int y; /* channel */ int remoteeof; }; extern struct channel channel; /* channel_drop.c */ extern int channel_droppriv(char *, char **); /* channel_fork.c */ extern long long channel_fork(int[3]); /* channel_forkpty.c */ extern long long channel_forkpty(int[3], int, int); extern int channel_openpty(int *, int *); /* channel.c */ extern void channel_purge(void); extern int channel_open(const char *, crypto_uint32, crypto_uint32, crypto_uint32, crypto_uint32 *); extern int channel_openterminal(const char *, crypto_uint32, crypto_uint32, crypto_uint32, crypto_uint32); extern void channel_ptyresize(crypto_uint32, crypto_uint32, crypto_uint32, crypto_uint32); extern int channel_env(const char *, const char *); extern int channel_exec(const char *); extern void channel_put(unsigned char *, long long); extern void channel_puteof(void); extern int channel_putisready(void); extern long long channel_read(unsigned char *, long long); extern long long channel_extendedread(unsigned char *, long long); extern int channel_readisready(void); extern int channel_extendedreadisready(void); extern int channel_write(void); extern int channel_writeisready(void); extern int channel_iseof(void); extern int channel_waitnohang(int *, int *); extern void channel_purge(void); extern void channel_init(void); extern int channel_getfd0(void); extern int channel_getfd1(void); extern int channel_getfd2(void); extern long long channel_getlen0(void); extern crypto_uint32 channel_getid(void); extern crypto_uint32 channel_getlocalwindow(void); extern void channel_incrementremotewindow(crypto_uint32); extern void channel_incrementlocalwindow(crypto_uint32); /* channel subsystem.c */ #define CHANNEL_SUBSYSTEM_MAX 64 extern int channel_subsystem_add(const char *); extern const char *channel_subsystem_get(const char *); extern void channel_subsystem_log(void); #endif tinyssh-20250501/channel_drop.c000066400000000000000000000020001500472222400162410ustar00rootroot00000000000000/* 20140129 Jan Mojzis Public domain. */ #include #include #include #include "dropuidgid.h" #include "newenv.h" #include "channel.h" int channel_droppriv(char *user, char **shell) { struct passwd *pw; char *name; pw = getpwnam(user); if (!pw) return 0; if (isatty(0)) { name = ttyname(0); if (!name) return 0; if (!newenv_env("SSH_TTY", name)) return 0; /* setowner */ if (chown(name, pw->pw_uid, pw->pw_gid) == -1) return 0; if (chmod(name, 0600) == -1) return 0; } /* drop privileges */ if (!dropuidgid(pw->pw_name, pw->pw_uid, pw->pw_gid)) return 0; if (chdir(pw->pw_dir) == -1) return 0; if (!newenv_env("HOME", pw->pw_dir)) return 0; if (!newenv_env("USER", pw->pw_name)) return 0; if (!newenv_env("LOGNAME", pw->pw_name)) return 0; if (!newenv_env("LOGIN", pw->pw_name)) return 0; if (!newenv_env("SHELL", pw->pw_shell)) return 0; *shell = pw->pw_shell; return 1; } tinyssh-20250501/channel_fork.c000066400000000000000000000022461500472222400162520ustar00rootroot00000000000000/* 20140129 20241209 - reformated using clang-format Jan Mojzis Public domain. */ #include #include "blocking.h" #include "open.h" #include "channel.h" /* The 'channel_fork' function is used to create a new process. Function creates 3 pipes from/to child: fd[0] is pipe to childs standard input fd[1] is pipe from childs standard output fd[2] is pipe from childs error output Function returns also childs PID. */ long long channel_fork(int fd[3]) { int pi[2], pa[3], ch[3]; long long i, pid; for (i = 0; i < 3; ++i) pa[i] = ch[i] = fd[i] = -1; for (i = 0; i < 3; ++i) { if (open_pipe(pi) == -1) goto cleanup; pa[i] = pi[i ? 0 : 1]; ch[i] = pi[i ? 1 : 0]; } pid = fork(); if (pid == -1) goto cleanup; if (pid == 0) { for (i = 0; i < 3; ++i) { close(pa[i]); close(i); blocking_enable(ch[i]); if (dup(ch[i]) != i) _exit(111); } return 0; } for (i = 0; i < 3; ++i) { close(ch[i]); fd[i] = pa[i]; } return pid; cleanup: for (i = 0; i < 3; ++i) { close(pa[i]); close(ch[i]); } return -1; } tinyssh-20250501/channel_forkpty.c000066400000000000000000000077531500472222400170170ustar00rootroot00000000000000/* 20150212 20241209 - reformated using clang-format Jan Mojzis Public domain. */ #include #if defined(sun) || defined(__hpux) #include #endif #include #include #include #include #include extern char *ptsname(int); extern int grantpt(int); extern int unlockpt(int); #include "hasopenpty.h" #ifdef HASOPENPTY extern int openpty(int *, int *, char *, struct termios *, struct winsize *); #endif #include "haslogintty.h" #ifdef HASLOGINTTY extern int login_tty(int); #endif #include "e.h" #include "coe.h" #include "blocking.h" #include "global.h" #include "channel.h" #ifndef HASLOGINTTY static int login_tty_(int fd) { char *name; setsid(); #ifdef TIOCSCTTY if (ioctl(fd, TIOCSCTTY, (char *) 0) == -1) return -1; #endif name = ttyname(fd); if (!name) return -1; #ifndef TIOCSCTTY if (fd != 0) close(0); if (fd != 1) close(1); if (fd != 2) close(2); close(open(name, O_RDWR)); #endif if (dup2(fd, 0) == -1) return -1; if (dup2(fd, 1) == -1) return -1; if (dup2(fd, 2) == -1) return -1; if (fd > 2) close(fd); return 0; } #endif #ifndef HASOPENPTY static int openpty_(int *amaster, int *aslave) { int master = -1, slave = -1; char *slave_name; static const char *fn[] = {"/dev/ptmx", "/dev/ptc", 0}; long long i; for (i = 0; fn[i]; ++i) { master = open(fn[i], O_RDWR | O_NOCTTY); if (master != -1) break; } if (master == -1) return -1; if (grantpt(master) == -1) { close(master); return -1; } if (unlockpt(master) == -1) { close(master); return -1; } slave_name = ptsname(master); if (!slave_name) { close(master); return -1; } slave = open(slave_name, O_RDWR | O_NOCTTY); if (slave == -1) { close(master); return -1; } #if defined(sun) || defined(__hpux) ioctl(slave, I_PUSH, "ptem"); ioctl(slave, I_PUSH, "ldterm"); #endif #if defined(sun) ioctl(slave, I_PUSH, "ttcompat"); #endif if (amaster) *amaster = master; if (aslave) *aslave = slave; return 0; } #endif int channel_openpty(int *amaster, int *aslave) { #ifdef HASOPENPTY if (openpty(amaster, aslave, 0, 0, 0) == -1) return 0; #else if (openpty_(amaster, aslave) == -1) return 0; #endif if (!ttyname(*aslave)) { close(*amaster); close(*aslave); return 0; } return 1; } /* The 'channel_forkpty' function is used to create a new process operating in a pseudoterminal. Function sets 3 integers in 'fd[3]': fd[0] and fd[1] is pseudoterminal fd fd[2] is always -1 */ long long channel_forkpty(int fd[3], int master, int slave) { long long pid, r; char ch; int pi[2]; if (!ttyname(slave)) return -1; if (pipe(pi) == -1) return -1; fd[0] = fd[1] = master; fd[2] = -1; pid = fork(); switch (pid) { case -1: close(pi[0]); close(pi[1]); close(slave); close(master); return -1; case 0: close(master); close(pi[0]); #ifdef HASLOGINTTY if (login_tty(slave) == -1) global_die(111); #else if (login_tty_(slave) == -1) global_die(111); #endif /* Trigger a read event on the other side of the pipe. */ do { r = write(pi[1], "", 1); } while (r == -1 && errno == EINTR); close(pi[1]); return 0; default: close(pi[1]); coe_enable(master); blocking_disable(master); /* Wait until child calls login_tty(slave), so that we can safely close(slave). Fixes race condition between close(slave) in parent and login_tty(slave) in child process. */ do { r = read(pi[0], &ch, sizeof ch); } while (r == -1 && errno == EINTR); close(pi[0]); close(slave); return pid; } } tinyssh-20250501/channel_subsystem.c000066400000000000000000000020731500472222400173450ustar00rootroot00000000000000/* 20150114 20241209 - reformated using clang-format Jan Mojzis Public domain. */ #include "str.h" #include "log.h" #include "e.h" #include "channel.h" static long long channel_subsystem_pos = 0; static const char *channel_subsystem[CHANNEL_SUBSYSTEM_MAX] = {0}; int channel_subsystem_add(const char *x) { if (channel_subsystem_pos >= CHANNEL_SUBSYSTEM_MAX) return 0; channel_subsystem[channel_subsystem_pos++] = x; return 1; } const char *channel_subsystem_get(const char *x) { long long len, i; if (!x) return 0; len = str_len(x); for (i = 0; i < CHANNEL_SUBSYSTEM_MAX; ++i) { if (!channel_subsystem[i]) break; if (str_start(channel_subsystem[i], x)) { if (channel_subsystem[i][len] == '=') { return channel_subsystem[i] + len + 1; } } } return 0; } void channel_subsystem_log(void) { long long i; for (i = 0; i < CHANNEL_SUBSYSTEM_MAX; ++i) { if (!channel_subsystem[i]) break; log_d3("subsystem: ", channel_subsystem[i], " registered"); } } tinyssh-20250501/cleanup.c000066400000000000000000000003721500472222400152460ustar00rootroot00000000000000#include "cleanup.h" void cleanup_(void *yv, long long ylen) { volatile char *y = (volatile char *) yv; while (ylen > 0) { *y++ = 0; --ylen; } #ifdef __GNUC__ __asm__ __volatile__("" : : "r"(yv) : "memory"); #endif } tinyssh-20250501/cleanup.h000066400000000000000000000002121500472222400152440ustar00rootroot00000000000000#ifndef CLEANUP_H____ #define CLEANUP_H____ extern void cleanup_(void *, long long); #define cleanup(x) cleanup_((x), sizeof(x)) #endif tinyssh-20250501/coe.c000066400000000000000000000005331500472222400143640ustar00rootroot00000000000000/* 20241112 */ #include #include "coe.h" /* The 'coe_enable(fd)' function enables the close-on-exec flag on a file-descriptor 'fd'. */ void coe_enable(int fd) { fcntl(fd, F_SETFD, 1); } /* The 'coe_disable(fd)' function disables the close-on-exec flag on a file-descriptor 'fd'. */ void coe_disable(int fd) { fcntl(fd, F_SETFD, 0); } tinyssh-20250501/coe.h000066400000000000000000000001501500472222400143640ustar00rootroot00000000000000#ifndef COE_H____ #define COE_H____ extern void coe_enable(int); extern void coe_disable(int); #endif tinyssh-20250501/connectioninfo.c000066400000000000000000000076351500472222400166430ustar00rootroot00000000000000/* 20140131 20241215 - reformated using clang-format Jan Mojzis Public domain. */ #include #include #include #include #include #include "e.h" #include "byte.h" #include "iptostr.h" #include "porttostr.h" #include "env.h" #include "str.h" #include "connectioninfo.h" /* The connectioninfo_fromfd function gets informations about TCP connection from getsockname(), getpeername() libc functions. */ static int connectioninfo_fromfd(char *localip, char *localport, char *remoteip, char *remoteport) { long long i; struct sockaddr_storage sa; socklen_t salen; int fd = 0; unsigned char ip[16]; unsigned char port[2]; char *ipstr[2]; char *portstr[2]; int (*op[2])(int, struct sockaddr *, socklen_t *) = {getsockname, getpeername}; ipstr[0] = localip; portstr[0] = localport; ipstr[1] = remoteip; portstr[1] = remoteport; for (i = 0; i < 2; ++i) { salen = sizeof sa; if (op[i](fd, (struct sockaddr *) &sa, &salen) == -1) return 0; if (sa.ss_family == PF_INET) { struct sockaddr_in *sin = (struct sockaddr_in *) &sa; byte_copy(ip, 12, "\0\0\0\0\0\0\0\0\0\0\377\377"); byte_copy(ip + 12, 4, &sin->sin_addr); byte_copy(port, 2, &sin->sin_port); } #ifdef PF_INET6 else if (sa.ss_family == PF_INET6) { struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) &sa; byte_copy(ip, 16, &sin6->sin6_addr); byte_copy(port, 2, &sin6->sin6_port); } #endif else { errno = EPROTONOSUPPORT; return 0; } iptostr(ipstr[i], ip); porttostr(portstr[i], port); } return 1; } static int env(char *y, long long ylen, const char *e) { char *x; x = env_get(e); if (!x) return 0; if (!str_copyn(y, ylen, x)) return 0; return 1; } /* The connectioninfo_fromtcpserverenv function gets informations about TCP connection from environment. */ static int connectioninfo_fromtcpserverenv(char *localip, char *localport, char *remoteip, char *remoteport) { if (!env(localip, IPTOSTR_LEN, "TCPLOCALIP")) return 0; if (!env(localport, PORTTOSTR_LEN, "TCPLOCALPORT")) return 0; if (!env(remoteip, IPTOSTR_LEN, "TCPREMOTEIP")) return 0; if (!env(remoteport, PORTTOSTR_LEN, "TCPREMOTEPORT")) return 0; return 1; } /* The connectioninfo_fromcurvecpserverenv function gets informations about CurveCP connection from environment. */ static int connectioninfo_fromcurvecpserverenv(char *localip, char *localport, char *remoteip, char *remoteport) { if (!env(localip, IPTOSTR_LEN, "CURVECPLOCALIP")) return 0; if (!env(localport, PORTTOSTR_LEN, "CURVECPLOCALPORT")) return 0; if (!env(remoteip, IPTOSTR_LEN, "CURVECPREMOTEIP")) return 0; if (!env(remoteport, PORTTOSTR_LEN, "CURVECPREMOTEPORT")) return 0; return 1; } #define unknown "unknown" #define port0 "0" /* The connectioninfo function gets informations about TCP/CurveCP connection. */ void connectioninfo(char *localip, char *localport, char *remoteip, char *remoteport) { if (connectioninfo_fromtcpserverenv(localip, localport, remoteip, remoteport)) return; if (connectioninfo_fromcurvecpserverenv(localip, localport, remoteip, remoteport)) return; if (connectioninfo_fromfd(localip, localport, remoteip, remoteport)) return; byte_copy(localip, sizeof unknown, unknown); byte_copy(remoteip, sizeof unknown, unknown); byte_copy(localport, sizeof port0, port0); byte_copy(remoteport, sizeof port0, port0); return; } tinyssh-20250501/connectioninfo.h000066400000000000000000000001771500472222400166420ustar00rootroot00000000000000#ifndef CONNECTIONINFO_H____ #define CONNECTIONINFO_H____ extern void connectioninfo(char *, char *, char *, char *); #endif tinyssh-20250501/crypto.h000066400000000000000000000015051500472222400151430ustar00rootroot00000000000000/* allways include local versions */ #include "crypto_int16.h" #include "crypto_int32.h" #include "crypto_int64.h" #include "crypto_int8.h" #include "crypto_uint16.h" #include "crypto_uint32.h" #include "crypto_uint64.h" #include "crypto_uint8.h" #include "crypto_verify_16.h" #include "crypto_verify_32.h" /* include randombytes from librandombytes */ #include "haslibrandombytes.h" #ifdef HASLIBRANDOMBYTES #include #else #include "randombytes.h" #endif /* TODO */ #include "crypto_hash_sha256.h" #include "crypto_hash_sha512.h" #include "crypto_kem_sntrup761.h" #include "crypto_kem_sntrup761x25519.h" #include "crypto_onetimeauth_poly1305.h" #include "crypto_scalarmult_curve25519.h" #include "crypto_dh_x25519.h" #include "crypto_sign_ed25519.h" #include "crypto_sort_uint32.h" #include "crypto_stream_chacha20.h" tinyssh-20250501/crypto_declassify.h000066400000000000000000000006641500472222400173560ustar00rootroot00000000000000#ifndef crypto_declassify_h #define crypto_declassify_h #include "hasvalgrind.h" #ifdef HASVALGRIND #include #define crypto_declassify_uses_valgrind 1 static void crypto_declassify(void *xv, long long xlen) { VALGRIND_MAKE_MEM_DEFINED(xv, xlen); } #else #define crypto_declassify_uses_valgrind 0 static void crypto_declassify(void *xv, long long xlen) { (void) xv; (void) xlen; } #endif #endif tinyssh-20250501/crypto_dh_x25519.c000066400000000000000000000015561500472222400165540ustar00rootroot00000000000000#include "crypto_dh_x25519.h" #include "haslib25519.h" #ifdef HASLIB25519 #include int crypto_dh_x25519_lib25519(unsigned char *k, const unsigned char *pk, const unsigned char *sk) { lib25519_dh_x25519(k, pk, sk); return 0; } int crypto_dh_x25519_lib25519_keypair(unsigned char *pk, unsigned char *sk) { lib25519_dh_x25519_keypair(pk, sk); return 0; } #else #include "randombytes.h" #include "crypto_scalarmult_curve25519.h" int crypto_dh_x25519_tinyssh(unsigned char *k, const unsigned char *pk, const unsigned char *sk) { return crypto_scalarmult_curve25519(k, sk, pk); } static const unsigned char basepoint[32] = {9}; int crypto_dh_x25519_tinyssh_keypair(unsigned char *q, unsigned char *n) { randombytes(n, 32); return crypto_dh_x25519(q, basepoint, n); } #endif tinyssh-20250501/crypto_dh_x25519.h000066400000000000000000000035511500472222400165560ustar00rootroot00000000000000#ifndef crypto_dh_x25519_H #define crypto_dh_x25519_H #include "haslib25519.h" #ifdef HASLIB25519 #include #define crypto_dh_x25519_lib25519_BYTES lib25519_dh_x25519_BYTES #define crypto_dh_x25519_lib25519_PUBLICKEYBYTES \ lib25519_dh_x25519_PUBLICKEYBYTES #define crypto_dh_x25519_lib25519_SECRETKEYBYTES \ lib25519_dh_x25519_SECRETKEYBYTES extern int crypto_dh_x25519_lib25519(unsigned char *, const unsigned char *, const unsigned char *); extern int crypto_dh_x25519_lib25519_keypair(unsigned char *, unsigned char *); #define crypto_dh_x25519 crypto_dh_x25519_lib25519 #define crypto_dh_x25519_keypair crypto_dh_x25519_lib25519_keypair #define crypto_dh_x25519_BYTES crypto_dh_x25519_lib25519_BYTES #define crypto_dh_x25519_PUBLICKEYBYTES crypto_dh_x25519_lib25519_PUBLICKEYBYTES #define crypto_dh_x25519_SECRETKEYBYTES crypto_dh_x25519_lib25519_SECRETKEYBYTES #define crypto_dh_x25519_IMPLEMENTATION "lib25519" #define crypto_dh_x25519_VERSION lib25519_version #else #define crypto_dh_x25519_tinyssh_BYTES 32 #define crypto_dh_x25519_tinyssh_PUBLICKEYBYTES 32 #define crypto_dh_x25519_tinyssh_SECRETKEYBYTES 32 extern int crypto_dh_x25519_tinyssh(unsigned char *, const unsigned char *, const unsigned char *); extern int crypto_dh_x25519_tinyssh_keypair(unsigned char *, unsigned char *); #define crypto_dh_x25519 crypto_dh_x25519_tinyssh #define crypto_dh_x25519_keypair crypto_dh_x25519_tinyssh_keypair #define crypto_dh_x25519_BYTES crypto_dh_x25519_tinyssh_BYTES #define crypto_dh_x25519_PUBLICKEYBYTES crypto_dh_x25519_tinyssh_PUBLICKEYBYTES #define crypto_dh_x25519_SECRETKEYBYTES crypto_dh_x25519_tinyssh_SECRETKEYBYTES #define crypto_dh_x25519_IMPLEMENTATION "tinyssh" #define crypto_dh_x25519_VERSION "-" #endif #endif tinyssh-20250501/crypto_hash_sha256.c000066400000000000000000000056221500472222400172350ustar00rootroot00000000000000/* 20241208 */ #include "crypto_uint32.h" #include "crypto_uint64.h" #include "crypto_hash_sha256.h" #define R(x, c) (((x) >> (c)) | ((x) << (32 - (c)))) #define Ch(x, y, z) (((x) & (y)) ^ (~(x) & (z))) #define Maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) #define Sigma0(x) (R((x), 2) ^ R((x), 13) ^ R((x), 22)) #define Sigma1(x) (R((x), 6) ^ R((x), 11) ^ R((x), 25)) #define sigma0(x) (R((x), 7) ^ R((x), 18) ^ ((x) >> 3)) #define sigma1(x) (R((x), 17) ^ R((x), 19) ^ ((x) >> 10)) static const crypto_uint32 K[64] = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2}; static void blocks(crypto_uint32 *z, const unsigned char *m, unsigned long long n) { crypto_uint32 b[8], a[8], w[64], t; long long i, j; for (i = 0; i < 8; ++i) a[i] = z[i]; while (n >= 64) { for (i = 0; i < 16; ++i) w[i] = crypto_uint32_load_bigendian(m + 4 * i); for (i = 16; i < 64; ++i) w[i] = (sigma1(w[i - 2]) + w[i - 7] + sigma0(w[i - 15]) + w[i - 16]); for (i = 0; i < 64; ++i) { for (j = 0; j < 8; ++j) b[j] = a[j]; t = a[7] + Sigma1(a[4]) + Ch(a[4], a[5], a[6]) + K[i] + w[i]; b[7] = t + Sigma0(a[0]) + Maj(a[0], a[1], a[2]); b[3] += t; for (j = 0; j < 8; ++j) a[(j + 1) % 8] = b[j]; } for (i = 0; i < 8; ++i) { a[i] += z[i]; z[i] = a[i]; } m += 64; n -= 64; } } int crypto_hash_sha256_tinyssh(unsigned char *o, const unsigned char *m, unsigned long long n) { unsigned long long i; unsigned char x[128]; unsigned long long b = n; crypto_uint32 h[8] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19}; blocks(h, m, n); m += n; n &= 63; m -= n; for (i = 0; i < sizeof x; ++i) x[i] = 0; for (i = 0; i < n; ++i) x[i] = m[i]; x[n] = 128; n = 128 - 64 * (n < 56); crypto_uint64_store_bigendian(x + n - 8, b << 3); blocks(h, x, n); for (i = 0; i < 8; ++i) crypto_uint32_store_bigendian(o + 4 * i, h[i]); return 0; } tinyssh-20250501/crypto_hash_sha256.h000066400000000000000000000007141500472222400172370ustar00rootroot00000000000000#ifndef crypto_hash_sha256_H #define crypto_hash_sha256_H #define crypto_hash_sha256_tinyssh_BYTES 32 extern int crypto_hash_sha256_tinyssh(unsigned char *, const unsigned char *, unsigned long long); #define crypto_hash_sha256 crypto_hash_sha256_tinyssh #define crypto_hash_sha256_BYTES crypto_hash_sha256_tinyssh_BYTES #define crypto_hash_sha256_IMPLEMENTATION "tinyssh" #define crypto_hash_sha256_VERSION "-" #endif tinyssh-20250501/crypto_hash_sha512.h000066400000000000000000000017241500472222400172340ustar00rootroot00000000000000#ifndef crypto_hash_sha512_H #define crypto_hash_sha512_H #include "haslib25519.h" #ifndef HASLIB25519 #define crypto_hash_sha512_tinyssh_BYTES 64 extern int crypto_hash_sha512_tinyssh(unsigned char *, const unsigned char *, unsigned long long); #define crypto_hash_sha512 crypto_hash_sha512_tinyssh #define crypto_hash_sha512_BYTES crypto_hash_sha512_tinyssh_BYTES #define crypto_hash_sha512_IMPLEMENTATION "tinyssh" #define crypto_hash_sha512_VERSION "-" #else #include #define crypto_hash_sha512_lib25519_BYTES lib25519_hash_sha512_BYTES extern int crypto_hash_sha512_lib25519(unsigned char *, const unsigned char *, unsigned long long); #define crypto_hash_sha512 crypto_hash_sha512_lib25519 #define crypto_hash_sha512_BYTES crypto_hash_sha512_lib25519_BYTES #define crypto_hash_sha512_IMPLEMENTATION "lib25519" #define crypto_hash_sha512_VERSION lib25519_version #endif #endif tinyssh-20250501/crypto_hash_sha512_lib25519.c000066400000000000000000000004411500472222400204560ustar00rootroot00000000000000#include "haslib25519.h" #ifdef HASLIB25519 #include #include "crypto_hash_sha512.h" int crypto_hash_sha512_lib25519(unsigned char *o, const unsigned char *m, unsigned long long n) { lib25519_hash_sha512(o, m, n); return 0; } #endif tinyssh-20250501/crypto_hash_sha512_tinyssh.c000066400000000000000000000103611500472222400210050ustar00rootroot00000000000000/* 20241210 - based on tweetnacl 20140427 (http://tweetnacl.cr.yp.to/software.html) */ #include "crypto_hash_sha512.h" #include "haslib25519.h" #ifndef HASLIB25519 #include "crypto_uint64.h" #define R(x, c) (((x) >> (c)) ^ ((x) << (64 - (c)))) #define Ch(x, y, z) (((x) & (y)) ^ (~(x) & (z))) #define Maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) #define Sigma0(x) (R((x), 28) ^ R((x), 34) ^ R((x), 39)) #define Sigma1(x) (R((x), 14) ^ R((x), 18) ^ R((x), 41)) #define sigma0(x) (R((x), 1) ^ R((x), 8) ^ ((x) >> 7)) #define sigma1(x) (R((x), 19) ^ R((x), 61) ^ ((x) >> 6)) static const crypto_uint64 K[80] = { 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL}; static void blocks(crypto_uint64 *z, const unsigned char *m, crypto_uint64 n) { crypto_uint64 b[8], a[8], w[80], t; long long i, j; for (i = 0; i < 8; ++i) a[i] = z[i]; while (n >= 128) { for (i = 0; i < 16; ++i) w[i] = crypto_uint64_load_bigendian(m + 8 * i); for (i = 16; i < 80; ++i) w[i] = (sigma1(w[i - 2]) + w[i - 7] + sigma0(w[i - 15]) + w[i - 16]); for (i = 0; i < 80; ++i) { for (j = 0; j < 8; ++j) b[j] = a[j]; t = a[7] + Sigma1(a[4]) + Ch(a[4], a[5], a[6]) + K[i] + w[i]; b[7] = t + Sigma0(a[0]) + Maj(a[0], a[1], a[2]); b[3] += t; for (j = 0; j < 8; ++j) a[(j + 1) % 8] = b[j]; } for (i = 0; i < 8; ++i) { a[i] += z[i]; z[i] = a[i]; } m += 128; n -= 128; } } int crypto_hash_sha512_tinyssh(unsigned char *o, const unsigned char *m, unsigned long long n) { unsigned long long i; unsigned char x[256]; crypto_uint64 b = n; crypto_uint64 h[8] = {0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, 0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL, 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, 0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL}; blocks(h, m, n); m += n; n &= 127; m -= n; for (i = 0; i < sizeof x; ++i) x[i] = 0; for (i = 0; i < n; ++i) x[i] = m[i]; x[n] = 128; n = 256 - 128 * (n < 112); x[n - 9] = b >> 61; crypto_uint64_store_bigendian(x + n - 8, b << 3); blocks(h, x, n); for (i = 0; i < 8; ++i) crypto_uint64_store_bigendian(o + 8 * i, h[i]); return 0; } #endif tinyssh-20250501/crypto_kem_sntrup761.h000066400000000000000000000064471500472222400176620ustar00rootroot00000000000000#ifndef crypto_kem_sntrup761_H #define crypto_kem_sntrup761_H #include "haslibntruprime.h" #ifndef HASLIBNTRUPRIME #define crypto_kem_sntrup761_tinyssh_SECRETKEYBYTES 1763 #define crypto_kem_sntrup761_tinyssh_PUBLICKEYBYTES 1158 #define crypto_kem_sntrup761_tinyssh_CIPHERTEXTBYTES 1039 #define crypto_kem_sntrup761_tinyssh_BYTES 32 extern int crypto_kem_sntrup761_tinyssh_keypair(unsigned char *, unsigned char *); extern int crypto_kem_sntrup761_tinyssh_enc(unsigned char *, unsigned char *, const unsigned char *); extern int crypto_kem_sntrup761_tinyssh_dec(unsigned char *, const unsigned char *, const unsigned char *); #define crypto_kem_sntrup761_keypair crypto_kem_sntrup761_tinyssh_keypair #define crypto_kem_sntrup761_enc crypto_kem_sntrup761_tinyssh_enc #define crypto_kem_sntrup761_dec crypto_kem_sntrup761_tinyssh_dec #define crypto_kem_sntrup761_SECRETKEYBYTES \ crypto_kem_sntrup761_tinyssh_SECRETKEYBYTES #define crypto_kem_sntrup761_PUBLICKEYBYTES \ crypto_kem_sntrup761_tinyssh_PUBLICKEYBYTES #define crypto_kem_sntrup761_CIPHERTEXTBYTES \ crypto_kem_sntrup761_tinyssh_CIPHERTEXTBYTES #define crypto_kem_sntrup761_BYTES crypto_kem_sntrup761_tinyssh_BYTES #define crypto_kem_sntrup761_IMPLEMENTATION "tinyssh" #define crypto_kem_sntrup761_VERSION "-" #else #include #define crypto_kem_sntrup761_libntruprime_SECRETKEYBYTES \ sntrup761_SECRETKEYBYTES #define crypto_kem_sntrup761_libntruprime_PUBLICKEYBYTES \ sntrup761_PUBLICKEYBYTES #define crypto_kem_sntrup761_libntruprime_CIPHERTEXTBYTES \ sntrup761_CIPHERTEXTBYTES #define crypto_kem_sntrup761_libntruprime_BYTES sntrup761_BYTES extern int crypto_kem_sntrup761_libntruprime_keypair(unsigned char *, unsigned char *); extern int crypto_kem_sntrup761_libntruprime_enc(unsigned char *, unsigned char *, const unsigned char *); extern int crypto_kem_sntrup761_libntruprime_dec(unsigned char *, const unsigned char *, const unsigned char *); #define crypto_kem_sntrup761_keypair crypto_kem_sntrup761_libntruprime_keypair #define crypto_kem_sntrup761_enc crypto_kem_sntrup761_libntruprime_enc #define crypto_kem_sntrup761_dec crypto_kem_sntrup761_libntruprime_dec #define crypto_kem_sntrup761_SECRETKEYBYTES \ crypto_kem_sntrup761_libntruprime_SECRETKEYBYTES #define crypto_kem_sntrup761_PUBLICKEYBYTES \ crypto_kem_sntrup761_libntruprime_PUBLICKEYBYTES #define crypto_kem_sntrup761_CIPHERTEXTBYTES \ crypto_kem_sntrup761_libntruprime_CIPHERTEXTBYTES #define crypto_kem_sntrup761_BYTES crypto_kem_sntrup761_libntruprime_BYTES #define crypto_kem_sntrup761_IMPLEMENTATION "libntruprime" #define crypto_kem_sntrup761_VERSION "-" #endif #endif tinyssh-20250501/crypto_kem_sntrup761_libntruprime.c000066400000000000000000000013341500472222400224370ustar00rootroot00000000000000#include "haslibntruprime.h" #ifdef HASLIBNTRUPRIME #include #include "crypto_kem_sntrup761.h" int crypto_kem_sntrup761_libntruprime_keypair(unsigned char *pk, unsigned char *sk) { sntrup761_keypair(pk, sk); return 0; } int crypto_kem_sntrup761_libntruprime_enc(unsigned char *c, unsigned char *k, const unsigned char *pk) { sntrup761_enc(c, k, pk); return 0; } int crypto_kem_sntrup761_libntruprime_dec(unsigned char *k, const unsigned char *c, const unsigned char *sk) { sntrup761_dec(k, c, sk); return 0; } #endif tinyssh-20250501/crypto_kem_sntrup761_tinyssh.c000066400000000000000000000702331500472222400214300ustar00rootroot00000000000000#include "crypto_kem_sntrup761.h" #include "haslibntruprime.h" #ifndef HASLIBNTRUPRIME /* Original code: supercop-20210125/crypto_kem/sntrup761/ref Modifications (Jan Mojzis): - source code merged into single file - crypto_kem renamed to crypto_kem_sntrup761_tinyssh - crypto_declassify added */ /* See https://ntruprime.cr.yp.to/software.html for detailed documentation. */ #include #include "crypto_uint64.h" #include "crypto_uint32.h" #include "crypto_uint16.h" #include "crypto_int32.h" #include "crypto_int16.h" #include "crypto_int8.h" #include "randombytes.h" #include "crypto_verify_32.h" #include "crypto_sort_uint32.h" #include "crypto_hash_sha512.h" #include "crypto_declassify.h" #define uint64 crypto_uint64 #define uint32 crypto_uint32 #define uint16 crypto_uint16 #define int32 crypto_int32 #define int16 crypto_int16 #define int8 crypto_int8 /* uint32.c */ /* CPU division instruction typically takes time depending on x. This software is designed to take time independent of x. Time still varies depending on m; user must ensure that m is constant. Time also varies on CPUs where multiplication is variable-time. There could be more CPU issues. There could also be compiler issues. */ static void uint32_divmod_uint14(uint32 *q, uint16 *r, uint32 x, uint16 m) { uint32 v = 0x80000000; uint32 qpart; uint32 mask; v /= m; /* caller guarantees m > 0 */ /* caller guarantees m < 16384 */ /* vm <= 2^31 <= vm+m-1 */ /* xvm <= 2^31 x <= xvm+x(m-1) */ *q = 0; qpart = (x * (uint64) v) >> 31; /* 2^31 qpart <= xv <= 2^31 qpart + 2^31-1 */ /* 2^31 qpart m <= xvm <= 2^31 qpart m + (2^31-1)m */ /* 2^31 qpart m <= 2^31 x <= 2^31 qpart m + (2^31-1)m + x(m-1) */ /* 0 <= 2^31 newx <= (2^31-1)m + x(m-1) */ /* 0 <= newx <= (1-1/2^31)m + x(m-1)/2^31 */ /* 0 <= newx <= (1-1/2^31)(2^14-1) + (2^32-1)((2^14-1)-1)/2^31 */ x -= qpart * m; *q += qpart; /* x <= 49146 */ qpart = (x * (uint64) v) >> 31; /* 0 <= newx <= (1-1/2^31)m + x(m-1)/2^31 */ /* 0 <= newx <= m + 49146(2^14-1)/2^31 */ /* 0 <= newx <= m + 0.4 */ /* 0 <= newx <= m */ x -= qpart * m; *q += qpart; /* x <= m */ x -= m; *q += 1; mask = -(x >> 31); x += mask & (uint32) m; *q += mask; /* x < m */ *r = x; } uint32 uint32_div_uint14(uint32 x, uint16 m) { uint32 q; uint16 r; uint32_divmod_uint14(&q, &r, x, m); return q; } uint16 uint32_mod_uint14(uint32 x, uint16 m) { uint32 q; uint16 r; uint32_divmod_uint14(&q, &r, x, m); return r; } /* int32.c */ static void int32_divmod_uint14(int32 *q, uint16 *r, int32 x, uint16 m) { uint32 uq, uq2; uint16 ur, ur2; uint32 mask; uint32_divmod_uint14(&uq, &ur, 0x80000000 + (uint32) x, m); uint32_divmod_uint14(&uq2, &ur2, 0x80000000, m); ur -= ur2; uq -= uq2; mask = -(uint32) (ur >> 15); ur += mask & m; uq += mask; *r = ur; *q = uq; } int32 int32_div_uint14(int32 x, uint16 m) { int32 q; uint16 r; int32_divmod_uint14(&q, &r, x, m); return q; } uint16 int32_mod_uint14(int32 x, uint16 m) { int32 q; uint16 r; int32_divmod_uint14(&q, &r, x, m); return r; } /* paramsmenu.h */ /* pick one of these three: */ #define SIZE761 #undef SIZE653 #undef SIZE857 /* pick one of these two: */ #define SNTRUP /* Streamlined NTRU Prime */ #undef LPR /* NTRU LPRime */ /* params.h */ #ifndef params_H #define params_H /* menu of parameter choices: */ /* what the menu means: */ #if defined(SIZE761) #define p 761 #define q 4591 #define Rounded_bytes 1007 #ifndef LPR #define Rq_bytes 1158 #define w 286 #else #define w 250 #define tau0 2156 #define tau1 114 #define tau2 2007 #define tau3 287 #endif #elif defined(SIZE653) #define p 653 #define q 4621 #define Rounded_bytes 865 #ifndef LPR #define Rq_bytes 994 #define w 288 #else #define w 252 #define tau0 2175 #define tau1 113 #define tau2 2031 #define tau3 290 #endif #elif defined(SIZE857) #define p 857 #define q 5167 #define Rounded_bytes 1152 #ifndef LPR #define Rq_bytes 1322 #define w 322 #else #define w 281 #define tau0 2433 #define tau1 101 #define tau2 2265 #define tau3 324 #endif #else #error "no parameter set defined" #endif #ifdef LPR #define I 256 #endif #endif /* Decode.c */ static void Decode(uint16 *out, const unsigned char *S, const uint16 *M, long long len) { if (len == 1) { if (M[0] == 1) *out = 0; else if (M[0] <= 256) *out = uint32_mod_uint14(S[0], M[0]); else *out = uint32_mod_uint14(S[0] + (((uint16) S[1]) << 8), M[0]); } if (len > 1) { uint16 R2[(len + 1) / 2]; uint16 M2[(len + 1) / 2]; uint16 bottomr[len / 2]; uint32 bottomt[len / 2]; long long i; for (i = 0; i < len - 1; i += 2) { uint32 m = M[i] * (uint32) M[i + 1]; if (m > 256 * 16383) { bottomt[i / 2] = 256 * 256; bottomr[i / 2] = S[0] + 256 * S[1]; S += 2; M2[i / 2] = (((m + 255) >> 8) + 255) >> 8; } else if (m >= 16384) { bottomt[i / 2] = 256; bottomr[i / 2] = S[0]; S += 1; M2[i / 2] = (m + 255) >> 8; } else { bottomt[i / 2] = 1; bottomr[i / 2] = 0; M2[i / 2] = m; } } if (i < len) M2[i / 2] = M[i]; Decode(R2, S, M2, (len + 1) / 2); for (i = 0; i < len - 1; i += 2) { uint32 r = bottomr[i / 2]; uint32 r1; uint16 r0; r += bottomt[i / 2] * R2[i / 2]; uint32_divmod_uint14(&r1, &r0, r, M[i]); r1 = uint32_mod_uint14( r1, M[i + 1]); /* only needed for invalid inputs */ *out++ = r0; *out++ = r1; } if (i < len) *out++ = R2[i / 2]; } } /* Encode.c */ /* 0 <= R[i] < M[i] < 16384 */ static void Encode(unsigned char *out, const uint16 *R, const uint16 *M, long long len) { if (len == 1) { uint16 r = R[0]; uint16 m = M[0]; while (m > 1) { *out++ = r; r >>= 8; m = (m + 255) >> 8; } } if (len > 1) { uint16 R2[(len + 1) / 2]; uint16 M2[(len + 1) / 2]; long long i; for (i = 0; i < len - 1; i += 2) { uint32 m0 = M[i]; uint32 r = R[i] + R[i + 1] * m0; uint32 m = M[i + 1] * m0; while (m >= 16384) { *out++ = r; r >>= 8; m = (m + 255) >> 8; } R2[i / 2] = r; M2[i / 2] = m; } if (i < len) { R2[i / 2] = R[i]; M2[i / 2] = M[i]; } Encode(out, R2, M2, (len + 1) / 2); } } /* kem.c */ #ifdef LPR #endif /* ----- masks */ #ifndef LPR /* return -1 if x!=0; else return 0 */ static int int16_nonzero_mask(int16 x) { uint16 u = x; /* 0, else 1...65535 */ uint32 v = u; /* 0, else 1...65535 */ v = -v; /* 0, else 2^32-65535...2^32-1 */ v >>= 31; /* 0, else 1 */ return -v; /* 0, else -1 */ } #endif /* return -1 if x<0; otherwise return 0 */ static int int16_negative_mask(int16 x) { uint16 u = x; u >>= 15; return -(int) u; /* alternative with gcc -fwrapv: */ /* x>>15 compiles to CPU's arithmetic right shift */ } /* ----- arithmetic mod 3 */ typedef int8 small; /* F3 is always represented as -1,0,1 */ /* so ZZ_fromF3 is a no-op */ /* x must not be close to top int16 */ static small F3_freeze(int16 x) { return int32_mod_uint14(x + 1, 3) - 1; } /* ----- arithmetic mod q */ #define q12 ((q - 1) / 2) typedef int16 Fq; /* always represented as -q12...q12 */ /* so ZZ_fromFq is a no-op */ /* x must not be close to top int32 */ static Fq Fq_freeze(int32 x) { return int32_mod_uint14(x + q12, q) - q12; } #ifndef LPR static Fq Fq_recip(Fq a1) { int i = 1; Fq ai = a1; while (i < q - 2) { ai = Fq_freeze(a1 * (int32) ai); i += 1; } return ai; } #endif /* ----- Top and Right */ #ifdef LPR #define tau 16 static int8 Top(Fq C) { return (tau1 * (int32) (C + tau0) + 16384) >> 15; } static Fq Right(int8 T) { return Fq_freeze(tau3 * (int32) T - tau2); } #endif /* ----- small polynomials */ #ifndef LPR /* 0 if Weightw_is(r), else -1 */ static int Weightw_mask(small *r) { int weight = 0; int i; for (i = 0; i < p; ++i) weight += r[i] & 1; return int16_nonzero_mask(weight - w); } /* R3_fromR(R_fromRq(r)) */ static void R3_fromRq(small *out, const Fq *r) { int i; for (i = 0; i < p; ++i) out[i] = F3_freeze(r[i]); } /* h = f*g in the ring R3 */ static void R3_mult(small *h, const small *f, const small *g) { small fg[p + p - 1]; small result; int i, j; for (i = 0; i < p; ++i) { result = 0; for (j = 0; j <= i; ++j) result = F3_freeze(result + f[j] * g[i - j]); fg[i] = result; } for (i = p; i < p + p - 1; ++i) { result = 0; for (j = i - p + 1; j < p; ++j) result = F3_freeze(result + f[j] * g[i - j]); fg[i] = result; } for (i = p + p - 2; i >= p; --i) { fg[i - p] = F3_freeze(fg[i - p] + fg[i]); fg[i - p + 1] = F3_freeze(fg[i - p + 1] + fg[i]); } for (i = 0; i < p; ++i) h[i] = fg[i]; } /* returns 0 if recip succeeded; else -1 */ static int R3_recip(small *out, const small *in) { small f[p + 1], g[p + 1], v[p + 1], r[p + 1]; int i, loop, delta; int sign, swap, t; for (i = 0; i < p + 1; ++i) v[i] = 0; for (i = 0; i < p + 1; ++i) r[i] = 0; r[0] = 1; for (i = 0; i < p; ++i) f[i] = 0; f[0] = 1; f[p - 1] = f[p] = -1; for (i = 0; i < p; ++i) g[p - 1 - i] = in[i]; g[p] = 0; delta = 1; for (loop = 0; loop < 2 * p - 1; ++loop) { for (i = p; i > 0; --i) v[i] = v[i - 1]; v[0] = 0; sign = -g[0] * f[0]; swap = int16_negative_mask(-delta) & int16_nonzero_mask(g[0]); delta ^= swap & (delta ^ -delta); delta += 1; for (i = 0; i < p + 1; ++i) { t = swap & (f[i] ^ g[i]); f[i] ^= t; g[i] ^= t; t = swap & (v[i] ^ r[i]); v[i] ^= t; r[i] ^= t; } for (i = 0; i < p + 1; ++i) g[i] = F3_freeze(g[i] + sign * f[i]); for (i = 0; i < p + 1; ++i) r[i] = F3_freeze(r[i] + sign * v[i]); for (i = 0; i < p; ++i) g[i] = g[i + 1]; g[p] = 0; } sign = f[0]; for (i = 0; i < p; ++i) out[i] = sign * v[p - 1 - i]; return int16_nonzero_mask(delta); } #endif /* ----- polynomials mod q */ /* h = f*g in the ring Rq */ static void Rq_mult_small(Fq *h, const Fq *f, const small *g) { Fq fg[p + p - 1]; Fq result; int i, j; for (i = 0; i < p; ++i) { result = 0; for (j = 0; j <= i; ++j) result = Fq_freeze(result + f[j] * (int32) g[i - j]); fg[i] = result; } for (i = p; i < p + p - 1; ++i) { result = 0; for (j = i - p + 1; j < p; ++j) result = Fq_freeze(result + f[j] * (int32) g[i - j]); fg[i] = result; } for (i = p + p - 2; i >= p; --i) { fg[i - p] = Fq_freeze(fg[i - p] + fg[i]); fg[i - p + 1] = Fq_freeze(fg[i - p + 1] + fg[i]); } for (i = 0; i < p; ++i) h[i] = fg[i]; } #ifndef LPR /* h = 3f in Rq */ static void Rq_mult3(Fq *h, const Fq *f) { int i; for (i = 0; i < p; ++i) h[i] = Fq_freeze(3 * f[i]); } /* out = 1/(3*in) in Rq */ /* returns 0 if recip succeeded; else -1 */ static int Rq_recip3(Fq *out, const small *in) { Fq f[p + 1], g[p + 1], v[p + 1], r[p + 1]; int i, loop, delta; int swap, t; int32 f0, g0; Fq scale; for (i = 0; i < p + 1; ++i) v[i] = 0; for (i = 0; i < p + 1; ++i) r[i] = 0; r[0] = Fq_recip(3); for (i = 0; i < p; ++i) f[i] = 0; f[0] = 1; f[p - 1] = f[p] = -1; for (i = 0; i < p; ++i) g[p - 1 - i] = in[i]; g[p] = 0; delta = 1; for (loop = 0; loop < 2 * p - 1; ++loop) { for (i = p; i > 0; --i) v[i] = v[i - 1]; v[0] = 0; swap = int16_negative_mask(-delta) & int16_nonzero_mask(g[0]); delta ^= swap & (delta ^ -delta); delta += 1; for (i = 0; i < p + 1; ++i) { t = swap & (f[i] ^ g[i]); f[i] ^= t; g[i] ^= t; t = swap & (v[i] ^ r[i]); v[i] ^= t; r[i] ^= t; } f0 = f[0]; g0 = g[0]; for (i = 0; i < p + 1; ++i) g[i] = Fq_freeze(f0 * g[i] - g0 * f[i]); for (i = 0; i < p + 1; ++i) r[i] = Fq_freeze(f0 * r[i] - g0 * v[i]); for (i = 0; i < p; ++i) g[i] = g[i + 1]; g[p] = 0; } scale = Fq_recip(f[0]); for (i = 0; i < p; ++i) out[i] = Fq_freeze(scale * (int32) v[p - 1 - i]); return int16_nonzero_mask(delta); } #endif /* ----- rounded polynomials mod q */ static void Round(Fq *out, const Fq *a) { int i; for (i = 0; i < p; ++i) out[i] = a[i] - F3_freeze(a[i]); } /* ----- sorting to generate short polynomial */ static void Short_fromlist(small *out, const uint32 *in) { uint32 L[p]; int i; for (i = 0; i < w; ++i) L[i] = in[i] & (uint32) -2; for (i = w; i < p; ++i) L[i] = (in[i] & (uint32) -3) | 1; crypto_sort_uint32(L, p); for (i = 0; i < p; ++i) out[i] = (L[i] & 3) - 1; } /* ----- underlying hash function */ #define Hash_bytes 32 /* e.g., b = 0 means out = Hash0(in) */ static void Hash_prefix(unsigned char *out, int b, const unsigned char *in, int inlen) { unsigned char x[inlen + 1]; unsigned char h[64]; int i; x[0] = b; for (i = 0; i < inlen; ++i) x[i + 1] = in[i]; crypto_hash_sha512(h, x, inlen + 1); for (i = 0; i < 32; ++i) out[i] = h[i]; } /* ----- higher-level randomness */ static uint32 urandom32(void) { unsigned char c[4]; uint32 out[4]; randombytes(c, 4); out[0] = (uint32) c[0]; out[1] = ((uint32) c[1]) << 8; out[2] = ((uint32) c[2]) << 16; out[3] = ((uint32) c[3]) << 24; return out[0] + out[1] + out[2] + out[3]; } static void Short_random(small *out) { uint32 L[p]; int i; for (i = 0; i < p; ++i) L[i] = urandom32(); Short_fromlist(out, L); } #ifndef LPR static void Small_random(small *out) { int i; for (i = 0; i < p; ++i) out[i] = (((urandom32() & 0x3fffffff) * 3) >> 30) - 1; } #endif /* ----- Streamlined NTRU Prime Core */ #ifndef LPR /* h,(f,ginv) = KeyGen() */ static void KeyGen(Fq *h, small *f, small *ginv) { small g[p]; Fq finv[p]; for (;;) { int result; Small_random(g); result = R3_recip(ginv, g); crypto_declassify(&result, sizeof result); if (result == 0) break; } Short_random(f); Rq_recip3(finv, f); /* always works */ Rq_mult_small(h, finv, g); } /* c = Encrypt(r,h) */ static void Encrypt(Fq *c, const small *r, const Fq *h) { Fq hr[p]; Rq_mult_small(hr, h, r); Round(c, hr); } /* r = Decrypt(c,(f,ginv)) */ static void Decrypt(small *r, const Fq *c, const small *f, const small *ginv) { Fq cf[p]; Fq cf3[p]; small e[p]; small ev[p]; int mask; int i; Rq_mult_small(cf, c, f); Rq_mult3(cf3, cf); R3_fromRq(e, cf3); R3_mult(ev, e, ginv); mask = Weightw_mask(ev); /* 0 if weight w, else -1 */ for (i = 0; i < w; ++i) r[i] = ((ev[i] ^ 1) & ~mask) ^ 1; for (i = w; i < p; ++i) r[i] = ev[i] & ~mask; } #endif /* ----- NTRU LPRime Core */ #ifdef LPR /* (G,A),a = KeyGen(G); leaves G unchanged */ static void KeyGen(Fq *A, small *a, const Fq *G) { Fq aG[p]; Short_random(a); Rq_mult_small(aG, G, a); Round(A, aG); } /* B,T = Encrypt(r,(G,A),b) */ static void Encrypt(Fq *B, int8 *T, const int8 *r, const Fq *G, const Fq *A, const small *b) { Fq bG[p]; Fq bA[p]; int i; Rq_mult_small(bG, G, b); Round(B, bG); Rq_mult_small(bA, A, b); for (i = 0; i < I; ++i) T[i] = Top(Fq_freeze(bA[i] + r[i] * q12)); } /* r = Decrypt((B,T),a) */ static void Decrypt(int8 *r, const Fq *B, const int8 *T, const small *a) { Fq aB[p]; int i; Rq_mult_small(aB, B, a); for (i = 0; i < I; ++i) r[i] = -int16_negative_mask(Fq_freeze(Right(T[i]) - aB[i] + 4 * w + 1)); } #endif /* ----- encoding I-bit inputs */ #ifdef LPR #define Inputs_bytes (I / 8) typedef int8 Inputs[I]; /* passed by reference */ static void Inputs_encode(unsigned char *s, const Inputs r) { int i; for (i = 0; i < Inputs_bytes; ++i) s[i] = 0; for (i = 0; i < I; ++i) s[i >> 3] |= r[i] << (i & 7); } #endif /* ----- Expand */ #ifdef LPR static const unsigned char aes_nonce[16] = {0}; static void Expand(uint32 *L, const unsigned char *k) { int i; crypto_stream_aes256ctr((unsigned char *) L, 4 * p, aes_nonce, k); for (i = 0; i < p; ++i) { uint32 L0 = ((unsigned char *) L)[4 * i]; uint32 L1 = ((unsigned char *) L)[4 * i + 1]; uint32 L2 = ((unsigned char *) L)[4 * i + 2]; uint32 L3 = ((unsigned char *) L)[4 * i + 3]; L[i] = L0 + (L1 << 8) + (L2 << 16) + (L3 << 24); } } #endif /* ----- Seeds */ #ifdef LPR #define Seeds_bytes 32 static void Seeds_random(unsigned char *s) { randombytes(s, Seeds_bytes); } #endif /* ----- Generator, HashShort */ #ifdef LPR /* G = Generator(k) */ static void Generator(Fq *G, const unsigned char *k) { uint32 L[p]; int i; Expand(L, k); for (i = 0; i < p; ++i) G[i] = uint32_mod_uint14(L[i], q) - q12; } /* out = HashShort(r) */ static void HashShort(small *out, const Inputs r) { unsigned char s[Inputs_bytes]; unsigned char h[Hash_bytes]; uint32 L[p]; Inputs_encode(s, r); Hash_prefix(h, 5, s, sizeof s); Expand(L, h); Short_fromlist(out, L); } #endif /* ----- NTRU LPRime Expand */ #ifdef LPR /* (S,A),a = XKeyGen() */ static void XKeyGen(unsigned char *S, Fq *A, small *a) { Fq G[p]; Seeds_random(S); Generator(G, S); KeyGen(A, a, G); } /* B,T = XEncrypt(r,(S,A)) */ static void XEncrypt(Fq *B, int8 *T, const int8 *r, const unsigned char *S, const Fq *A) { Fq G[p]; small b[p]; Generator(G, S); HashShort(b, r); Encrypt(B, T, r, G, A, b); } #define XDecrypt Decrypt #endif /* ----- encoding small polynomials (including short polynomials) */ #define Small_bytes ((p + 3) / 4) /* these are the only functions that rely on p mod 4 = 1 */ static void Small_encode(unsigned char *s, const small *f) { small x; int i; for (i = 0; i < p / 4; ++i) { x = *f++ + 1; x += (*f++ + 1) << 2; x += (*f++ + 1) << 4; x += (*f++ + 1) << 6; *s++ = x; } x = *f++ + 1; *s++ = x; } static void Small_decode(small *f, const unsigned char *s) { unsigned char x; int i; for (i = 0; i < p / 4; ++i) { x = *s++; *f++ = ((small) (x & 3)) - 1; x >>= 2; *f++ = ((small) (x & 3)) - 1; x >>= 2; *f++ = ((small) (x & 3)) - 1; x >>= 2; *f++ = ((small) (x & 3)) - 1; } x = *s++; *f++ = ((small) (x & 3)) - 1; } /* ----- encoding general polynomials */ #ifndef LPR static void Rq_encode(unsigned char *s, const Fq *r) { uint16 R[p], M[p]; int i; for (i = 0; i < p; ++i) R[i] = r[i] + q12; for (i = 0; i < p; ++i) M[i] = q; Encode(s, R, M, p); } static void Rq_decode(Fq *r, const unsigned char *s) { uint16 R[p], M[p]; int i; for (i = 0; i < p; ++i) M[i] = q; Decode(R, s, M, p); for (i = 0; i < p; ++i) r[i] = ((Fq) R[i]) - q12; } #endif /* ----- encoding rounded polynomials */ static void Rounded_encode(unsigned char *s, const Fq *r) { uint16 R[p], M[p]; int i; for (i = 0; i < p; ++i) R[i] = ((r[i] + q12) * 10923) >> 15; for (i = 0; i < p; ++i) M[i] = (q + 2) / 3; Encode(s, R, M, p); } static void Rounded_decode(Fq *r, const unsigned char *s) { uint16 R[p], M[p]; int i; for (i = 0; i < p; ++i) M[i] = (q + 2) / 3; Decode(R, s, M, p); for (i = 0; i < p; ++i) r[i] = R[i] * 3 - q12; } /* ----- encoding top polynomials */ #ifdef LPR #define Top_bytes (I / 2) static void Top_encode(unsigned char *s, const int8 *T) { int i; for (i = 0; i < Top_bytes; ++i) s[i] = T[2 * i] + (T[2 * i + 1] << 4); } static void Top_decode(int8 *T, const unsigned char *s) { int i; for (i = 0; i < Top_bytes; ++i) { T[2 * i] = s[i] & 15; T[2 * i + 1] = s[i] >> 4; } } #endif /* ----- Streamlined NTRU Prime Core plus encoding */ #ifndef LPR typedef small Inputs[p]; /* passed by reference */ #define Inputs_random Short_random #define Inputs_encode Small_encode #define Inputs_bytes Small_bytes #define Ciphertexts_bytes Rounded_bytes #define SecretKeys_bytes (2 * Small_bytes) #define PublicKeys_bytes Rq_bytes /* pk,sk = ZKeyGen() */ static void ZKeyGen(unsigned char *pk, unsigned char *sk) { Fq h[p]; small f[p], v[p]; KeyGen(h, f, v); Rq_encode(pk, h); Small_encode(sk, f); sk += Small_bytes; Small_encode(sk, v); } /* C = ZEncrypt(r,pk) */ static void ZEncrypt(unsigned char *C, const Inputs r, const unsigned char *pk) { Fq h[p]; Fq c[p]; Rq_decode(h, pk); Encrypt(c, r, h); Rounded_encode(C, c); } /* r = ZDecrypt(C,sk) */ static void ZDecrypt(Inputs r, const unsigned char *C, const unsigned char *sk) { small f[p], v[p]; Fq c[p]; Small_decode(f, sk); sk += Small_bytes; Small_decode(v, sk); Rounded_decode(c, C); Decrypt(r, c, f, v); } #endif /* ----- NTRU LPRime Expand plus encoding */ #ifdef LPR #define Ciphertexts_bytes (Rounded_bytes + Top_bytes) #define SecretKeys_bytes Small_bytes #define PublicKeys_bytes (Seeds_bytes + Rounded_bytes) static void Inputs_random(Inputs r) { unsigned char s[Inputs_bytes]; int i; randombytes(s, sizeof s); for (i = 0; i < I; ++i) r[i] = 1 & (s[i >> 3] >> (i & 7)); } /* pk,sk = ZKeyGen() */ static void ZKeyGen(unsigned char *pk, unsigned char *sk) { Fq A[p]; small a[p]; XKeyGen(pk, A, a); pk += Seeds_bytes; Rounded_encode(pk, A); Small_encode(sk, a); } /* c = ZEncrypt(r,pk) */ static void ZEncrypt(unsigned char *c, const Inputs r, const unsigned char *pk) { Fq A[p]; Fq B[p]; int8 T[I]; Rounded_decode(A, pk + Seeds_bytes); XEncrypt(B, T, r, pk, A); Rounded_encode(c, B); c += Rounded_bytes; Top_encode(c, T); } /* r = ZDecrypt(C,sk) */ static void ZDecrypt(Inputs r, const unsigned char *c, const unsigned char *sk) { small a[p]; Fq B[p]; int8 T[I]; Small_decode(a, sk); Rounded_decode(B, c); Top_decode(T, c + Rounded_bytes); XDecrypt(r, B, T, a); } #endif /* ----- confirmation hash */ #define Confirm_bytes 32 /* h = HashConfirm(r,pk,cache); cache is Hash4(pk) */ static void HashConfirm(unsigned char *h, const unsigned char *r, const unsigned char *pk, const unsigned char *cache) { (void) pk; #ifndef LPR unsigned char x[Hash_bytes * 2]; int i; Hash_prefix(x, 3, r, Inputs_bytes); for (i = 0; i < Hash_bytes; ++i) x[Hash_bytes + i] = cache[i]; #else unsigned char x[Inputs_bytes + Hash_bytes]; int i; for (i = 0; i < Inputs_bytes; ++i) x[i] = r[i]; for (i = 0; i < Hash_bytes; ++i) x[Inputs_bytes + i] = cache[i]; #endif Hash_prefix(h, 2, x, sizeof x); } /* ----- session-key hash */ /* k = HashSession(b,y,z) */ static void HashSession(unsigned char *k, int b, const unsigned char *y, const unsigned char *z) { #ifndef LPR unsigned char x[Hash_bytes + Ciphertexts_bytes + Confirm_bytes]; int i; Hash_prefix(x, 3, y, Inputs_bytes); for (i = 0; i < Ciphertexts_bytes + Confirm_bytes; ++i) x[Hash_bytes + i] = z[i]; #else unsigned char x[Inputs_bytes + Ciphertexts_bytes + Confirm_bytes]; int i; for (i = 0; i < Inputs_bytes; ++i) x[i] = y[i]; for (i = 0; i < Ciphertexts_bytes + Confirm_bytes; ++i) x[Inputs_bytes + i] = z[i]; #endif Hash_prefix(k, b, x, sizeof x); } /* ----- Streamlined NTRU Prime and NTRU LPRime */ /* pk,sk = KEM_KeyGen() */ static void KEM_KeyGen(unsigned char *pk, unsigned char *sk) { int i; ZKeyGen(pk, sk); sk += SecretKeys_bytes; for (i = 0; i < PublicKeys_bytes; ++i) *sk++ = pk[i]; randombytes(sk, Inputs_bytes); sk += Inputs_bytes; Hash_prefix(sk, 4, pk, PublicKeys_bytes); } /* c,r_enc = Hide(r,pk,cache); cache is Hash4(pk) */ static void Hide(unsigned char *c, unsigned char *r_enc, const Inputs r, const unsigned char *pk, const unsigned char *cache) { Inputs_encode(r_enc, r); ZEncrypt(c, r, pk); c += Ciphertexts_bytes; HashConfirm(c, r_enc, pk, cache); } /* c,k = Encap(pk) */ static void Encap(unsigned char *c, unsigned char *k, const unsigned char *pk) { Inputs r; unsigned char r_enc[Inputs_bytes]; unsigned char cache[Hash_bytes]; Hash_prefix(cache, 4, pk, PublicKeys_bytes); Inputs_random(r); Hide(c, r_enc, r, pk, cache); HashSession(k, 1, r_enc, c); } /* 0 if matching ciphertext+confirm, else -1 */ static int Ciphertexts_diff_mask(const unsigned char *c, const unsigned char *c2) { uint16 differentbits = 0; int len = Ciphertexts_bytes + Confirm_bytes; while (len-- > 0) differentbits |= (*c++) ^ (*c2++); return crypto_int16_nonzero_mask(differentbits); } /* k = Decap(c,sk) */ static void Decap(unsigned char *k, const unsigned char *c, const unsigned char *sk) { const unsigned char *pk = sk + SecretKeys_bytes; const unsigned char *rho = pk + PublicKeys_bytes; const unsigned char *cache = rho + Inputs_bytes; Inputs r; unsigned char r_enc[Inputs_bytes]; unsigned char cnew[Ciphertexts_bytes + Confirm_bytes]; int mask; int i; ZDecrypt(r, c, sk); Hide(cnew, r_enc, r, pk, cache); mask = Ciphertexts_diff_mask(c, cnew); for (i = 0; i < Inputs_bytes; ++i) r_enc[i] ^= mask & (r_enc[i] ^ rho[i]); HashSession(k, 1 + mask, r_enc, c); } /* ----- crypto_kem_sntrup761_tinyssh API */ int crypto_kem_sntrup761_tinyssh_keypair(unsigned char *pk, unsigned char *sk) { KEM_KeyGen(pk, sk); return 0; } int crypto_kem_sntrup761_tinyssh_enc(unsigned char *c, unsigned char *k, const unsigned char *pk) { Encap(c, k, pk); return 0; } int crypto_kem_sntrup761_tinyssh_dec(unsigned char *k, const unsigned char *c, const unsigned char *sk) { Decap(k, c, sk); return 0; } #if 0 Script used to merge into single the file: #!/ bin / sh rm crypto_kem_sntrup761.c || : ( cd "$1" echo '/*' echo 'Original code: supercop-20210125/crypto_kem/sntrup761/ref' echo 'Modifications (Jan Mojzis):' echo '- source code merged into single file' echo '- crypto_kem renamed to crypto_kem_sntrup761_tinyssh' echo '*/' echo echo '/* See https://ntruprime.cr.yp.to/software.html for detailed documentation. */' echo echo '#include ' echo '#include "crypto_uint64.h"' echo '#include "crypto_uint32.h"' echo '#include "crypto_uint16.h"' echo '#include "crypto_int32.h"' echo '#include "crypto_int16.h"' echo '#include "crypto_int8.h"' echo '#include "randombytes.h"' echo '#include "crypto_verify_32.h"' echo '#include "crypto_sort_uint32.h"' echo '#include "crypto_hash_sha512.h"' echo '#include "crypto_kem_sntrup761.h"' echo '' echo '#define uint64 crypto_uint64' echo '#define uint32 crypto_uint32' echo '#define uint16 crypto_uint16' echo '#define int32 crypto_int32' echo '#define int16 crypto_int16' echo '#define int8 crypto_int8' echo ( for f in uint32.c int32.c paramsmenu.h params.h Decode.c Encode.c; do echo "/* ${f} */" cat "${f}" | sed 's/^void /static void /' | sed 's/^int16 /static int16 /' echo done | grep -v '#include' ) ( echo '/* kem.c */' cat kem.c echo ) | grep -v '#include' | sed 's/crypto_kem/crypto_kem_sntrup761_tinyssh/g' echo echo '#if 0' echo 'Script used to merge into single the file:' echo cat $0 echo echo '#endif' ) > crypto_kem_sntrup761.c.tmp mv -f crypto_kem_sntrup761.c.tmp crypto_kem_sntrup761.c #endif #endif tinyssh-20250501/crypto_kem_sntrup761x25519.c000066400000000000000000000041231500472222400204400ustar00rootroot00000000000000/* 20210314 20241211 - reformated using clang-format 20241215 - scalarmult_curve25519 -> dh_x25519 Jan Mojzis Public domain. */ #include "cleanup.h" #include "crypto_hash_sha512.h" #include "crypto_dh_x25519.h" #include "crypto_kem_sntrup761.h" #include "crypto_kem_sntrup761x25519.h" int crypto_kem_sntrup761x25519_tinyssh_enc(unsigned char *c, unsigned char *k, const unsigned char *pk) { unsigned char onetimesk[crypto_dh_x25519_SECRETKEYBYTES]; unsigned char buf[crypto_kem_sntrup761_BYTES + crypto_dh_x25519_BYTES]; /* sntrup761 */ crypto_kem_sntrup761_enc(c, buf, pk); pk += crypto_kem_sntrup761_PUBLICKEYBYTES; c += crypto_kem_sntrup761_CIPHERTEXTBYTES; /* x25519 */ crypto_dh_x25519_keypair(/*onetimepk*/ c, onetimesk); crypto_dh_x25519(buf + crypto_kem_sntrup761_BYTES, pk, onetimesk); /* hash together sntrup459176 KEM-key and x25519 shared secret */ crypto_hash_sha512(k, buf, sizeof buf); /* cleanup */ cleanup(buf); cleanup(onetimesk); return 0; } int crypto_kem_sntrup761x25519_tinyssh_dec(unsigned char *k, const unsigned char *c, const unsigned char *sk) { unsigned char buf[crypto_kem_sntrup761_BYTES + crypto_dh_x25519_BYTES]; /* sntrup761 */ crypto_kem_sntrup761_dec(buf, c, sk); sk += crypto_kem_sntrup761_SECRETKEYBYTES; c += crypto_kem_sntrup761_CIPHERTEXTBYTES; /* x25519 */ crypto_dh_x25519(buf + crypto_kem_sntrup761_BYTES, c, sk); /* hash together sntrup459176 KEM-key and x25519 shared secret */ crypto_hash_sha512(k, buf, sizeof buf); /* cleanup */ cleanup(buf); return 0; } int crypto_kem_sntrup761x25519_tinyssh_keypair(unsigned char *pk, unsigned char *sk) { /* sntrup761 */ crypto_kem_sntrup761_keypair(pk, sk); /* x25519 */ crypto_dh_x25519_keypair(pk + crypto_kem_sntrup761_PUBLICKEYBYTES, sk + crypto_kem_sntrup761_SECRETKEYBYTES); return 0; } tinyssh-20250501/crypto_kem_sntrup761x25519.h000066400000000000000000000034261500472222400204520ustar00rootroot00000000000000#ifndef crypto_kem_sntrup761x25519_H #define crypto_kem_sntrup761x25519_H #define crypto_kem_sntrup761x25519_tinyssh_SECRETKEYBYTES 1795 #define crypto_kem_sntrup761x25519_tinyssh_PUBLICKEYBYTES 1190 #define crypto_kem_sntrup761x25519_tinyssh_CIPHERTEXTBYTES 1071 #define crypto_kem_sntrup761x25519_tinyssh_BYTES 64 extern int crypto_kem_sntrup761x25519_tinyssh_keypair(unsigned char *, unsigned char *); extern int crypto_kem_sntrup761x25519_tinyssh_enc(unsigned char *, unsigned char *, const unsigned char *); extern int crypto_kem_sntrup761x25519_tinyssh_dec(unsigned char *, const unsigned char *, const unsigned char *); #define crypto_kem_sntrup761x25519_keypair \ crypto_kem_sntrup761x25519_tinyssh_keypair #define crypto_kem_sntrup761x25519_enc crypto_kem_sntrup761x25519_tinyssh_enc #define crypto_kem_sntrup761x25519_dec crypto_kem_sntrup761x25519_tinyssh_dec #define crypto_kem_sntrup761x25519_SECRETKEYBYTES \ crypto_kem_sntrup761x25519_tinyssh_SECRETKEYBYTES #define crypto_kem_sntrup761x25519_PUBLICKEYBYTES \ crypto_kem_sntrup761x25519_tinyssh_PUBLICKEYBYTES #define crypto_kem_sntrup761x25519_CIPHERTEXTBYTES \ crypto_kem_sntrup761x25519_tinyssh_CIPHERTEXTBYTES #define crypto_kem_sntrup761x25519_BYTES \ crypto_kem_sntrup761x25519_tinyssh_BYTES #define crypto_kem_sntrup761x25519_IMPLEMENTATION "tinyssh" #define crypto_kem_sntrup761x25519_VERSION "-" #endif tinyssh-20250501/crypto_onetimeauth_poly1305.h000066400000000000000000000052161500472222400211240ustar00rootroot00000000000000#ifndef crypto_onetimeauth_poly1305_H #define crypto_onetimeauth_poly1305_H #include "haslib1305.h" #ifndef HASLIB1305 #define crypto_onetimeauth_poly1305_tinyssh_BYTES 16 #define crypto_onetimeauth_poly1305_tinyssh_KEYBYTES 32 extern int crypto_onetimeauth_poly1305_tinyssh(unsigned char *, const unsigned char *, unsigned long long, const unsigned char *); extern int crypto_onetimeauth_poly1305_tinyssh_verify(const unsigned char *, const unsigned char *, unsigned long long, const unsigned char *); #define crypto_onetimeauth_poly1305 crypto_onetimeauth_poly1305_tinyssh #define crypto_onetimeauth_poly1305_verify \ crypto_onetimeauth_poly1305_tinyssh_verify #define crypto_onetimeauth_poly1305_BYTES \ crypto_onetimeauth_poly1305_tinyssh_BYTES #define crypto_onetimeauth_poly1305_KEYBYTES \ crypto_onetimeauth_poly1305_tinyssh_KEYBYTES #define crypto_onetimeauth_poly1305_IMPLEMENTATION "tinyssh" #define crypto_onetimeauth_poly1305_VERSION "-" #else #include #define crypto_onetimeauth_poly1305_lib1305_BYTES poly1305_BYTES #define crypto_onetimeauth_poly1305_lib1305_KEYBYTES poly1305_KEYBYTES extern int crypto_onetimeauth_poly1305_lib1305(unsigned char *, const unsigned char *, unsigned long long, const unsigned char *); extern int crypto_onetimeauth_poly1305_lib1305_verify(const unsigned char *, const unsigned char *, unsigned long long, const unsigned char *); #define crypto_onetimeauth_poly1305 crypto_onetimeauth_poly1305_lib1305 #define crypto_onetimeauth_poly1305_verify \ crypto_onetimeauth_poly1305_lib1305_verify #define crypto_onetimeauth_poly1305_BYTES \ crypto_onetimeauth_poly1305_lib1305_BYTES #define crypto_onetimeauth_poly1305_KEYBYTES \ crypto_onetimeauth_poly1305_lib1305_KEYBYTES #define crypto_onetimeauth_poly1305_IMPLEMENTATION "lib1305" #define crypto_onetimeauth_poly1305_VERSION "-" #endif #endif tinyssh-20250501/crypto_onetimeauth_poly1305_lib1305.c000066400000000000000000000014071500472222400222540ustar00rootroot00000000000000#include "haslib1305.h" #ifdef HASLIB1305 #include #include "crypto_onetimeauth_poly1305.h" int crypto_onetimeauth_poly1305_lib1305(unsigned char *a, const unsigned char *m, unsigned long long n, const unsigned char *k) { poly1305(a, m, (unsigned long long) n, k); return 0; } int crypto_onetimeauth_poly1305_lib1305_verify(const unsigned char *a, const unsigned char *m, unsigned long long n, const unsigned char *k) { return poly1305_verify(a, m, (unsigned long long) n, k); } #endif tinyssh-20250501/crypto_onetimeauth_poly1305_tinyssh.c000066400000000000000000000131261500472222400226770ustar00rootroot00000000000000/* 20250126 */ /* Based on poly1305-donna (https://github.com/floodyberry/poly1305-donna) - modified for NaCl API - switched to cryptoint */ #include "crypto_onetimeauth_poly1305.h" #include "haslib1305.h" #ifndef HASLIB1305 #include "crypto_int16.h" #include "crypto_uint32.h" #include "crypto_uint64.h" /* clang-format off */ int crypto_onetimeauth_poly1305_tinyssh(unsigned char *o, const unsigned char *m, unsigned long long n, const unsigned char *k) { crypto_uint32 h0, h1, h2, h3, h4; crypto_uint32 r0, r1, r2, r3, r4; crypto_uint32 s1, s2, s3, s4; crypto_uint64 d0, d1, d2, d3, d4; crypto_uint32 c, mask; crypto_uint64 f; crypto_uint64 i; /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ r0 = (crypto_uint32_load(k + 0) ) & 0x3ffffff; r1 = (crypto_uint32_load(k + 3) >> 2) & 0x3ffff03; r2 = (crypto_uint32_load(k + 6) >> 4) & 0x3ffc0ff; r3 = (crypto_uint32_load(k + 9) >> 6) & 0x3f03fff; r4 = (crypto_uint32_load(k + 12) >> 8) & 0x00fffff; s1 = r1 * 5; s2 = r2 * 5; s3 = r3 * 5; s4 = r4 * 5; /* h = 0 */ h0 = h1 = h2 = h3 = h4 = 0; while (n > 0) { /* h += m[i] */ if (n >= 16) { h0 += (crypto_uint32_load(m ) ) & 0x3ffffff; h1 += (crypto_uint32_load(m + 3) >> 2) & 0x3ffffff; h2 += (crypto_uint32_load(m + 6) >> 4) & 0x3ffffff; h3 += (crypto_uint32_load(m + 9) >> 6) & 0x3ffffff; h4 += (crypto_uint32_load(m + 12) >> 8) | 16777216; m += 16; n -= 16; } else { unsigned char mm[16]; for (i = 0; i < 16; ++i) mm[i] = 0; for (i = 0; i < n; ++i) mm[i] = m[i]; mm[i] = 1; h0 += (crypto_uint32_load(mm ) ) & 0x3ffffff; h1 += (crypto_uint32_load(mm + 3) >> 2) & 0x3ffffff; h2 += (crypto_uint32_load(mm + 6) >> 4) & 0x3ffffff; h3 += (crypto_uint32_load(mm + 9) >> 6) & 0x3ffffff; h4 += (crypto_uint32_load(mm + 12) >> 8); n = 0; } /* h *= r */ d0 = ((crypto_uint64)h0 * r0) + ((crypto_uint64)h1 * s4) + ((crypto_uint64)h2 * s3) + ((crypto_uint64)h3 * s2) + ((crypto_uint64)h4 * s1); d1 = ((crypto_uint64)h0 * r1) + ((crypto_uint64)h1 * r0) + ((crypto_uint64)h2 * s4) + ((crypto_uint64)h3 * s3) + ((crypto_uint64)h4 * s2); d2 = ((crypto_uint64)h0 * r2) + ((crypto_uint64)h1 * r1) + ((crypto_uint64)h2 * r0) + ((crypto_uint64)h3 * s4) + ((crypto_uint64)h4 * s3); d3 = ((crypto_uint64)h0 * r3) + ((crypto_uint64)h1 * r2) + ((crypto_uint64)h2 * r1) + ((crypto_uint64)h3 * r0) + ((crypto_uint64)h4 * s4); d4 = ((crypto_uint64)h0 * r4) + ((crypto_uint64)h1 * r3) + ((crypto_uint64)h2 * r2) + ((crypto_uint64)h3 * r1) + ((crypto_uint64)h4 * r0); /* (partial) h %= p */ c = (crypto_uint32)(d0 >> 26); h0 = (crypto_uint32)d0 & 0x3ffffff; d1 += c; c = (crypto_uint32)(d1 >> 26); h1 = (crypto_uint32)d1 & 0x3ffffff; d2 += c; c = (crypto_uint32)(d2 >> 26); h2 = (crypto_uint32)d2 & 0x3ffffff; d3 += c; c = (crypto_uint32)(d3 >> 26); h3 = (crypto_uint32)d3 & 0x3ffffff; d4 += c; c = (crypto_uint32)(d4 >> 26); h4 = (crypto_uint32)d4 & 0x3ffffff; h0 += c * 5; c = (h0 >> 26); h0 = h0 & 0x3ffffff; h1 += c; } /* fully carry h */ c = h1 >> 26; h1 = h1 & 0x3ffffff; h2 += c; c = h2 >> 26; h2 = h2 & 0x3ffffff; h3 += c; c = h3 >> 26; h3 = h3 & 0x3ffffff; h4 += c; c = h4 >> 26; h4 = h4 & 0x3ffffff; h0 += c * 5; c = h0 >> 26; h0 = h0 & 0x3ffffff; h1 += c; /* compute h + -p */ r0 = h0 + 5; c = r0 >> 26; r0 &= 0x3ffffff; r1 = h1 + c; c = r1 >> 26; r1 &= 0x3ffffff; r2 = h2 + c; c = r2 >> 26; r2 &= 0x3ffffff; r3 = h3 + c; c = r3 >> 26; r3 &= 0x3ffffff; r4 = h4 + c - (1 << 26); /* select h if h < p, or h + -p if h >= p */ mask = crypto_uint32_topbit_01(r4); mask -= 1; r0 ^= h0; r1 ^= h1; r2 ^= h2; r3 ^= h3; r4 ^= h4; h0 ^= mask & r0; h1 ^= mask & r1; h2 ^= mask & r2; h3 ^= mask & r3; h4 ^= mask & r4; /* h = h % (2^128) */ h0 = ((h0 ) | (h1 << 26)) & 0xffffffff; h1 = ((h1 >> 6) | (h2 << 20)) & 0xffffffff; h2 = ((h2 >> 12) | (h3 << 14)) & 0xffffffff; h3 = ((h3 >> 18) | (h4 << 8)) & 0xffffffff; /* mac = (h + pad) % (2^128) */ f = (crypto_uint64)h0 + crypto_uint32_load(k + 16) ; h0 = (crypto_uint32)f; f = (crypto_uint64)h1 + crypto_uint32_load(k + 20) + (f >> 32); h1 = (crypto_uint32)f; f = (crypto_uint64)h2 + crypto_uint32_load(k + 24) + (f >> 32); h2 = (crypto_uint32)f; f = (crypto_uint64)h3 + crypto_uint32_load(k + 28) + (f >> 32); h3 = (crypto_uint32)f; crypto_uint32_store(o + 0, h0); crypto_uint32_store(o + 4, h1); crypto_uint32_store(o + 8, h2); crypto_uint32_store(o + 12, h3); return 0; } int crypto_onetimeauth_poly1305_tinyssh_verify(const unsigned char *h, const unsigned char *in, unsigned long long l, const unsigned char *k) { unsigned char correct[16]; crypto_int16 d = 0; long long i; crypto_onetimeauth_poly1305(correct, in, l, k); for (i = 0; i < 16; ++i) d |= correct[i] ^ h[i]; return crypto_int16_nonzero_mask(d); } /* clang-format on */ #endif tinyssh-20250501/crypto_scalarmult_curve25519.c000066400000000000000000000037041500472222400212020ustar00rootroot00000000000000#include "cleanup.h" #include "fe25519.h" #include "crypto_uint8.h" #include "crypto_scalarmult_curve25519.h" int crypto_scalarmult_curve25519_tinyssh(unsigned char *q, const unsigned char *n, const unsigned char *p) { unsigned char e[32]; fe x1, x2, z2, x3, z3, tmp0, tmp1; long long i; int pos; crypto_uint32 swap, b; for (i = 0; i < 32; ++i) e[i] = n[i]; e[0] &= 248; e[31] &= 127; e[31] |= 64; fe25519_frombytes(x1, p); fe_1(x2); fe_0(z2); fe_copy(x3, x1); fe_1(z3); swap = 0; for (pos = 254; pos >= 0; --pos) { b = crypto_uint8_bitmod_01(e[pos / 8], pos); swap ^= b; fe_cswap(x2, x3, swap); fe_cswap(z2, z3, swap); swap = b; fe25519_sub(tmp0, x3, z3); fe25519_sub(tmp1, x2, z2); fe25519_add(x2, x2, z2); fe25519_add(z2, x3, z3); fe25519_mul(z3, tmp0, x2); fe25519_mul(z2, z2, tmp1); fe25519_sq(tmp0, tmp1); fe25519_sq(tmp1, x2); fe25519_add(x3, z3, z2); fe25519_sub(z2, z3, z2); fe25519_mul(x2, tmp1, tmp0); fe25519_sub(tmp1, tmp1, tmp0); fe25519_sq(z2, z2); fe25519_mul121666(z3, tmp1); fe25519_sq(x3, x3); fe25519_add(tmp0, tmp0, z3); fe25519_mul(z3, x1, z2); fe25519_mul(z2, tmp1, tmp0); } fe_cswap(x2, x3, swap); fe_cswap(z2, z3, swap); fe25519_inv(z2, z2); fe25519_mul(x2, x2, z2); fe25519_tobytes(q, x2); cleanup(e); cleanup(tmp0); cleanup(tmp1); cleanup(x1); cleanup(x2); cleanup(x3); cleanup(z2); cleanup(z3); return 0; } static const unsigned char basepoint[32] = {9}; int crypto_scalarmult_curve25519_tinyssh_base(unsigned char *q, const unsigned char *n) { return crypto_scalarmult_curve25519_tinyssh(q, n, basepoint); } tinyssh-20250501/crypto_scalarmult_curve25519.h000066400000000000000000000021531500472222400212040ustar00rootroot00000000000000#ifndef crypto_scalarmult_curve25519_H #define crypto_scalarmult_curve25519_H #define crypto_scalarmult_curve25519_tinyssh_BYTES 32 #define crypto_scalarmult_curve25519_tinyssh_SCALARBYTES 32 extern int crypto_scalarmult_curve25519_tinyssh(unsigned char *, const unsigned char *, const unsigned char *); extern int crypto_scalarmult_curve25519_tinyssh_base(unsigned char *, const unsigned char *); #define crypto_scalarmult_curve25519 crypto_scalarmult_curve25519_tinyssh #define crypto_scalarmult_curve25519_base \ crypto_scalarmult_curve25519_tinyssh_base #define crypto_scalarmult_curve25519_BYTES \ crypto_scalarmult_curve25519_tinyssh_BYTES #define crypto_scalarmult_curve25519_SCALARBYTES \ crypto_scalarmult_curve25519_tinyssh_SCALARBYTES #define crypto_scalarmult_curve25519_IMPLEMENTATION "tinyssh" #define crypto_scalarmult_curve25519_VERSION "-" #endif tinyssh-20250501/crypto_sign_ed25519.h000066400000000000000000000063571500472222400172530ustar00rootroot00000000000000#ifndef crypto_sign_ed25519_H #define crypto_sign_ed25519_H #include "haslib25519.h" #ifndef HASLIB25519 #define crypto_sign_ed25519_tinyssh_SECRETKEYBYTES 64 #define crypto_sign_ed25519_tinyssh_PUBLICKEYBYTES 32 #define crypto_sign_ed25519_tinyssh_BYTES 64 extern int crypto_sign_ed25519_tinyssh(unsigned char *, unsigned long long *, const unsigned char *, unsigned long long, const unsigned char *); extern int crypto_sign_ed25519_tinyssh_open(unsigned char *, unsigned long long *, const unsigned char *, unsigned long long, const unsigned char *); extern int crypto_sign_ed25519_tinyssh_keypair(unsigned char *, unsigned char *); #define crypto_sign_ed25519 crypto_sign_ed25519_tinyssh #define crypto_sign_ed25519_open crypto_sign_ed25519_tinyssh_open #define crypto_sign_ed25519_keypair crypto_sign_ed25519_tinyssh_keypair #define crypto_sign_ed25519_BYTES crypto_sign_ed25519_tinyssh_BYTES #define crypto_sign_ed25519_PUBLICKEYBYTES \ crypto_sign_ed25519_tinyssh_PUBLICKEYBYTES #define crypto_sign_ed25519_SECRETKEYBYTES \ crypto_sign_ed25519_tinyssh_SECRETKEYBYTES #define crypto_sign_ed25519_IMPLEMENTATION "tinyssh" #define crypto_sign_ed25519_VERSION "-" #else #include #define crypto_sign_ed25519_lib25519_SECRETKEYBYTES \ lib25519_sign_ed25519_SECRETKEYBYTES #define crypto_sign_ed25519_lib25519_PUBLICKEYBYTES \ lib25519_sign_ed25519_PUBLICKEYBYTES #define crypto_sign_ed25519_lib25519_BYTES lib25519_sign_ed25519_BYTES extern int crypto_sign_ed25519_lib25519(unsigned char *, unsigned long long *, const unsigned char *, unsigned long long, const unsigned char *); extern int crypto_sign_ed25519_lib25519_open(unsigned char *, unsigned long long *, const unsigned char *, unsigned long long, const unsigned char *); extern int crypto_sign_ed25519_lib25519_keypair(unsigned char *, unsigned char *); #define crypto_sign_ed25519 crypto_sign_ed25519_lib25519 #define crypto_sign_ed25519_open crypto_sign_ed25519_lib25519_open #define crypto_sign_ed25519_keypair crypto_sign_ed25519_lib25519_keypair #define crypto_sign_ed25519_BYTES crypto_sign_ed25519_lib25519_BYTES #define crypto_sign_ed25519_PUBLICKEYBYTES \ crypto_sign_ed25519_lib25519_PUBLICKEYBYTES #define crypto_sign_ed25519_SECRETKEYBYTES \ crypto_sign_ed25519_lib25519_SECRETKEYBYTES #define crypto_sign_ed25519_IMPLEMENTATION "lib25519" #define crypto_sign_ed25519_VERSION lib25519_version #endif #endif tinyssh-20250501/crypto_sign_ed25519_lib25519.c000066400000000000000000000020611500472222400204660ustar00rootroot00000000000000#include "haslib25519.h" #ifdef HASLIB25519 #include #include "crypto_sign_ed25519.h" int crypto_sign_ed25519_lib25519(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long n, const unsigned char *skorig) { long long llsmlen; lib25519_sign_ed25519(sm, &llsmlen, m, n, skorig); *smlen = (unsigned long long) llsmlen; return 0; } int crypto_sign_ed25519_lib25519_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long n, const unsigned char *pk) { long long llmlen; int ret; ret = lib25519_sign_ed25519_open(m, &llmlen, sm, n, pk); *mlen = (unsigned long long) llmlen; return ret; } int crypto_sign_ed25519_lib25519_keypair(unsigned char *pk, unsigned char *sk) { lib25519_sign_ed25519_keypair(pk, sk); return 0; } #endif tinyssh-20250501/crypto_sign_ed25519_tinyssh.c000066400000000000000000000071111500472222400210140ustar00rootroot00000000000000#include "crypto_sign_ed25519.h" #include "haslib25519.h" #ifndef HASLIB25519 #include "randombytes.h" #include "cleanup.h" #include "crypto_hash_sha512.h" #include "crypto_verify_32.h" #include "ge25519.h" #include "sc25519.h" int crypto_sign_ed25519_tinyssh(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long n, const unsigned char *skorig) { long long i; unsigned char nonce[64], hram[64], sk[96], pk[32]; ge25519 R; /* copy public key*/ for (i = 31; i >= 0; --i) pk[i] = skorig[i + 32]; /* compute secret key from seed sk = H(skorig), H = sha512 */ crypto_hash_sha512(sk, skorig, 32); sk[0] &= 248; sk[31] &= 63; sk[31] |= 64; randombytes(sk + 64, 32); crypto_hash_sha512(sk + 32, sk + 32, 64); /* copy m to sm, copy secret key */ *smlen = n + 64; for (i = n - 1; i >= 0; --i) sm[i + 64] = m[i]; for (i = 31; i >= 0; --i) sm[i + 32] = sk[i + 32]; /* get pseudorandom nonce = H(sk2, m) */ crypto_hash_sha512(nonce, sm + 32, n + 32); sc25519_reduce(nonce); /* copy pk to sm */ for (i = 31; i >= 0; --i) sm[i + 32] = pk[i]; /* compute R */ ge25519_scalarmult_base(R, nonce); ge25519_tobytes(sm, R); /* calculate hram = H(r, a, m) */ crypto_hash_sha512(hram, sm, n + 64); sc25519_reduce(hram); /* compute S */ sc25519_muladd(sm + 32, hram, sk, nonce); /* cleanup */ cleanup(nonce); cleanup(hram); cleanup(sk); cleanup(pk); cleanup(R); return 0; } int crypto_sign_ed25519_tinyssh_open(unsigned char *m, unsigned long long *mlen, const unsigned char *sm, unsigned long long n, const unsigned char *pk) { unsigned long long i; long long j; unsigned char pkcopy[32], rcopy[32], scopy[32], hram[64], rcheck[32]; ge25519 R, S, A; int ret = -1; /* check input */ if (n < 64) goto fail; if (sm[63] & 224) goto fail; /* unpack pk */ if (ge25519_frombytes_negate_vartime(A, pk) != 0) goto fail; /* copy pk, r, s */ for (i = 0; i < 32; ++i) pkcopy[i] = pk[i]; for (i = 0; i < 32; ++i) rcopy[i] = sm[i]; for (i = 0; i < 32; ++i) scopy[i] = sm[i + 32]; /* copy sm to m and copy pk to m */ for (j = n - 1; j >= 0; --j) m[j] = sm[j]; for (i = 0; i < 32; ++i) m[i + 32] = pkcopy[i]; /* calculate hram = H(r, a, m) */ crypto_hash_sha512(hram, m, n); sc25519_reduce(hram); /* compute R */ ge25519_scalarmult(A, A, hram); ge25519_scalarmult_base(S, scopy); ge25519_add(R, S, A); /* check R */ ge25519_tobytes(rcheck, R); if (crypto_verify_32(rcheck, rcopy) != 0) goto fail; /* copy message */ n -= 64; *mlen = n; for (i = 0; i < n; ++i) m[i] = m[i + 64]; for (i = 0; i < 64; ++i) m[i + n] = 0; ret = 0; goto cleanup; fail: for (i = 0; i < n; ++i) m[i] = 0; cleanup: cleanup(pkcopy); cleanup(rcopy); cleanup(scopy); cleanup(hram); cleanup(rcheck); cleanup(R); cleanup(S); cleanup(A); return ret; } int crypto_sign_ed25519_tinyssh_keypair(unsigned char *pk, unsigned char *sk) { unsigned char h[64]; ge25519 A; long long i; randombytes(sk, 32); crypto_hash_sha512(h, sk, 32); h[0] &= 248; h[31] &= 63; h[31] |= 64; ge25519_scalarmult_base(A, h); ge25519_tobytes(pk, A); for (i = 31; i >= 0; --i) sk[i + 32] = pk[i]; cleanup(h); cleanup(A); return 0; } #endif tinyssh-20250501/crypto_sort_uint32.c000066400000000000000000000014641500472222400174150ustar00rootroot00000000000000#include "crypto_uint32.h" #include "crypto_sort_uint32.h" static void minmax(crypto_uint32 *x, crypto_uint32 *y) { crypto_uint32 xi = *x; crypto_uint32 yi = *y; crypto_uint32 xy = xi ^ yi; crypto_uint32 c = yi - xi; c ^= xy & (c ^ yi ^ 0x80000000); c >>= 31; c &= 1; c = -c; c &= xy; *x = xi ^ c; *y = yi ^ c; } void crypto_sort_uint32_tinyssh(void *xv, long long n) { long long top, p, q, i; crypto_uint32 *x = xv; if (n < 2) return; top = 1; while (top < n - top) top += top; for (p = top; p > 0; p >>= 1) { for (i = 0; i < n - p; ++i) if (!(i & p)) minmax(x + i, x + i + p); for (q = top; q > p; q >>= 1) for (i = 0; i < n - q; ++i) if (!(i & p)) minmax(x + i + p, x + i + q); } } tinyssh-20250501/crypto_sort_uint32.h000066400000000000000000000005751500472222400174240ustar00rootroot00000000000000#ifndef crypto_sort_uint32_H #define crypto_sort_uint32_H #define crypto_sort_uint32_tinyssh_BYTES 4 extern void crypto_sort_uint32_tinyssh(void *, long long); #define crypto_sort_uint32 crypto_sort_uint32_tinyssh #define crypto_sort_uint32_BYTES crypto_sort_uint32_tinyssh_BYTES #define crypto_sort_uint32_IMPLEMENTATION "tinyssh" #define crypto_sort_uint32_VERSION "-" #endif tinyssh-20250501/crypto_stream_chacha20.c000066400000000000000000000162521500472222400201470ustar00rootroot00000000000000/* 20241112 */ #include #include "crypto_stream_chacha20.h" static inline uint32_t unpack32(const unsigned char *x) { uint32_t u0 = ((uint32_t) x[0]); uint32_t u1 = ((uint32_t) x[1]) << 8; uint32_t u2 = ((uint32_t) x[2]) << 16; uint32_t u3 = ((uint32_t) x[3]) << 24; return u0 ^ u1 ^ u2 ^ u3; } static inline void pack32(unsigned char *x, uint32_t u) { x[0] = (unsigned char) (u); x[1] = (unsigned char) (u >> 8); x[2] = (unsigned char) (u >> 16); x[3] = (unsigned char) (u >> 24); } #define ROTATE(x, c) ((x) << (c)) ^ ((x) >> (32 - (c))) #define QUARTERROUND(a, b, c, d) \ a += b; \ d = ROTATE(d ^ a, 16); \ c += d; \ b = ROTATE(b ^ c, 12); \ a += b; \ d = ROTATE(d ^ a, 8); \ c += d; \ b = ROTATE(b ^ c, 7); #define TWOROUNDS() \ QUARTERROUND(x0, x4, x8, x12) \ QUARTERROUND(x1, x5, x9, x13) \ QUARTERROUND(x2, x6, x10, x14) \ QUARTERROUND(x3, x7, x11, x15) \ QUARTERROUND(x0, x5, x10, x15) \ QUARTERROUND(x1, x6, x11, x12) \ QUARTERROUND(x2, x7, x8, x13) \ QUARTERROUND(x3, x4, x9, x14) #define XORBLOCK(o, i) \ x0 = s0; \ x1 = s1; \ x2 = s2; \ x3 = s3; \ x4 = k0; \ x5 = k1; \ x6 = k2; \ x7 = k3; \ x8 = k4; \ x9 = k5; \ x10 = k6; \ x11 = k7; \ x12 = n0; \ x13 = n1; \ x14 = n2; \ x15 = n3; \ \ TWOROUNDS() /* round 1, 2 */ \ TWOROUNDS() /* round 3, 4 */ \ TWOROUNDS() /* round 5, 6 */ \ TWOROUNDS() /* round 7, 8 */ \ TWOROUNDS() /* round 9, 10 */ \ TWOROUNDS() /* round 11, 12 */ \ TWOROUNDS() /* round 13, 14 */ \ TWOROUNDS() /* round 15, 16 */ \ TWOROUNDS() /* round 17, 18 */ \ TWOROUNDS() /* round 19, 20 */ \ \ pack32(o, (x0 + s0) ^ unpack32(i)); \ pack32(o + 4, (x1 + s1) ^ unpack32(i + 4)); \ pack32(o + 8, (x2 + s2) ^ unpack32(i + 8)); \ pack32(o + 12, (x3 + s3) ^ unpack32(i + 12)); \ pack32(o + 16, (x4 + k0) ^ unpack32(i + 16)); \ pack32(o + 20, (x5 + k1) ^ unpack32(i + 20)); \ pack32(o + 24, (x6 + k2) ^ unpack32(i + 24)); \ pack32(o + 28, (x7 + k3) ^ unpack32(i + 28)); \ pack32(o + 32, (x8 + k4) ^ unpack32(i + 32)); \ pack32(o + 36, (x9 + k5) ^ unpack32(i + 36)); \ pack32(o + 40, (x10 + k6) ^ unpack32(i + 40)); \ pack32(o + 44, (x11 + k7) ^ unpack32(i + 44)); \ pack32(o + 48, (x12 + n0) ^ unpack32(i + 48)); \ pack32(o + 52, (x13 + n1) ^ unpack32(i + 52)); \ pack32(o + 56, (x14 + n2) ^ unpack32(i + 56)); \ pack32(o + 60, (x15 + n3) ^ unpack32(i + 60)) int crypto_stream_chacha20_tinyssh_xor(unsigned char *c, const unsigned char *m, unsigned long long l, const unsigned char *n, const unsigned char *k) { register uint32_t x0, x1, x2, x3, x4, x5, x6, x7; register uint32_t x8, x9, x10, x11, x12, x13, x14, x15; uint32_t k0 = unpack32(k); uint32_t k1 = unpack32(k + 4); uint32_t k2 = unpack32(k + 8); uint32_t k3 = unpack32(k + 12); uint32_t k4 = unpack32(k + 16); uint32_t k5 = unpack32(k + 20); uint32_t k6 = unpack32(k + 24); uint32_t k7 = unpack32(k + 28); uint32_t n0 = 0; uint32_t n1 = 0; uint32_t n2 = unpack32(n); uint32_t n3 = unpack32(n + 4); uint32_t s0 = 0x61707865; uint32_t s1 = 0x3320646E; uint32_t s2 = 0x79622D32; uint32_t s3 = 0x6B206574; uint64_t u = 0; if (!l) return 0; while (l >= 64) { XORBLOCK(c, m); n0 = (uint32_t) ++u; n1 = u >> 32; l -= 64; c += 64; m += 64; } if (l) { unsigned char b[64] = {0}; unsigned long long j; for (j = 0; j < l; ++j) b[j] = m[j]; XORBLOCK(b, b); for (j = 0; j < l; ++j) c[j] = b[j]; } return 0; } int crypto_stream_chacha20_tinyssh(unsigned char *c, unsigned long long l, const unsigned char *n, const unsigned char *k) { unsigned long long j; unsigned char ncopy[8], kcopy[32]; for (j = 0; j < 32; ++j) kcopy[j] = k[j]; for (j = 0; j < 8; ++j) ncopy[j] = n[j]; for (j = 0; j < l; ++j) c[j] = 0; return crypto_stream_chacha20_tinyssh_xor(c, c, l, ncopy, kcopy); } tinyssh-20250501/crypto_stream_chacha20.h000066400000000000000000000022141500472222400201450ustar00rootroot00000000000000#ifndef crypto_stream_chacha20_H #define crypto_stream_chacha20_H #define crypto_stream_chacha20_tinyssh_KEYBYTES 32 #define crypto_stream_chacha20_tinyssh_NONCEBYTES 8 extern int crypto_stream_chacha20_tinyssh(unsigned char *, unsigned long long, const unsigned char *, const unsigned char *); extern int crypto_stream_chacha20_tinyssh_xor(unsigned char *, const unsigned char *, unsigned long long, const unsigned char *, const unsigned char *); #define crypto_stream_chacha20 crypto_stream_chacha20_tinyssh #define crypto_stream_chacha20_xor crypto_stream_chacha20_tinyssh_xor #define crypto_stream_chacha20_KEYBYTES crypto_stream_chacha20_tinyssh_KEYBYTES #define crypto_stream_chacha20_NONCEBYTES \ crypto_stream_chacha20_tinyssh_NONCEBYTES #define crypto_stream_chacha20_IMPLEMENTATION "tinyssh" #define crypto_stream_chacha20_VERSION "-" #endif tinyssh-20250501/crypto_verify_16.c000066400000000000000000000004461500472222400170330ustar00rootroot00000000000000#include "crypto_int16.h" #include "crypto_verify_16.h" int crypto_verify_16_tinyssh(const unsigned char *x, const unsigned char *y) { crypto_int16 d = 0; long long i; for (i = 0; i < crypto_verify_16_BYTES; ++i) { d |= x[i] ^ y[i]; } return crypto_int16_nonzero_mask(d); } tinyssh-20250501/crypto_verify_16.h000066400000000000000000000006501500472222400170350ustar00rootroot00000000000000#ifndef crypto_verify_16_H #define crypto_verify_16_H #define crypto_verify_16_tinyssh_BYTES 16 extern int crypto_verify_16_tinyssh(const unsigned char *, const unsigned char *); #define crypto_verify_16 crypto_verify_16_tinyssh #define crypto_verify_16_BYTES crypto_verify_16_tinyssh_BYTES #define crypto_verify_16_IMPLEMENTATION "tinyssh" #define crypto_verify_16_VERSION "-" #endif tinyssh-20250501/crypto_verify_32.c000066400000000000000000000004461500472222400170310ustar00rootroot00000000000000#include "crypto_int16.h" #include "crypto_verify_32.h" int crypto_verify_32_tinyssh(const unsigned char *x, const unsigned char *y) { crypto_int16 d = 0; long long i; for (i = 0; i < crypto_verify_32_BYTES; ++i) { d |= x[i] ^ y[i]; } return crypto_int16_nonzero_mask(d); } tinyssh-20250501/crypto_verify_32.h000066400000000000000000000006501500472222400170330ustar00rootroot00000000000000#ifndef crypto_verify_32_H #define crypto_verify_32_H #define crypto_verify_32_tinyssh_BYTES 32 extern int crypto_verify_32_tinyssh(const unsigned char *, const unsigned char *); #define crypto_verify_32 crypto_verify_32_tinyssh #define crypto_verify_32_BYTES crypto_verify_32_tinyssh_BYTES #define crypto_verify_32_IMPLEMENTATION "tinyssh" #define crypto_verify_32_VERSION "-" #endif tinyssh-20250501/cryptoint/000077500000000000000000000000001500472222400155045ustar00rootroot00000000000000tinyssh-20250501/cryptoint/LICENSE000066400000000000000000000005521500472222400165130ustar00rootroot00000000000000The files in this directory are hereby placed into the public domain. [SPDX-License-Identifier](https://spdx.dev/ids/): [LicenseRef-PD-hp](https://cr.yp.to/spdx.html) OR [CC0-1.0](https://spdx.org/licenses/CC0-1.0.html) OR [0BSD](https://spdx.org/licenses/0BSD.html) OR [MIT-0](https://spdx.org/licenses/MIT-0.html) OR [MIT](https://spdx.org/licenses/MIT.html) tinyssh-20250501/cryptoint/README000066400000000000000000000243361500472222400163740ustar00rootroot00000000000000cryptoint 20250414 D. J. Bernstein ## Introduction cryptoint is an almost-header-only library providing functions for comparisons, bit extractions, etc. on `{int,uint}{8,16,32,64}`, while trying to protect against compilers introducing timing variations. Advantages over previous library functions for basic constant-time operations: * cryptoint provides more functions. * cryptoint provides better protection against current compiler "optimizations". (This does not mean the protection is a guarantee. Make sure to apply further tests such as TIMECOP to the compiled code.) * All cryptoint functions, after compilation with some common compilers for some common architectures, have been verified using [saferewrite](https://pqsrc.cr.yp.to/downloads.html) to match reference implementations for all inputs. Often applications have their own ad-hoc constant-time code. Advantages of rewriting those to use the centralized cryptoint functions: * More likely to generate code that's [actually constant-time](https://blog.cr.yp.to/20240803-clang.html). * Less code to fix in response to whatever further damage is caused by compiler "optimizations". * Often less CPU time, although it's rare for this to matter. * Better testing. cryptoint is used inside [SUPERCOP](https://bench.cr.yp.to/supercop.html), [lib25519](https://lib25519.cr.yp.to), [libmceliece](https://lib.mceliece.org), [libntruprime](https://libntruprime.cr.yp.to), and [OpenSSH](https://github.com/openssh/openssh-portable/blob/master/sntrup761.c). ## Usage To use (e.g.) `crypto_int64` in your own package, simply copy `crypto_int64.h` and `int64_optblocker.c` into that package. Compilation recommendations: * Use `gcc` or `clang`. (Porting to other compilers should be a simple matter of compiling with `-D__attribute__(x)=`; however, tests have been carried out only with `gcc` and `clang`.) * Compile all code with `-fwrapv`. (This disables some compiler "optimizations" that often trigger bugs in integer arithmetic. These "optimizations" have very little effect on performance.) * Compile `*optblocker.c` separately: don't manually merge `*optblocker.c` into other files; don't use the `-flto` option in compiling `*optblocker.c`. `crypto_{int,uint}64.h` define types `crypto_{int,uint}64` and the following API functions: | usage | meaning | | ----- | ----- | | `z = crypto_{int,uint}64_load(ptr)` | little-endian load | | `crypto_{int,uint}64_store(ptr,z)` | little-endian store | | `z = crypto_{int,uint}64_load_bigendian(ptr)` | big-endian load | | `crypto_{int,uint}64_store_bigendian(ptr,z)` | big-endian store | | `z = crypto_int64_positive_mask(x)` | `z = -(x > 0) | | `z = crypto_int64_positive_01(x)` | `z = (x > 0) | | `z = crypto_int64_negative_mask(x)` | `z = -(x < 0) | | `z = crypto_int64_negative_01(x)` | `z = (x < 0) | | `z = crypto_int64_topbit_mask(x)` | `z = -(x < 0) | | `z = crypto_int64_topbit_01(x)` | `z = (x < 0) | | `z = crypto_uint64_topbit_mask(x)` | `z = -(x >> 63) | | `z = crypto_uint64_topbit_01(x)` | `z = (x >> 63) | | `z = crypto_{int,uint}64_nonzero_mask(x)` | `z = -(x != 0) | | `z = crypto_{int,uint}64_nonzero_01(x)` | `z = (x != 0) | | `z = crypto_{int,uint}64_zero_mask(x)` | `z = -(x == 0) | | `z = crypto_{int,uint}64_zero_01(x)` | `z = (x == 0) | | `z = crypto_{int,uint}64_unequal_mask(x,y)` | `z = -(x != y) | | `z = crypto_{int,uint}64_unequal_01(x,y)` | `z = (x != y) | | `z = crypto_{int,uint}64_equal_mask(x,y)` | `z = -(x == y) | | `z = crypto_{int,uint}64_equal_01(x,y)` | `z = (x == y) | | `z = crypto_{int,uint}64_smaller_mask(x,y)` | `z = -(x < y) | | `z = crypto_{int,uint}64_smaller_01(x,y)` | `z = (x < y) | | `z = crypto_{int,uint}64_leq_mask(x,y)` | `z = -(x <= y) | | `z = crypto_{int,uint}64_leq_01(x,y)` | `z = (x <= y) | | `z = crypto_{int,uint}64_min(x,y)` | `z = (x < y) ? x : y` | | `z = crypto_{int,uint}64_max(x,y)` | `z = (x > y) ? x : y` | | `crypto_{int,uint}64_minmax(&x,&y)` | in-place `(x,y) = (min,max)` | | `z = crypto_{int,uint}64_bottombit_mask(x)` | `z = -(x & 1) | | `z = crypto_{int,uint}64_bottombit_01(x)` | `z = (x & 1) | | `z = crypto_{int,uint}64_shlmod(x,j)` | `z = x << (j&63)` | | `z = crypto_{int,uint}64_shrmod(x,j)` | `z = x >> (j&63)` | | `z = crypto_{int,uint}64_bitmod_mask(x,j)` | `z = -((x >> (j&63)) & 1)` | | `z = crypto_{int,uint}64_bitmod_01(x,j)` | `z = ((x >> (j&63)) & 1)` | | `z = crypto_{int,uint}64_ones_num(x)` | `z =` number of bits set in `x` (0 through 64) | | `z = crypto_{int,uint}64_bottomzeros_num(x)` | `z =` number of low-order 0 bits in `x` (0 through 64) | There are also `bitinrangepublicpos` functions tested by `test.c` and used internally. These are not part of the API; use `bitmod` instead. Notes on the split between `mask` functions and `01` functions: * The `01` functions are aligned with C's convention of representing true as `1` and false as `0`. For example, `x < y` in C, like `x < y ? 1 : 0`, means `1` if `x` is smaller than `y`, else `0`. You can replace this with `crypto_int64_smaller_01(x,y)` if `x` and `y` are 64-bit signed integers. * The `mask` functions are aligned with a convention of representing true as `-1` and false as `0`, which works well with logic instructions. For example, you can rewrite the variable-time code `x < y ? u : v` (meaning `u` if `x < y`, else `v`) as `v ^ ((u ^ v) & crypto_int64_smaller_mask(x,y))`. For comparison, `v + (u - v) * crypto_int64_smaller_01(x,y)` would rely on multiplication taking constant time, but on some platforms multiplication takes variable time. Beware that the `mask` convention, like any other use of negative integers, isn't compatible with unsigned integer extension. For example, conversion from `uint8` to `uint64` will convert `-1` to `255` rather than to `-1`. This is an argument for using `int` rather than `uint`. On the other hand, C allows compilers to damage the correctness of `int` code in various ways that aren't allowed for `uint`. Compiling with `-fwrapv`, as recommended above, disables some of that damage. ## Internals cryptoint has two main defenses against timing variations being introduced by compiler "optimizations". The first defense is `optblocker`, which is a global `volatile` variable containing 0. The usage of `optblocker` in cryptoint is designed to systematically hide 1-bit data paths from compilers. The second defense is assembly. This would be safest as separate `.s` files, but the usability constraint of having only two files per size (one `.h` file, one `optblocker.c` file) forces cryptoint to use inline assembly instead. Currently cryptoint has assembly implementations of various functions for * `amd64` (64-bit AMD and Intel, aka `x86_64`), * `arm64` (64-bit ARM, aka `aarch64`), * `arm32` (32-bit ARM, not in Thumb mode), and * `sparc32` (32-bit SPARC, still used in space applications). These are selected automatically for `gcc` and `clang` using tests for `__GNUC__`, `__x86_64__`, etc. Other platforms fall back automatically to portable code using `optblocker`. From an auditing perspective, reviewing cryptoint means checking code for many different functions, and the usage of assembly makes this work more difficult: * Assembly implementations are separate for each size, and separate for each targeted platform: e.g., `crypto_int*_negative_mask` has not just portable code but also 16 assembly implementations (4 sizes for each of `amd64`, `arm64`, `arm32`, `sparc32`). * Assembly is generally less readable than C, making bugs more likely to escape the notice of authors and reviewers. Assembly also depends on quirks of the targeted instruction sets. * Inline assembly has its own quirks, with a more complicated interface than the function ABI. cryptoint takes the following steps to reduce the risk of bugs: * cryptoint includes a new `readasm` tool that generates inline assembly from an easier-to-read format. (See `functions` for the source code in this format; `crypto*.h` are automatically generated.) This improves auditability. Also, the converter generates register annotations, avoiding some common classes of inline-assembly bugs. * All cryptoint functions are subjected to a battery of conventional unit tests via `cryptoint/test.c` in SUPERCOP. Various functions are also indirectly tested via tests of implementations that use cryptoint. * All cryptoint functions are also integrated into saferewrite, which, after compilation, uses symbolic execution and Z3 to check equivalence to reference implementations. This has been run with various compilers for `amd64`, `arm64`, `arm32`, `mips64`, `sparc32`, and `x86`; see `saferewrite-results`. ## Implementation notes The portable version of `SIGNED_negative_mask` could instead use `X >>= (N-1) ^ SIGNED_optblocker`. The use of `optblocker` inside `bitinrangepublicpos` is meant to protect against the compiler causing trouble if `S` is a compile-time constant `63` (or in general 1 below the width), although this is unnecessary for the current applications of `bitinrangepublicpos`. The assembly implementations of `shlmod` and `shrmod` assume that shift instructions take constant time. The portable implementation does not make this assumption. This is important: for example, compilers for 32-bit platforms will typically produce `int64` shift code that takes different time for different shift distances. Various assembly implementations assume that conditional instructions, such as conditional moves, take constant time. The `amd64` implementation of `TYPE_nonzero_01` could use `set` instead of `cmov`. There are more ways to implement `TYPE_ones_num`. The ending could use `*0x...10101`, but this would rely on multiplication instructions taking constant time, which, as noted above, isn't true on some platforms. For `__SSE4_2__` one could use `popcnt`. For `arm64` one could use `cnt` for `cssc`, or NEON `cnt`. For `TYPE_bottomzeros_num`, one could use `tzcnt` for `amd64` with `bmi1`, or `ctz` for `arm64` with `cssc`. tinyssh-20250501/cryptoint/autogen000077500000000000000000000000721500472222400170730ustar00rootroot00000000000000#!/bin/sh ./create.py ./specialize.py rm -rf __pycache__ tinyssh-20250501/cryptoint/create.py000077500000000000000000000051671500472222400173350ustar00rootroot00000000000000#!/usr/bin/env python3 vars = 'k','l','p','q','r','s','x','y','z' with open('version') as f: version = f.read().strip() # ===== top csh = f'''/* auto-generated: cd cryptoint; ./autogen */ /* {version} */ #ifndef crypto_intN_h #define crypto_intN_h #include #define crypto_intN intN_t #define crypto_intN_unsigned uintN_t #define crypto_intN_optblocker namespace_intN_optblocker extern volatile crypto_intN crypto_intN_optblocker; ''' cuh = f'''/* auto-generated: cd cryptoint; ./autogen */ /* {version} */ #ifndef crypto_uintN_h #define crypto_uintN_h #include #define crypto_uintN uintN_t #define crypto_uintN_signed intN_t #define crypto_uintN_signed_optblocker namespace_uintN_signed_optblocker extern volatile crypto_uintN_signed crypto_uintN_signed_optblocker; ''' # ===== functions functions = [] with open('functions') as f: which,fun = 'both',None for line in f: if fun is None: if line.startswith('#'): continue if line.strip() == '': continue if line.strip() == 'SIGNED:': which = 'signed' continue if line.strip() == 'UNSIGNED:': which = 'unsigned' continue fun = '' fun += line if line.strip() == '}': functions += [(which,fun)] which,fun = 'both',None for which,fun in functions: if which in ('both','signed'): data = fun data = data.replace('TYPE','crypto_intN') data = data.replace('UNSIGNED','crypto_intN_unsigned') data = data.replace('SIGNED','crypto_intN') for v in vars: data = data.replace(v.upper(),'crypto_intN_'+v) csh += '__attribute__((unused))\n' csh += 'static inline\n' csh += data csh += '\n' if which in ('both','unsigned'): data = fun data = data.replace('TYPE','crypto_uintN') data = data.replace('UNSIGNED','crypto_uintN') data = data.replace('SIGNED','crypto_uintN_signed') for v in vars: data = data.replace(v.upper(),'crypto_uintN_'+v) cuh += '__attribute__((unused))\n' cuh += 'static inline\n' cuh += data cuh += '\n' # ===== bottom csh += '''#endif ''' cuh += '''#endif ''' # ===== ship it with open('crypto_intN.h','w') as f: f.write(csh) with open('crypto_uintN.h','w') as f: f.write(cuh) with open('intN_optblocker.c','w') as f: f.write(f'''/* auto-generated: cd cryptoint; ./autogen */ /* {version} */ #include "crypto_intN.h" volatile crypto_intN crypto_intN_optblocker = 0; ''') with open('uintN_optblocker.c','w') as f: f.write(f'''/* auto-generated: cd cryptoint; ./autogen */ /* {version} */ #include "crypto_uintN.h" volatile crypto_uintN_signed crypto_uintN_signed_optblocker = 0; ''') tinyssh-20250501/cryptoint/crypto_int16.h000066400000000000000000000647241500472222400202330ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #ifndef crypto_int16_h #define crypto_int16_h #include #define crypto_int16 int16_t #define crypto_int16_unsigned uint16_t #define crypto_int16_optblocker tinyssh_int16_optblocker extern volatile crypto_int16 crypto_int16_optblocker; __attribute__((unused)) static inline crypto_int16 crypto_int16_load(const unsigned char *crypto_int16_s) { crypto_int16 crypto_int16_z = 0; crypto_int16_z |= ((crypto_int16) (*crypto_int16_s++)) << 0; crypto_int16_z |= ((crypto_int16) (*crypto_int16_s++)) << 8; return crypto_int16_z; } __attribute__((unused)) static inline crypto_int16 crypto_int16_load_bigendian(const unsigned char *crypto_int16_s) { crypto_int16 crypto_int16_z = 0; crypto_int16_z |= ((crypto_int16) (*crypto_int16_s++)) << 8; crypto_int16_z |= ((crypto_int16) (*crypto_int16_s++)) << 0; return crypto_int16_z; } __attribute__((unused)) static inline void crypto_int16_store(unsigned char *crypto_int16_s,crypto_int16 crypto_int16_x) { *crypto_int16_s++ = crypto_int16_x >> 0; *crypto_int16_s++ = crypto_int16_x >> 8; } __attribute__((unused)) static inline void crypto_int16_store_bigendian(unsigned char *crypto_int16_s,crypto_int16 crypto_int16_x) { *crypto_int16_s++ = crypto_int16_x >> 8; *crypto_int16_s++ = crypto_int16_x >> 0; } __attribute__((unused)) static inline crypto_int16 crypto_int16_negative_mask(crypto_int16 crypto_int16_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarw $15,%0" : "+r"(crypto_int16_x) : : "cc"); return crypto_int16_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_y; __asm__ ("sbfx %w0,%w1,15,1" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); return crypto_int16_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int16 crypto_int16_y; __asm__ ("sxth %0,%1\n asr %0,%0,#31" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); return crypto_int16_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int16 crypto_int16_y; __asm__ ("sll %1,16,%0\n sra %0,31,%0" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); return crypto_int16_y; #else crypto_int16_x >>= 16-6; crypto_int16_x += crypto_int16_optblocker; crypto_int16_x >>= 5; return crypto_int16_x; #endif } __attribute__((unused)) static inline crypto_int16_unsigned crypto_int16_unsigned_topbit_01(crypto_int16_unsigned crypto_int16_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrw $15,%0" : "+r"(crypto_int16_x) : : "cc"); return crypto_int16_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16_unsigned crypto_int16_y; __asm__ ("ubfx %w0,%w1,15,1" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); return crypto_int16_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int16 crypto_int16_y; __asm__ ("uxth %0,%1\n lsr %0,%0,#15" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); return crypto_int16_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int16_unsigned crypto_int16_y; __asm__ ("sll %1,16,%0\n srl %0,16,%0\n srl %0,15,%0" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); return crypto_int16_y; #else crypto_int16_x >>= 16-6; crypto_int16_x += crypto_int16_optblocker; crypto_int16_x >>= 5; return crypto_int16_x; #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_negative_01(crypto_int16 crypto_int16_x) { return crypto_int16_unsigned_topbit_01(crypto_int16_x); } __attribute__((unused)) static inline crypto_int16 crypto_int16_topbit_mask(crypto_int16 crypto_int16_x) { return crypto_int16_negative_mask(crypto_int16_x); } __attribute__((unused)) static inline crypto_int16 crypto_int16_topbit_01(crypto_int16 crypto_int16_x) { return crypto_int16_unsigned_topbit_01(crypto_int16_x); } __attribute__((unused)) static inline crypto_int16 crypto_int16_bottombit_mask(crypto_int16 crypto_int16_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andw $1,%0" : "+r"(crypto_int16_x) : : "cc"); return -crypto_int16_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_y; __asm__ ("sbfx %w0,%w1,0,1" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); return crypto_int16_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int16 crypto_int16_y; __asm__ ("and %0,%1,#1\n neg %0,%0" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); return crypto_int16_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int16 crypto_int16_y; __asm__ ("and %1,1,%0\n neg %0,%0" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); return crypto_int16_y; #else crypto_int16_x &= 1 + crypto_int16_optblocker; return -crypto_int16_x; #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_bottombit_01(crypto_int16 crypto_int16_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andw $1,%0" : "+r"(crypto_int16_x) : : "cc"); return crypto_int16_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_y; __asm__ ("ubfx %w0,%w1,0,1" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); return crypto_int16_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int16 crypto_int16_y; __asm__ ("and %0,%1,#1" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); return crypto_int16_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int16 crypto_int16_y; __asm__ ("and %1,1,%0" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); return crypto_int16_y; #else crypto_int16_x &= 1 + crypto_int16_optblocker; return crypto_int16_x; #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_bitinrangepublicpos_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarw %%cl,%0" : "+r"(crypto_int16_x) : "c"(crypto_int16_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("sxth %w0,%w0\n asr %w0,%w0,%w1" : "+&r"(crypto_int16_x) : "r"(crypto_int16_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %0,%0,#15\n sxth %1,%1\n asr %1,%1,%0" : "+&r"(crypto_int16_s), "+r"(crypto_int16_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("and %0,15,%0\n sra %1,%0,%1" : "+&r"(crypto_int16_s), "+r"(crypto_int16_x) : : ); #else crypto_int16_x >>= crypto_int16_s ^ crypto_int16_optblocker; #endif return crypto_int16_bottombit_mask(crypto_int16_x); } __attribute__((unused)) static inline crypto_int16 crypto_int16_bitinrangepublicpos_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarw %%cl,%0" : "+r"(crypto_int16_x) : "c"(crypto_int16_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("sxth %w0,%w0\n asr %w0,%w0,%w1" : "+&r"(crypto_int16_x) : "r"(crypto_int16_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %0,%0,#15\n sxth %1,%1\n asr %1,%1,%0" : "+&r"(crypto_int16_s), "+r"(crypto_int16_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("and %0,15,%0\n sra %1,%0,%1" : "+&r"(crypto_int16_s), "+r"(crypto_int16_x) : : ); #else crypto_int16_x >>= crypto_int16_s ^ crypto_int16_optblocker; #endif return crypto_int16_bottombit_01(crypto_int16_x); } __attribute__((unused)) static inline crypto_int16 crypto_int16_shlmod(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16_s &= 15; __asm__ ("shlw %%cl,%0" : "+r"(crypto_int16_x) : "c"(crypto_int16_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16_s &= 15; __asm__ ("and %w0,%w0,65535\n lsl %w0,%w0,%w1" : "+&r"(crypto_int16_x) : "r"(crypto_int16_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int16_s &= 15; __asm__ ("lsl %0,%0,%1\n sxth %0,%0" : "+r"(crypto_int16_x) : "r"(crypto_int16_s) : ); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int16_s &= 15; crypto_int16_s += 16; __asm__ ("sll %0,%1,%0\n sra %0,16,%0" : "+r"(crypto_int16_x) : "r"(crypto_int16_s) : ); #else int crypto_int16_k, crypto_int16_l; for (crypto_int16_l = 0,crypto_int16_k = 1;crypto_int16_k < 16;++crypto_int16_l,crypto_int16_k *= 2) crypto_int16_x ^= (crypto_int16_x ^ (crypto_int16_x << crypto_int16_k)) & crypto_int16_bitinrangepublicpos_mask(crypto_int16_s,crypto_int16_l); #endif return crypto_int16_x; } __attribute__((unused)) static inline crypto_int16 crypto_int16_shrmod(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16_s &= 15; __asm__ ("sarw %%cl,%0" : "+r"(crypto_int16_x) : "c"(crypto_int16_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16_s &= 15; __asm__ ("sxth %w0,%w0\n asr %w0,%w0,%w1" : "+&r"(crypto_int16_x) : "r"(crypto_int16_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int16_s &= 15; __asm__ ("sxth %0,%0\n asr %0,%0,%1" : "+&r"(crypto_int16_x) : "r"(crypto_int16_s) : ); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int16_s &= 15; __asm__ ("sra %0,%1,%0" : "+r"(crypto_int16_x) : "r"(crypto_int16_s) : ); #else int crypto_int16_k, crypto_int16_l; for (crypto_int16_l = 0,crypto_int16_k = 1;crypto_int16_k < 16;++crypto_int16_l,crypto_int16_k *= 2) crypto_int16_x ^= (crypto_int16_x ^ (crypto_int16_x >> crypto_int16_k)) & crypto_int16_bitinrangepublicpos_mask(crypto_int16_s,crypto_int16_l); #endif return crypto_int16_x; } __attribute__((unused)) static inline crypto_int16 crypto_int16_bitmod_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) { crypto_int16_x = crypto_int16_shrmod(crypto_int16_x,crypto_int16_s); return crypto_int16_bottombit_mask(crypto_int16_x); } __attribute__((unused)) static inline crypto_int16 crypto_int16_bitmod_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) { crypto_int16_x = crypto_int16_shrmod(crypto_int16_x,crypto_int16_s); return crypto_int16_bottombit_01(crypto_int16_x); } __attribute__((unused)) static inline crypto_int16 crypto_int16_nonzero_mask(crypto_int16 crypto_int16_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $-1,%1\n testw %2,%2\n cmovnew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("tst %w1,65535\n csetm %w0,ne" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("uxth %0,%0\n cmp %0,#0\n movne %0,#-1" : "+r"(crypto_int16_x) : : "cc"); return crypto_int16_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int16 crypto_int16_z; __asm__ ("sll %0,16,%0\n srl %0,16,%0\n cmp %%g0,%0\n subx %%g0,0,%1" : "+r"(crypto_int16_x), "=r"(crypto_int16_z) : : "cc"); return crypto_int16_z; #else crypto_int16_x |= -crypto_int16_x; return crypto_int16_negative_mask(crypto_int16_x); #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_nonzero_01(crypto_int16 crypto_int16_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $1,%1\n testw %2,%2\n cmovnew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("tst %w1,65535\n cset %w0,ne" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("uxth %0,%0\n cmp %0,#0\n movne %0,#1" : "+r"(crypto_int16_x) : : "cc"); return crypto_int16_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int16 crypto_int16_z; __asm__ ("sll %0,16,%0\n srl %0,16,%0\n cmp %%g0,%0\n addx %%g0,0,%1" : "+r"(crypto_int16_x), "=r"(crypto_int16_z) : : "cc"); return crypto_int16_z; #else crypto_int16_x |= -crypto_int16_x; return crypto_int16_unsigned_topbit_01(crypto_int16_x); #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_positive_mask(crypto_int16 crypto_int16_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $-1,%1\n testw %2,%2\n cmovgw %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("sxth %w0,%w1\n cmp %w0,0\n csetm %w0,gt" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int16 crypto_int16_z; __asm__ ("sll %1,16,%0\n sra %0,31,%0\n sub %0,%1,%0\n sra %0,31,%0" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x) : ); return crypto_int16_z; #else crypto_int16 crypto_int16_z = -crypto_int16_x; crypto_int16_z ^= crypto_int16_x & crypto_int16_z; return crypto_int16_negative_mask(crypto_int16_z); #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_positive_01(crypto_int16 crypto_int16_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $1,%1\n testw %2,%2\n cmovgw %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("sxth %w0,%w1\n cmp %w0,0\n cset %w0,gt" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int16 crypto_int16_z; __asm__ ("sll %1,16,%0\n sra %0,31,%0\n sub %0,%1,%0\n srl %0,31,%0" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x) : ); return crypto_int16_z; #else crypto_int16 crypto_int16_z = -crypto_int16_x; crypto_int16_z ^= crypto_int16_x & crypto_int16_z; return crypto_int16_unsigned_topbit_01(crypto_int16_z); #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_zero_mask(crypto_int16 crypto_int16_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $-1,%1\n testw %2,%2\n cmovew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("tst %w1,65535\n csetm %w0,eq" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int16 crypto_int16_z; __asm__ ("sll %0,16,%0\n srl %0,16,%0\n cmp %%g0,%0\n addx %%g0,-1,%1" : "+r"(crypto_int16_x), "=r"(crypto_int16_z) : : "cc"); return crypto_int16_z; #else return ~crypto_int16_nonzero_mask(crypto_int16_x); #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_zero_01(crypto_int16 crypto_int16_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $1,%1\n testw %2,%2\n cmovew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("tst %w1,65535\n cset %w0,eq" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int16 crypto_int16_z; __asm__ ("sll %0,16,%0\n srl %0,16,%0\n cmp %%g0,%0\n subx %%g0,-1,%1" : "+r"(crypto_int16_x), "=r"(crypto_int16_z) : : "cc"); return crypto_int16_z; #else return 1-crypto_int16_nonzero_01(crypto_int16_x); #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_unequal_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovnew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n csetm %w0,ne" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #else return crypto_int16_nonzero_mask(crypto_int16_x ^ crypto_int16_y); #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_unequal_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovnew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n cset %w0,ne" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #else return crypto_int16_nonzero_01(crypto_int16_x ^ crypto_int16_y); #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_equal_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n csetm %w0,eq" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #else return crypto_int16_zero_mask(crypto_int16_x ^ crypto_int16_y); #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_equal_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n cset %w0,eq" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #else return crypto_int16_zero_01(crypto_int16_x ^ crypto_int16_y); #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_min(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("cmpw %1,%0\n cmovgw %1,%0" : "+r"(crypto_int16_x) : "r"(crypto_int16_y) : "cc"); return crypto_int16_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("sxth %w0,%w0\n cmp %w0,%w1,sxth\n csel %w0,%w0,%w1,lt" : "+&r"(crypto_int16_x) : "r"(crypto_int16_y) : "cc"); return crypto_int16_x; #else crypto_int16 crypto_int16_r = crypto_int16_y ^ crypto_int16_x; crypto_int16 crypto_int16_z = crypto_int16_y - crypto_int16_x; crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_y); crypto_int16_z = crypto_int16_negative_mask(crypto_int16_z); crypto_int16_z &= crypto_int16_r; return crypto_int16_x ^ crypto_int16_z; #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_max(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("cmpw %1,%0\n cmovlw %1,%0" : "+r"(crypto_int16_x) : "r"(crypto_int16_y) : "cc"); return crypto_int16_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("sxth %w0,%w0\n cmp %w0,%w1,sxth\n csel %w0,%w1,%w0,lt" : "+&r"(crypto_int16_x) : "r"(crypto_int16_y) : "cc"); return crypto_int16_x; #else crypto_int16 crypto_int16_r = crypto_int16_y ^ crypto_int16_x; crypto_int16 crypto_int16_z = crypto_int16_y - crypto_int16_x; crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_y); crypto_int16_z = crypto_int16_negative_mask(crypto_int16_z); crypto_int16_z &= crypto_int16_r; return crypto_int16_y ^ crypto_int16_z; #endif } __attribute__((unused)) static inline void crypto_int16_minmax(crypto_int16 *crypto_int16_p,crypto_int16 *crypto_int16_q) { crypto_int16 crypto_int16_x = *crypto_int16_p; crypto_int16 crypto_int16_y = *crypto_int16_q; #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_z; __asm__ ("cmpw %2,%1\n movw %1,%0\n cmovgw %2,%1\n cmovgw %0,%2" : "=&r"(crypto_int16_z), "+&r"(crypto_int16_x), "+r"(crypto_int16_y) : : "cc"); *crypto_int16_p = crypto_int16_x; *crypto_int16_q = crypto_int16_y; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_r, crypto_int16_s; __asm__ ("sxth %w0,%w0\n cmp %w0,%w3,sxth\n csel %w1,%w0,%w3,lt\n csel %w2,%w3,%w0,lt" : "+&r"(crypto_int16_x), "=&r"(crypto_int16_r), "=r"(crypto_int16_s) : "r"(crypto_int16_y) : "cc"); *crypto_int16_p = crypto_int16_r; *crypto_int16_q = crypto_int16_s; #else crypto_int16 crypto_int16_r = crypto_int16_y ^ crypto_int16_x; crypto_int16 crypto_int16_z = crypto_int16_y - crypto_int16_x; crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_y); crypto_int16_z = crypto_int16_negative_mask(crypto_int16_z); crypto_int16_z &= crypto_int16_r; crypto_int16_x ^= crypto_int16_z; crypto_int16_y ^= crypto_int16_z; *crypto_int16_p = crypto_int16_x; *crypto_int16_q = crypto_int16_y; #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_smaller_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovlw %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("sxth %w0,%w1\n cmp %w0,%w2,sxth\n csetm %w0,lt" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #else crypto_int16 crypto_int16_r = crypto_int16_x ^ crypto_int16_y; crypto_int16 crypto_int16_z = crypto_int16_x - crypto_int16_y; crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_x); return crypto_int16_negative_mask(crypto_int16_z); #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_smaller_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovlw %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("sxth %w0,%w1\n cmp %w0,%w2,sxth\n cset %w0,lt" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #else crypto_int16 crypto_int16_r = crypto_int16_x ^ crypto_int16_y; crypto_int16 crypto_int16_z = crypto_int16_x - crypto_int16_y; crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_x); return crypto_int16_unsigned_topbit_01(crypto_int16_z); #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_leq_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovlew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("sxth %w0,%w1\n cmp %w0,%w2,sxth\n csetm %w0,le" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #else return ~crypto_int16_smaller_mask(crypto_int16_y,crypto_int16_x); #endif } __attribute__((unused)) static inline crypto_int16 crypto_int16_leq_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 crypto_int16_q,crypto_int16_z; __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovlew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int16 crypto_int16_z; __asm__ ("sxth %w0,%w1\n cmp %w0,%w2,sxth\n cset %w0,le" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); return crypto_int16_z; #else return 1-crypto_int16_smaller_01(crypto_int16_y,crypto_int16_x); #endif } __attribute__((unused)) static inline int crypto_int16_ones_num(crypto_int16 crypto_int16_x) { crypto_int16_unsigned crypto_int16_y = crypto_int16_x; const crypto_int16 C0 = 0x5555; const crypto_int16 C1 = 0x3333; const crypto_int16 C2 = 0x0f0f; crypto_int16_y -= ((crypto_int16_y >> 1) & C0); crypto_int16_y = (crypto_int16_y & C1) + ((crypto_int16_y >> 2) & C1); crypto_int16_y = (crypto_int16_y + (crypto_int16_y >> 4)) & C2; crypto_int16_y = (crypto_int16_y + (crypto_int16_y >> 8)) & 0xff; return crypto_int16_y; } __attribute__((unused)) static inline int crypto_int16_bottomzeros_num(crypto_int16 crypto_int16_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int16 fallback = 16; __asm__ ("bsfw %0,%0\n cmovew %1,%0" : "+&r"(crypto_int16_x) : "r"(fallback) : "cc"); return crypto_int16_x; #elif defined(__GNUC__) && defined(__aarch64__) int64_t crypto_int16_y; __asm__ ("orr %w0,%w1,-65536\n rbit %w0,%w0\n clz %w0,%w0" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); return crypto_int16_y; #else crypto_int16 crypto_int16_y = crypto_int16_x ^ (crypto_int16_x-1); crypto_int16_y = ((crypto_int16) crypto_int16_y) >> 1; crypto_int16_y &= ~(crypto_int16_x & (((crypto_int16) 1) << (16-1))); return crypto_int16_ones_num(crypto_int16_y); #endif } #endif tinyssh-20250501/cryptoint/crypto_int32.h000066400000000000000000000640431500472222400202230ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #ifndef crypto_int32_h #define crypto_int32_h #include #define crypto_int32 int32_t #define crypto_int32_unsigned uint32_t #define crypto_int32_optblocker tinyssh_int32_optblocker extern volatile crypto_int32 crypto_int32_optblocker; __attribute__((unused)) static inline crypto_int32 crypto_int32_load(const unsigned char *crypto_int32_s) { crypto_int32 crypto_int32_z = 0; crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 0; crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 8; crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 16; crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 24; return crypto_int32_z; } __attribute__((unused)) static inline crypto_int32 crypto_int32_load_bigendian(const unsigned char *crypto_int32_s) { crypto_int32 crypto_int32_z = 0; crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 24; crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 16; crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 8; crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 0; return crypto_int32_z; } __attribute__((unused)) static inline void crypto_int32_store(unsigned char *crypto_int32_s,crypto_int32 crypto_int32_x) { *crypto_int32_s++ = crypto_int32_x >> 0; *crypto_int32_s++ = crypto_int32_x >> 8; *crypto_int32_s++ = crypto_int32_x >> 16; *crypto_int32_s++ = crypto_int32_x >> 24; } __attribute__((unused)) static inline void crypto_int32_store_bigendian(unsigned char *crypto_int32_s,crypto_int32 crypto_int32_x) { *crypto_int32_s++ = crypto_int32_x >> 24; *crypto_int32_s++ = crypto_int32_x >> 16; *crypto_int32_s++ = crypto_int32_x >> 8; *crypto_int32_s++ = crypto_int32_x >> 0; } __attribute__((unused)) static inline crypto_int32 crypto_int32_negative_mask(crypto_int32 crypto_int32_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarl $31,%0" : "+r"(crypto_int32_x) : : "cc"); return crypto_int32_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_y; __asm__ ("asr %w0,%w1,31" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); return crypto_int32_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int32 crypto_int32_y; __asm__ ("asr %0,%1,#31" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); return crypto_int32_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int32 crypto_int32_y; __asm__ ("sra %1,31,%0" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); return crypto_int32_y; #else crypto_int32_x >>= 32-6; crypto_int32_x += crypto_int32_optblocker; crypto_int32_x >>= 5; return crypto_int32_x; #endif } __attribute__((unused)) static inline crypto_int32_unsigned crypto_int32_unsigned_topbit_01(crypto_int32_unsigned crypto_int32_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrl $31,%0" : "+r"(crypto_int32_x) : : "cc"); return crypto_int32_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32_unsigned crypto_int32_y; __asm__ ("lsr %w0,%w1,31" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); return crypto_int32_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int32 crypto_int32_y; __asm__ ("lsr %0,%1,#31" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); return crypto_int32_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int32_unsigned crypto_int32_y; __asm__ ("srl %1,31,%0" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); return crypto_int32_y; #else crypto_int32_x >>= 32-6; crypto_int32_x += crypto_int32_optblocker; crypto_int32_x >>= 5; return crypto_int32_x; #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_negative_01(crypto_int32 crypto_int32_x) { return crypto_int32_unsigned_topbit_01(crypto_int32_x); } __attribute__((unused)) static inline crypto_int32 crypto_int32_topbit_mask(crypto_int32 crypto_int32_x) { return crypto_int32_negative_mask(crypto_int32_x); } __attribute__((unused)) static inline crypto_int32 crypto_int32_topbit_01(crypto_int32 crypto_int32_x) { return crypto_int32_unsigned_topbit_01(crypto_int32_x); } __attribute__((unused)) static inline crypto_int32 crypto_int32_bottombit_mask(crypto_int32 crypto_int32_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andl $1,%0" : "+r"(crypto_int32_x) : : "cc"); return -crypto_int32_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_y; __asm__ ("sbfx %w0,%w1,0,1" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); return crypto_int32_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int32 crypto_int32_y; __asm__ ("and %0,%1,#1\n neg %0,%0" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); return crypto_int32_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int32 crypto_int32_y; __asm__ ("and %1,1,%0\n neg %0,%0" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); return crypto_int32_y; #else crypto_int32_x &= 1 + crypto_int32_optblocker; return -crypto_int32_x; #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_bottombit_01(crypto_int32 crypto_int32_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andl $1,%0" : "+r"(crypto_int32_x) : : "cc"); return crypto_int32_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_y; __asm__ ("ubfx %w0,%w1,0,1" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); return crypto_int32_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int32 crypto_int32_y; __asm__ ("and %0,%1,#1" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); return crypto_int32_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int32 crypto_int32_y; __asm__ ("and %1,1,%0" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); return crypto_int32_y; #else crypto_int32_x &= 1 + crypto_int32_optblocker; return crypto_int32_x; #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_bitinrangepublicpos_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarl %%cl,%0" : "+r"(crypto_int32_x) : "c"(crypto_int32_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("asr %w0,%w0,%w1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %0,%0,#31\n asr %1,%1,%0" : "+&r"(crypto_int32_s), "+r"(crypto_int32_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("sra %0,%1,%0" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); #else crypto_int32_x >>= crypto_int32_s ^ crypto_int32_optblocker; #endif return crypto_int32_bottombit_mask(crypto_int32_x); } __attribute__((unused)) static inline crypto_int32 crypto_int32_bitinrangepublicpos_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarl %%cl,%0" : "+r"(crypto_int32_x) : "c"(crypto_int32_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("asr %w0,%w0,%w1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %0,%0,#31\n asr %1,%1,%0" : "+&r"(crypto_int32_s), "+r"(crypto_int32_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("sra %0,%1,%0" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); #else crypto_int32_x >>= crypto_int32_s ^ crypto_int32_optblocker; #endif return crypto_int32_bottombit_01(crypto_int32_x); } __attribute__((unused)) static inline crypto_int32 crypto_int32_shlmod(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shll %%cl,%0" : "+r"(crypto_int32_x) : "c"(crypto_int32_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("lsl %w0,%w0,%w1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int32_s &= 31; __asm__ ("lsl %0,%0,%1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("sll %0,%1,%0" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); #else int crypto_int32_k, crypto_int32_l; for (crypto_int32_l = 0,crypto_int32_k = 1;crypto_int32_k < 32;++crypto_int32_l,crypto_int32_k *= 2) crypto_int32_x ^= (crypto_int32_x ^ (crypto_int32_x << crypto_int32_k)) & crypto_int32_bitinrangepublicpos_mask(crypto_int32_s,crypto_int32_l); #endif return crypto_int32_x; } __attribute__((unused)) static inline crypto_int32 crypto_int32_shrmod(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarl %%cl,%0" : "+r"(crypto_int32_x) : "c"(crypto_int32_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("asr %w0,%w0,%w1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int32_s &= 31; __asm__ ("asr %0,%0,%1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("sra %0,%1,%0" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); #else int crypto_int32_k, crypto_int32_l; for (crypto_int32_l = 0,crypto_int32_k = 1;crypto_int32_k < 32;++crypto_int32_l,crypto_int32_k *= 2) crypto_int32_x ^= (crypto_int32_x ^ (crypto_int32_x >> crypto_int32_k)) & crypto_int32_bitinrangepublicpos_mask(crypto_int32_s,crypto_int32_l); #endif return crypto_int32_x; } __attribute__((unused)) static inline crypto_int32 crypto_int32_bitmod_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) { crypto_int32_x = crypto_int32_shrmod(crypto_int32_x,crypto_int32_s); return crypto_int32_bottombit_mask(crypto_int32_x); } __attribute__((unused)) static inline crypto_int32 crypto_int32_bitmod_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) { crypto_int32_x = crypto_int32_shrmod(crypto_int32_x,crypto_int32_s); return crypto_int32_bottombit_01(crypto_int32_x); } __attribute__((unused)) static inline crypto_int32 crypto_int32_nonzero_mask(crypto_int32 crypto_int32_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $-1,%1\n testl %2,%2\n cmovnel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,0\n csetm %w0,ne" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("cmp %0,#0\n movne %0,#-1" : "+r"(crypto_int32_x) : : "cc"); return crypto_int32_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int32 crypto_int32_z; __asm__ ("cmp %%g0,%1\n subx %%g0,0,%0" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #else crypto_int32_x |= -crypto_int32_x; return crypto_int32_negative_mask(crypto_int32_x); #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_nonzero_01(crypto_int32 crypto_int32_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $1,%1\n testl %2,%2\n cmovnel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,0\n cset %w0,ne" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("cmp %0,#0\n movne %0,#1" : "+r"(crypto_int32_x) : : "cc"); return crypto_int32_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int32 crypto_int32_z; __asm__ ("cmp %%g0,%1\n addx %%g0,0,%0" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #else crypto_int32_x |= -crypto_int32_x; return crypto_int32_unsigned_topbit_01(crypto_int32_x); #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_positive_mask(crypto_int32 crypto_int32_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $-1,%1\n testl %2,%2\n cmovgl %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,0\n csetm %w0,gt" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int32 crypto_int32_z; __asm__ ("sra %1,31,%0\n sub %0,%1,%0\n sra %0,31,%0" : "=&r"(crypto_int32_z) : "r"(crypto_int32_x) : ); return crypto_int32_z; #else crypto_int32 crypto_int32_z = -crypto_int32_x; crypto_int32_z ^= crypto_int32_x & crypto_int32_z; return crypto_int32_negative_mask(crypto_int32_z); #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_positive_01(crypto_int32 crypto_int32_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $1,%1\n testl %2,%2\n cmovgl %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,0\n cset %w0,gt" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int32 crypto_int32_z; __asm__ ("sra %1,31,%0\n sub %0,%1,%0\n srl %0,31,%0" : "=&r"(crypto_int32_z) : "r"(crypto_int32_x) : ); return crypto_int32_z; #else crypto_int32 crypto_int32_z = -crypto_int32_x; crypto_int32_z ^= crypto_int32_x & crypto_int32_z; return crypto_int32_unsigned_topbit_01(crypto_int32_z); #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_zero_mask(crypto_int32 crypto_int32_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $-1,%1\n testl %2,%2\n cmovel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,0\n csetm %w0,eq" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int32 crypto_int32_z; __asm__ ("cmp %%g0,%1\n addx %%g0,-1,%0" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #else return ~crypto_int32_nonzero_mask(crypto_int32_x); #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_zero_01(crypto_int32 crypto_int32_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $1,%1\n testl %2,%2\n cmovel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,0\n cset %w0,eq" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int32 crypto_int32_z; __asm__ ("cmp %%g0,%1\n subx %%g0,-1,%0" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); return crypto_int32_z; #else return 1-crypto_int32_nonzero_01(crypto_int32_x); #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_unequal_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovnel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,%w2\n csetm %w0,ne" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #else return crypto_int32_nonzero_mask(crypto_int32_x ^ crypto_int32_y); #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_unequal_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovnel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,%w2\n cset %w0,ne" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #else return crypto_int32_nonzero_01(crypto_int32_x ^ crypto_int32_y); #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_equal_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,%w2\n csetm %w0,eq" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #else return crypto_int32_zero_mask(crypto_int32_x ^ crypto_int32_y); #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_equal_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,%w2\n cset %w0,eq" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #else return crypto_int32_zero_01(crypto_int32_x ^ crypto_int32_y); #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_min(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("cmpl %1,%0\n cmovgl %1,%0" : "+r"(crypto_int32_x) : "r"(crypto_int32_y) : "cc"); return crypto_int32_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("cmp %w0,%w1\n csel %w0,%w0,%w1,lt" : "+r"(crypto_int32_x) : "r"(crypto_int32_y) : "cc"); return crypto_int32_x; #else crypto_int32 crypto_int32_r = crypto_int32_y ^ crypto_int32_x; crypto_int32 crypto_int32_z = crypto_int32_y - crypto_int32_x; crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_y); crypto_int32_z = crypto_int32_negative_mask(crypto_int32_z); crypto_int32_z &= crypto_int32_r; return crypto_int32_x ^ crypto_int32_z; #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_max(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("cmpl %1,%0\n cmovll %1,%0" : "+r"(crypto_int32_x) : "r"(crypto_int32_y) : "cc"); return crypto_int32_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("cmp %w0,%w1\n csel %w0,%w1,%w0,lt" : "+r"(crypto_int32_x) : "r"(crypto_int32_y) : "cc"); return crypto_int32_x; #else crypto_int32 crypto_int32_r = crypto_int32_y ^ crypto_int32_x; crypto_int32 crypto_int32_z = crypto_int32_y - crypto_int32_x; crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_y); crypto_int32_z = crypto_int32_negative_mask(crypto_int32_z); crypto_int32_z &= crypto_int32_r; return crypto_int32_y ^ crypto_int32_z; #endif } __attribute__((unused)) static inline void crypto_int32_minmax(crypto_int32 *crypto_int32_p,crypto_int32 *crypto_int32_q) { crypto_int32 crypto_int32_x = *crypto_int32_p; crypto_int32 crypto_int32_y = *crypto_int32_q; #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_z; __asm__ ("cmpl %2,%1\n movl %1,%0\n cmovgl %2,%1\n cmovgl %0,%2" : "=&r"(crypto_int32_z), "+&r"(crypto_int32_x), "+r"(crypto_int32_y) : : "cc"); *crypto_int32_p = crypto_int32_x; *crypto_int32_q = crypto_int32_y; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_r, crypto_int32_s; __asm__ ("cmp %w2,%w3\n csel %w0,%w2,%w3,lt\n csel %w1,%w3,%w2,lt" : "=&r"(crypto_int32_r), "=r"(crypto_int32_s) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); *crypto_int32_p = crypto_int32_r; *crypto_int32_q = crypto_int32_s; #else crypto_int32 crypto_int32_r = crypto_int32_y ^ crypto_int32_x; crypto_int32 crypto_int32_z = crypto_int32_y - crypto_int32_x; crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_y); crypto_int32_z = crypto_int32_negative_mask(crypto_int32_z); crypto_int32_z &= crypto_int32_r; crypto_int32_x ^= crypto_int32_z; crypto_int32_y ^= crypto_int32_z; *crypto_int32_p = crypto_int32_x; *crypto_int32_q = crypto_int32_y; #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_smaller_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovll %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,%w2\n csetm %w0,lt" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #else crypto_int32 crypto_int32_r = crypto_int32_x ^ crypto_int32_y; crypto_int32 crypto_int32_z = crypto_int32_x - crypto_int32_y; crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_x); return crypto_int32_negative_mask(crypto_int32_z); #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_smaller_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovll %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,%w2\n cset %w0,lt" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #else crypto_int32 crypto_int32_r = crypto_int32_x ^ crypto_int32_y; crypto_int32 crypto_int32_z = crypto_int32_x - crypto_int32_y; crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_x); return crypto_int32_unsigned_topbit_01(crypto_int32_z); #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_leq_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovlel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,%w2\n csetm %w0,le" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #else return ~crypto_int32_smaller_mask(crypto_int32_y,crypto_int32_x); #endif } __attribute__((unused)) static inline crypto_int32 crypto_int32_leq_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 crypto_int32_q,crypto_int32_z; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovlel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int32 crypto_int32_z; __asm__ ("cmp %w1,%w2\n cset %w0,le" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); return crypto_int32_z; #else return 1-crypto_int32_smaller_01(crypto_int32_y,crypto_int32_x); #endif } __attribute__((unused)) static inline int crypto_int32_ones_num(crypto_int32 crypto_int32_x) { crypto_int32_unsigned crypto_int32_y = crypto_int32_x; const crypto_int32 C0 = 0x55555555; const crypto_int32 C1 = 0x33333333; const crypto_int32 C2 = 0x0f0f0f0f; crypto_int32_y -= ((crypto_int32_y >> 1) & C0); crypto_int32_y = (crypto_int32_y & C1) + ((crypto_int32_y >> 2) & C1); crypto_int32_y = (crypto_int32_y + (crypto_int32_y >> 4)) & C2; crypto_int32_y += crypto_int32_y >> 8; crypto_int32_y = (crypto_int32_y + (crypto_int32_y >> 16)) & 0xff; return crypto_int32_y; } __attribute__((unused)) static inline int crypto_int32_bottomzeros_num(crypto_int32 crypto_int32_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int32 fallback = 32; __asm__ ("bsfl %0,%0\n cmovel %1,%0" : "+&r"(crypto_int32_x) : "r"(fallback) : "cc"); return crypto_int32_x; #elif defined(__GNUC__) && defined(__aarch64__) int64_t crypto_int32_y; __asm__ ("rbit %w0,%w1\n clz %w0,%w0" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); return crypto_int32_y; #else crypto_int32 crypto_int32_y = crypto_int32_x ^ (crypto_int32_x-1); crypto_int32_y = ((crypto_int32) crypto_int32_y) >> 1; crypto_int32_y &= ~(crypto_int32_x & (((crypto_int32) 1) << (32-1))); return crypto_int32_ones_num(crypto_int32_y); #endif } #endif tinyssh-20250501/cryptoint/crypto_int64.h000066400000000000000000000715231500472222400202310ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #ifndef crypto_int64_h #define crypto_int64_h #include #define crypto_int64 int64_t #define crypto_int64_unsigned uint64_t #define crypto_int64_optblocker tinyssh_int64_optblocker extern volatile crypto_int64 crypto_int64_optblocker; __attribute__((unused)) static inline crypto_int64 crypto_int64_load(const unsigned char *crypto_int64_s) { crypto_int64 crypto_int64_z = 0; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 0; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 8; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 16; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 24; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 32; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 40; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 48; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 56; return crypto_int64_z; } __attribute__((unused)) static inline crypto_int64 crypto_int64_load_bigendian(const unsigned char *crypto_int64_s) { crypto_int64 crypto_int64_z = 0; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 56; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 48; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 40; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 32; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 24; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 16; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 8; crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 0; return crypto_int64_z; } __attribute__((unused)) static inline void crypto_int64_store(unsigned char *crypto_int64_s,crypto_int64 crypto_int64_x) { *crypto_int64_s++ = crypto_int64_x >> 0; *crypto_int64_s++ = crypto_int64_x >> 8; *crypto_int64_s++ = crypto_int64_x >> 16; *crypto_int64_s++ = crypto_int64_x >> 24; *crypto_int64_s++ = crypto_int64_x >> 32; *crypto_int64_s++ = crypto_int64_x >> 40; *crypto_int64_s++ = crypto_int64_x >> 48; *crypto_int64_s++ = crypto_int64_x >> 56; } __attribute__((unused)) static inline void crypto_int64_store_bigendian(unsigned char *crypto_int64_s,crypto_int64 crypto_int64_x) { *crypto_int64_s++ = crypto_int64_x >> 56; *crypto_int64_s++ = crypto_int64_x >> 48; *crypto_int64_s++ = crypto_int64_x >> 40; *crypto_int64_s++ = crypto_int64_x >> 32; *crypto_int64_s++ = crypto_int64_x >> 24; *crypto_int64_s++ = crypto_int64_x >> 16; *crypto_int64_s++ = crypto_int64_x >> 8; *crypto_int64_s++ = crypto_int64_x >> 0; } __attribute__((unused)) static inline crypto_int64 crypto_int64_negative_mask(crypto_int64 crypto_int64_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarq $63,%0" : "+r"(crypto_int64_x) : : "cc"); return crypto_int64_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_y; __asm__ ("asr %0,%1,63" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); return crypto_int64_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int64 crypto_int64_y; __asm__ ("asr %Q0,%R1,#31\n mov %R0,%Q0" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); return crypto_int64_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64 crypto_int64_y; __asm__ ("sra %H1,31,%L0\n mov %L0,%H0" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); return crypto_int64_y; #else crypto_int64_x >>= 64-6; crypto_int64_x += crypto_int64_optblocker; crypto_int64_x >>= 5; return crypto_int64_x; #endif } __attribute__((unused)) static inline crypto_int64_unsigned crypto_int64_unsigned_topbit_01(crypto_int64_unsigned crypto_int64_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrq $63,%0" : "+r"(crypto_int64_x) : : "cc"); return crypto_int64_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64_unsigned crypto_int64_y; __asm__ ("lsr %0,%1,63" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); return crypto_int64_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int64 crypto_int64_y; __asm__ ("lsr %Q0,%R1,#31\n mov %R0,#0" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); return crypto_int64_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64_unsigned crypto_int64_y; __asm__ ("srl %H1,31,%L0\n mov 0,%H0" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); return crypto_int64_y; #else crypto_int64_x >>= 64-6; crypto_int64_x += crypto_int64_optblocker; crypto_int64_x >>= 5; return crypto_int64_x; #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_negative_01(crypto_int64 crypto_int64_x) { return crypto_int64_unsigned_topbit_01(crypto_int64_x); } __attribute__((unused)) static inline crypto_int64 crypto_int64_topbit_mask(crypto_int64 crypto_int64_x) { return crypto_int64_negative_mask(crypto_int64_x); } __attribute__((unused)) static inline crypto_int64 crypto_int64_topbit_01(crypto_int64 crypto_int64_x) { return crypto_int64_unsigned_topbit_01(crypto_int64_x); } __attribute__((unused)) static inline crypto_int64 crypto_int64_bottombit_mask(crypto_int64 crypto_int64_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andq $1,%0" : "+r"(crypto_int64_x) : : "cc"); return -crypto_int64_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_y; __asm__ ("sbfx %0,%1,0,1" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); return crypto_int64_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int64 crypto_int64_y; __asm__ ("and %Q0,%Q1,#1\n neg %Q0,%Q0\n mov %R0,%Q0" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); return crypto_int64_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64 crypto_int64_y; __asm__ ("and %L1,1,%L0\n neg %L0,%L0\n mov %L0,%H0" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); return crypto_int64_y; #else crypto_int64_x &= 1 + crypto_int64_optblocker; return -crypto_int64_x; #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_bottombit_01(crypto_int64 crypto_int64_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andq $1,%0" : "+r"(crypto_int64_x) : : "cc"); return crypto_int64_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_y; __asm__ ("ubfx %0,%1,0,1" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); return crypto_int64_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int64 crypto_int64_y; __asm__ ("and %Q0,%Q1,#1\n mov %R0,#0" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); return crypto_int64_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64 crypto_int64_y; __asm__ ("and %L1,1,%L0\n mov 0,%H0" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); return crypto_int64_y; #else crypto_int64_x &= 1 + crypto_int64_optblocker; return crypto_int64_x; #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_bitinrangepublicpos_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarq %%cl,%0" : "+r"(crypto_int64_x) : "c"(crypto_int64_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("asr %0,%0,%1" : "+r"(crypto_int64_x) : "r"(crypto_int64_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %Q0,%Q0,#63\n lsr %Q1,%Q1,%Q0\n rsb %R0,%Q0,#32\n orr %Q1,%Q1,%R1,lsl %R0\n subs %R0,%Q0,#32\n orrhs %Q1,%Q1,%R1,asr %R0\n asr %R1,%R1,%Q0" : "+&r"(crypto_int64_s), "+r"(crypto_int64_x) : : "cc"); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64 crypto_int64_y, crypto_int64_z; __asm__ ("not %L0,%H0\n sll %L0,26,%H1\n sll %H3,1,%L1\n srl %L3,%L0,%L2\n sll %L1,%H0,%L1\n sra %H3,%L0,%H2\n sra %H1,31,%H1\n or %L2,%L1,%L2\n xor %L2,%H2,%L1\n and %H1,%L1,%L1\n sra %H2,%H1,%H3\n xor %L2,%L1,%L3" : "+&r"(crypto_int64_s), "=&r"(crypto_int64_z), "=&r"(crypto_int64_y), "+r"(crypto_int64_x) : : ); #else crypto_int64_x >>= crypto_int64_s ^ crypto_int64_optblocker; #endif return crypto_int64_bottombit_mask(crypto_int64_x); } __attribute__((unused)) static inline crypto_int64 crypto_int64_bitinrangepublicpos_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarq %%cl,%0" : "+r"(crypto_int64_x) : "c"(crypto_int64_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("asr %0,%0,%1" : "+r"(crypto_int64_x) : "r"(crypto_int64_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %Q0,%Q0,#63\n lsr %Q1,%Q1,%Q0\n rsb %R0,%Q0,#32\n orr %Q1,%Q1,%R1,lsl %R0\n subs %R0,%Q0,#32\n orrhs %Q1,%Q1,%R1,asr %R0\n asr %R1,%R1,%Q0" : "+&r"(crypto_int64_s), "+r"(crypto_int64_x) : : "cc"); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64 crypto_int64_y, crypto_int64_z; __asm__ ("not %L0,%H0\n sll %L0,26,%H1\n sll %H3,1,%L1\n srl %L3,%L0,%L2\n sll %L1,%H0,%L1\n sra %H3,%L0,%H2\n sra %H1,31,%H1\n or %L2,%L1,%L2\n xor %L2,%H2,%L1\n and %H1,%L1,%L1\n sra %H2,%H1,%H3\n xor %L2,%L1,%L3" : "+&r"(crypto_int64_s), "=&r"(crypto_int64_z), "=&r"(crypto_int64_y), "+r"(crypto_int64_x) : : ); #else crypto_int64_x >>= crypto_int64_s ^ crypto_int64_optblocker; #endif return crypto_int64_bottombit_01(crypto_int64_x); } __attribute__((unused)) static inline crypto_int64 crypto_int64_shlmod(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shlq %%cl,%0" : "+r"(crypto_int64_x) : "c"(crypto_int64_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("lsl %0,%0,%1" : "+r"(crypto_int64_x) : "r"(crypto_int64_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %Q0,%Q0,#63\n lsl %R1,%R1,%Q0\n sub %R0,%Q0,#32\n orr %R1,%R1,%Q1,lsl %R0\n rsb %R0,%Q0,#32\n orr %R1,%R1,%Q1,lsr %R0\n lsl %Q1,%Q1,%Q0" : "+&r"(crypto_int64_s), "+r"(crypto_int64_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64 crypto_int64_y, crypto_int64_z; __asm__ ("not %L0,%H0\n sll %L0,26,%H1\n srl %L3,1,%L1\n sll %L3,%L0,%L2\n srl %L1,%H0,%L1\n sll %H3,%L0,%H2\n sra %H1,31,%H1\n or %H2,%L1,%H2\n xor %L2,%H2,%L1\n and %H1,%L2,%L3\n and %H1,%L1,%L1\n xor %L3,%L2,%L3\n xor %H2,%L1,%H3" : "+&r"(crypto_int64_s), "=&r"(crypto_int64_z), "=&r"(crypto_int64_y), "+r"(crypto_int64_x) : : ); #else int crypto_int64_k, crypto_int64_l; for (crypto_int64_l = 0,crypto_int64_k = 1;crypto_int64_k < 64;++crypto_int64_l,crypto_int64_k *= 2) crypto_int64_x ^= (crypto_int64_x ^ (crypto_int64_x << crypto_int64_k)) & crypto_int64_bitinrangepublicpos_mask(crypto_int64_s,crypto_int64_l); #endif return crypto_int64_x; } __attribute__((unused)) static inline crypto_int64 crypto_int64_shrmod(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarq %%cl,%0" : "+r"(crypto_int64_x) : "c"(crypto_int64_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("asr %0,%0,%1" : "+r"(crypto_int64_x) : "r"(crypto_int64_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %Q0,%Q0,#63\n lsr %Q1,%Q1,%Q0\n rsb %R0,%Q0,#32\n orr %Q1,%Q1,%R1,lsl %R0\n subs %R0,%Q0,#32\n orrhs %Q1,%Q1,%R1,asr %R0\n asr %R1,%R1,%Q0" : "+&r"(crypto_int64_s), "+r"(crypto_int64_x) : : "cc"); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64 crypto_int64_y, crypto_int64_z; __asm__ ("not %L0,%H0\n sll %L0,26,%H1\n sll %H3,1,%L1\n srl %L3,%L0,%L2\n sll %L1,%H0,%L1\n sra %H3,%L0,%H2\n sra %H1,31,%H1\n or %L2,%L1,%L2\n xor %L2,%H2,%L1\n and %H1,%L1,%L1\n sra %H2,%H1,%H3\n xor %L2,%L1,%L3" : "+&r"(crypto_int64_s), "=&r"(crypto_int64_z), "=&r"(crypto_int64_y), "+r"(crypto_int64_x) : : ); #else int crypto_int64_k, crypto_int64_l; for (crypto_int64_l = 0,crypto_int64_k = 1;crypto_int64_k < 64;++crypto_int64_l,crypto_int64_k *= 2) crypto_int64_x ^= (crypto_int64_x ^ (crypto_int64_x >> crypto_int64_k)) & crypto_int64_bitinrangepublicpos_mask(crypto_int64_s,crypto_int64_l); #endif return crypto_int64_x; } __attribute__((unused)) static inline crypto_int64 crypto_int64_bitmod_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) { crypto_int64_x = crypto_int64_shrmod(crypto_int64_x,crypto_int64_s); return crypto_int64_bottombit_mask(crypto_int64_x); } __attribute__((unused)) static inline crypto_int64 crypto_int64_bitmod_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) { crypto_int64_x = crypto_int64_shrmod(crypto_int64_x,crypto_int64_s); return crypto_int64_bottombit_01(crypto_int64_x); } __attribute__((unused)) static inline crypto_int64 crypto_int64_nonzero_mask(crypto_int64 crypto_int64_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $-1,%1\n testq %2,%2\n cmovneq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,0\n csetm %0,ne" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("orrs %Q0,%Q0,%R0\n movne %Q0,#-1\n mov %R0,%Q0" : "+r"(crypto_int64_x) : : "cc"); return crypto_int64_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64 crypto_int64_z; __asm__ ("or %L1,%H1,%L0\n cmp %%g0,%L0\n subx %%g0,0,%L0\n mov %L0,%H0" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #else crypto_int64_x |= -crypto_int64_x; return crypto_int64_negative_mask(crypto_int64_x); #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_nonzero_01(crypto_int64 crypto_int64_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $1,%1\n testq %2,%2\n cmovneq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,0\n cset %0,ne" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("orrs %Q0,%Q0,%R0\n movne %Q0,#1\n mov %R0,#0" : "+r"(crypto_int64_x) : : "cc"); return crypto_int64_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64 crypto_int64_z; __asm__ ("or %L1,%H1,%L0\n cmp %%g0,%L0\n addx %%g0,0,%L0\n mov 0,%H0" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #else crypto_int64_x |= -crypto_int64_x; return crypto_int64_unsigned_topbit_01(crypto_int64_x); #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_positive_mask(crypto_int64 crypto_int64_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $-1,%1\n testq %2,%2\n cmovgq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,0\n csetm %0,gt" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64 crypto_int64_z; __asm__ ("sra %H1,31,%L0\n subcc %L0,%L1,%H0\n subx %L0,%H1,%H0\n sra %H0,31,%H0\n mov %H0,%L0" : "=&r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #else crypto_int64 crypto_int64_z = -crypto_int64_x; crypto_int64_z ^= crypto_int64_x & crypto_int64_z; return crypto_int64_negative_mask(crypto_int64_z); #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_positive_01(crypto_int64 crypto_int64_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $1,%1\n testq %2,%2\n cmovgq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,0\n cset %0,gt" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64 crypto_int64_z; __asm__ ("sra %H1,31,%H0\n subcc %H0,%L1,%L0\n subx %H0,%H1,%L0\n srl %L0,31,%L0\n mov 0,%H0" : "=&r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #else crypto_int64 crypto_int64_z = -crypto_int64_x; crypto_int64_z ^= crypto_int64_x & crypto_int64_z; return crypto_int64_unsigned_topbit_01(crypto_int64_z); #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_zero_mask(crypto_int64 crypto_int64_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $-1,%1\n testq %2,%2\n cmoveq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,0\n csetm %0,eq" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64 crypto_int64_z; __asm__ ("or %L1,%H1,%L0\n cmp %%g0,%L0\n addx %%g0,-1,%L0\n mov %L0,%H0" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #else return ~crypto_int64_nonzero_mask(crypto_int64_x); #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_zero_01(crypto_int64 crypto_int64_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $1,%1\n testq %2,%2\n cmoveq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,0\n cset %0,eq" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int64 crypto_int64_z; __asm__ ("or %L1,%H1,%L0\n cmp %%g0,%L0\n subx %%g0,-1,%L0\n mov 0,%H0" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); return crypto_int64_z; #else return 1-crypto_int64_nonzero_01(crypto_int64_x); #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_unequal_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmovneq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,%2\n csetm %0,ne" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #else return crypto_int64_nonzero_mask(crypto_int64_x ^ crypto_int64_y); #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_unequal_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmovneq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,%2\n cset %0,ne" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #else return crypto_int64_nonzero_01(crypto_int64_x ^ crypto_int64_y); #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_equal_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmoveq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,%2\n csetm %0,eq" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #else return crypto_int64_zero_mask(crypto_int64_x ^ crypto_int64_y); #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_equal_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmoveq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,%2\n cset %0,eq" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #else return crypto_int64_zero_01(crypto_int64_x ^ crypto_int64_y); #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_min(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("cmpq %1,%0\n cmovgq %1,%0" : "+r"(crypto_int64_x) : "r"(crypto_int64_y) : "cc"); return crypto_int64_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("cmp %0,%1\n csel %0,%0,%1,lt" : "+r"(crypto_int64_x) : "r"(crypto_int64_y) : "cc"); return crypto_int64_x; #else crypto_int64 crypto_int64_r = crypto_int64_y ^ crypto_int64_x; crypto_int64 crypto_int64_z = crypto_int64_y - crypto_int64_x; crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_y); crypto_int64_z = crypto_int64_negative_mask(crypto_int64_z); crypto_int64_z &= crypto_int64_r; return crypto_int64_x ^ crypto_int64_z; #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_max(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("cmpq %1,%0\n cmovlq %1,%0" : "+r"(crypto_int64_x) : "r"(crypto_int64_y) : "cc"); return crypto_int64_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("cmp %0,%1\n csel %0,%1,%0,lt" : "+r"(crypto_int64_x) : "r"(crypto_int64_y) : "cc"); return crypto_int64_x; #else crypto_int64 crypto_int64_r = crypto_int64_y ^ crypto_int64_x; crypto_int64 crypto_int64_z = crypto_int64_y - crypto_int64_x; crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_y); crypto_int64_z = crypto_int64_negative_mask(crypto_int64_z); crypto_int64_z &= crypto_int64_r; return crypto_int64_y ^ crypto_int64_z; #endif } __attribute__((unused)) static inline void crypto_int64_minmax(crypto_int64 *crypto_int64_p,crypto_int64 *crypto_int64_q) { crypto_int64 crypto_int64_x = *crypto_int64_p; crypto_int64 crypto_int64_y = *crypto_int64_q; #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_z; __asm__ ("cmpq %2,%1\n movq %1,%0\n cmovgq %2,%1\n cmovgq %0,%2" : "=&r"(crypto_int64_z), "+&r"(crypto_int64_x), "+r"(crypto_int64_y) : : "cc"); *crypto_int64_p = crypto_int64_x; *crypto_int64_q = crypto_int64_y; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_r, crypto_int64_s; __asm__ ("cmp %2,%3\n csel %0,%2,%3,lt\n csel %1,%3,%2,lt" : "=&r"(crypto_int64_r), "=r"(crypto_int64_s) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); *crypto_int64_p = crypto_int64_r; *crypto_int64_q = crypto_int64_s; #else crypto_int64 crypto_int64_r = crypto_int64_y ^ crypto_int64_x; crypto_int64 crypto_int64_z = crypto_int64_y - crypto_int64_x; crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_y); crypto_int64_z = crypto_int64_negative_mask(crypto_int64_z); crypto_int64_z &= crypto_int64_r; crypto_int64_x ^= crypto_int64_z; crypto_int64_y ^= crypto_int64_z; *crypto_int64_p = crypto_int64_x; *crypto_int64_q = crypto_int64_y; #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_smaller_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmovlq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,%2\n csetm %0,lt" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #else crypto_int64 crypto_int64_r = crypto_int64_x ^ crypto_int64_y; crypto_int64 crypto_int64_z = crypto_int64_x - crypto_int64_y; crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_x); return crypto_int64_negative_mask(crypto_int64_z); #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_smaller_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmovlq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,%2\n cset %0,lt" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #else crypto_int64 crypto_int64_r = crypto_int64_x ^ crypto_int64_y; crypto_int64 crypto_int64_z = crypto_int64_x - crypto_int64_y; crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_x); return crypto_int64_unsigned_topbit_01(crypto_int64_z); #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_leq_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmovleq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,%2\n csetm %0,le" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #else return ~crypto_int64_smaller_mask(crypto_int64_y,crypto_int64_x); #endif } __attribute__((unused)) static inline crypto_int64 crypto_int64_leq_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 crypto_int64_q,crypto_int64_z; __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmovleq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int64 crypto_int64_z; __asm__ ("cmp %1,%2\n cset %0,le" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); return crypto_int64_z; #else return 1-crypto_int64_smaller_01(crypto_int64_y,crypto_int64_x); #endif } __attribute__((unused)) static inline int crypto_int64_ones_num(crypto_int64 crypto_int64_x) { crypto_int64_unsigned crypto_int64_y = crypto_int64_x; const crypto_int64 C0 = 0x5555555555555555; const crypto_int64 C1 = 0x3333333333333333; const crypto_int64 C2 = 0x0f0f0f0f0f0f0f0f; crypto_int64_y -= ((crypto_int64_y >> 1) & C0); crypto_int64_y = (crypto_int64_y & C1) + ((crypto_int64_y >> 2) & C1); crypto_int64_y = (crypto_int64_y + (crypto_int64_y >> 4)) & C2; crypto_int64_y += crypto_int64_y >> 8; crypto_int64_y += crypto_int64_y >> 16; crypto_int64_y = (crypto_int64_y + (crypto_int64_y >> 32)) & 0xff; return crypto_int64_y; } __attribute__((unused)) static inline int crypto_int64_bottomzeros_num(crypto_int64 crypto_int64_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int64 fallback = 64; __asm__ ("bsfq %0,%0\n cmoveq %1,%0" : "+&r"(crypto_int64_x) : "r"(fallback) : "cc"); return crypto_int64_x; #elif defined(__GNUC__) && defined(__aarch64__) int64_t crypto_int64_y; __asm__ ("rbit %0,%1\n clz %0,%0" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); return crypto_int64_y; #else crypto_int64 crypto_int64_y = crypto_int64_x ^ (crypto_int64_x-1); crypto_int64_y = ((crypto_int64) crypto_int64_y) >> 1; crypto_int64_y &= ~(crypto_int64_x & (((crypto_int64) 1) << (64-1))); return crypto_int64_ones_num(crypto_int64_y); #endif } #endif tinyssh-20250501/cryptoint/crypto_int8.h000066400000000000000000000666311500472222400201530ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #ifndef crypto_int8_h #define crypto_int8_h #include #define crypto_int8 int8_t #define crypto_int8_unsigned uint8_t #define crypto_int8_optblocker tinyssh_int8_optblocker extern volatile crypto_int8 crypto_int8_optblocker; __attribute__((unused)) static inline crypto_int8 crypto_int8_load(const unsigned char *crypto_int8_s) { crypto_int8 crypto_int8_z = 0; crypto_int8_z |= ((crypto_int8) (*crypto_int8_s++)) << 0; return crypto_int8_z; } __attribute__((unused)) static inline crypto_int8 crypto_int8_load_bigendian(const unsigned char *crypto_int8_s) { crypto_int8 crypto_int8_z = 0; crypto_int8_z |= ((crypto_int8) (*crypto_int8_s++)) << 0; return crypto_int8_z; } __attribute__((unused)) static inline void crypto_int8_store(unsigned char *crypto_int8_s,crypto_int8 crypto_int8_x) { *crypto_int8_s++ = crypto_int8_x >> 0; } __attribute__((unused)) static inline void crypto_int8_store_bigendian(unsigned char *crypto_int8_s,crypto_int8 crypto_int8_x) { *crypto_int8_s++ = crypto_int8_x >> 0; } __attribute__((unused)) static inline crypto_int8 crypto_int8_negative_mask(crypto_int8 crypto_int8_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarb $7,%0" : "+r"(crypto_int8_x) : : "cc"); return crypto_int8_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_y; __asm__ ("sbfx %w0,%w1,7,1" : "=r"(crypto_int8_y) : "r"(crypto_int8_x) : ); return crypto_int8_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int8 crypto_int8_y; __asm__ ("sxtb %0,%1\n asr %0,%0,#31" : "=r"(crypto_int8_y) : "r"(crypto_int8_x) : ); return crypto_int8_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int8 crypto_int8_y; __asm__ ("sll %1,24,%0\n sra %0,31,%0" : "=r"(crypto_int8_y) : "r"(crypto_int8_x) : ); return crypto_int8_y; #else crypto_int8_x >>= 8-6; crypto_int8_x += crypto_int8_optblocker; crypto_int8_x >>= 5; return crypto_int8_x; #endif } __attribute__((unused)) static inline crypto_int8_unsigned crypto_int8_unsigned_topbit_01(crypto_int8_unsigned crypto_int8_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrb $7,%0" : "+r"(crypto_int8_x) : : "cc"); return crypto_int8_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8_unsigned crypto_int8_y; __asm__ ("ubfx %w0,%w1,7,1" : "=r"(crypto_int8_y) : "r"(crypto_int8_x) : ); return crypto_int8_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int8 crypto_int8_y; __asm__ ("uxtb %0,%1\n lsr %0,%0,#7" : "=r"(crypto_int8_y) : "r"(crypto_int8_x) : ); return crypto_int8_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int8_unsigned crypto_int8_y; __asm__ ("and %1,255,%0\n srl %0,7,%0" : "=r"(crypto_int8_y) : "r"(crypto_int8_x) : ); return crypto_int8_y; #else crypto_int8_x >>= 8-6; crypto_int8_x += crypto_int8_optblocker; crypto_int8_x >>= 5; return crypto_int8_x; #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_negative_01(crypto_int8 crypto_int8_x) { return crypto_int8_unsigned_topbit_01(crypto_int8_x); } __attribute__((unused)) static inline crypto_int8 crypto_int8_topbit_mask(crypto_int8 crypto_int8_x) { return crypto_int8_negative_mask(crypto_int8_x); } __attribute__((unused)) static inline crypto_int8 crypto_int8_topbit_01(crypto_int8 crypto_int8_x) { return crypto_int8_unsigned_topbit_01(crypto_int8_x); } __attribute__((unused)) static inline crypto_int8 crypto_int8_bottombit_mask(crypto_int8 crypto_int8_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andb $1,%0" : "+r"(crypto_int8_x) : : "cc"); return -crypto_int8_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_y; __asm__ ("sbfx %w0,%w1,0,1" : "=r"(crypto_int8_y) : "r"(crypto_int8_x) : ); return crypto_int8_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int8 crypto_int8_y; __asm__ ("and %0,%1,#1\n neg %0,%0" : "=r"(crypto_int8_y) : "r"(crypto_int8_x) : ); return crypto_int8_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int8 crypto_int8_y; __asm__ ("and %1,1,%0\n neg %0,%0" : "=r"(crypto_int8_y) : "r"(crypto_int8_x) : ); return crypto_int8_y; #else crypto_int8_x &= 1 + crypto_int8_optblocker; return -crypto_int8_x; #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_bottombit_01(crypto_int8 crypto_int8_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andb $1,%0" : "+r"(crypto_int8_x) : : "cc"); return crypto_int8_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_y; __asm__ ("ubfx %w0,%w1,0,1" : "=r"(crypto_int8_y) : "r"(crypto_int8_x) : ); return crypto_int8_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int8 crypto_int8_y; __asm__ ("and %0,%1,#1" : "=r"(crypto_int8_y) : "r"(crypto_int8_x) : ); return crypto_int8_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int8 crypto_int8_y; __asm__ ("and %1,1,%0" : "=r"(crypto_int8_y) : "r"(crypto_int8_x) : ); return crypto_int8_y; #else crypto_int8_x &= 1 + crypto_int8_optblocker; return crypto_int8_x; #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_bitinrangepublicpos_mask(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarb %%cl,%0" : "+r"(crypto_int8_x) : "c"(crypto_int8_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("sxtb %w0,%w0\n asr %w0,%w0,%w1" : "+&r"(crypto_int8_x) : "r"(crypto_int8_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %0,%0,#7\n sxtb %1,%1\n asr %1,%1,%0" : "+&r"(crypto_int8_s), "+r"(crypto_int8_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("and %0,7,%0\n sra %1,%0,%1" : "+&r"(crypto_int8_s), "+r"(crypto_int8_x) : : ); #else crypto_int8_x >>= crypto_int8_s ^ crypto_int8_optblocker; #endif return crypto_int8_bottombit_mask(crypto_int8_x); } __attribute__((unused)) static inline crypto_int8 crypto_int8_bitinrangepublicpos_01(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarb %%cl,%0" : "+r"(crypto_int8_x) : "c"(crypto_int8_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("sxtb %w0,%w0\n asr %w0,%w0,%w1" : "+&r"(crypto_int8_x) : "r"(crypto_int8_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %0,%0,#7\n sxtb %1,%1\n asr %1,%1,%0" : "+&r"(crypto_int8_s), "+r"(crypto_int8_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("and %0,7,%0\n sra %1,%0,%1" : "+&r"(crypto_int8_s), "+r"(crypto_int8_x) : : ); #else crypto_int8_x >>= crypto_int8_s ^ crypto_int8_optblocker; #endif return crypto_int8_bottombit_01(crypto_int8_x); } __attribute__((unused)) static inline crypto_int8 crypto_int8_shlmod(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_s) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8_s &= 7; __asm__ ("shlb %%cl,%0" : "+r"(crypto_int8_x) : "c"(crypto_int8_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8_s &= 7; __asm__ ("and %w0,%w0,255\n lsl %w0,%w0,%w1" : "+&r"(crypto_int8_x) : "r"(crypto_int8_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int8_s &= 7; __asm__ ("lsl %0,%0,%1\n sxtb %0,%0" : "+r"(crypto_int8_x) : "r"(crypto_int8_s) : ); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int8_s &= 7; crypto_int8_s += 24; __asm__ ("sll %0,%1,%0\n sra %0,24,%0" : "+r"(crypto_int8_x) : "r"(crypto_int8_s) : ); #else int crypto_int8_k, crypto_int8_l; for (crypto_int8_l = 0,crypto_int8_k = 1;crypto_int8_k < 8;++crypto_int8_l,crypto_int8_k *= 2) crypto_int8_x ^= (crypto_int8_x ^ (crypto_int8_x << crypto_int8_k)) & crypto_int8_bitinrangepublicpos_mask(crypto_int8_s,crypto_int8_l); #endif return crypto_int8_x; } __attribute__((unused)) static inline crypto_int8 crypto_int8_shrmod(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_s) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8_s &= 7; __asm__ ("sarb %%cl,%0" : "+r"(crypto_int8_x) : "c"(crypto_int8_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8_s &= 7; __asm__ ("sxtb %w0,%w0\n asr %w0,%w0,%w1" : "+&r"(crypto_int8_x) : "r"(crypto_int8_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_int8_s &= 7; __asm__ ("sxtb %0,%0\n asr %0,%0,%1" : "+&r"(crypto_int8_x) : "r"(crypto_int8_s) : ); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int8_s &= 7; __asm__ ("sra %0,%1,%0" : "+r"(crypto_int8_x) : "r"(crypto_int8_s) : ); #else int crypto_int8_k, crypto_int8_l; for (crypto_int8_l = 0,crypto_int8_k = 1;crypto_int8_k < 8;++crypto_int8_l,crypto_int8_k *= 2) crypto_int8_x ^= (crypto_int8_x ^ (crypto_int8_x >> crypto_int8_k)) & crypto_int8_bitinrangepublicpos_mask(crypto_int8_s,crypto_int8_l); #endif return crypto_int8_x; } __attribute__((unused)) static inline crypto_int8 crypto_int8_bitmod_mask(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_s) { crypto_int8_x = crypto_int8_shrmod(crypto_int8_x,crypto_int8_s); return crypto_int8_bottombit_mask(crypto_int8_x); } __attribute__((unused)) static inline crypto_int8 crypto_int8_bitmod_01(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_s) { crypto_int8_x = crypto_int8_shrmod(crypto_int8_x,crypto_int8_s); return crypto_int8_bottombit_01(crypto_int8_x); } __attribute__((unused)) static inline crypto_int8 crypto_int8_nonzero_mask(crypto_int8 crypto_int8_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $-1,%1\n testb %b2,%b2\n cmovnel %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("tst %w1,255\n csetm %w0,ne" : "=r"(crypto_int8_z) : "r"(crypto_int8_x) : "cc"); return crypto_int8_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("uxtb %0,%0\n cmp %0,#0\n movne %0,#-1" : "+r"(crypto_int8_x) : : "cc"); return crypto_int8_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int8 crypto_int8_z; __asm__ ("and %0,255,%0\n cmp %%g0,%0\n subx %%g0,0,%1" : "+r"(crypto_int8_x), "=r"(crypto_int8_z) : : "cc"); return crypto_int8_z; #else crypto_int8_x |= -crypto_int8_x; return crypto_int8_negative_mask(crypto_int8_x); #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_nonzero_01(crypto_int8 crypto_int8_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $1,%1\n testb %b2,%b2\n cmovnel %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("tst %w1,255\n cset %w0,ne" : "=r"(crypto_int8_z) : "r"(crypto_int8_x) : "cc"); return crypto_int8_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("uxtb %0,%0\n cmp %0,#0\n movne %0,#1" : "+r"(crypto_int8_x) : : "cc"); return crypto_int8_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int8 crypto_int8_z; __asm__ ("and %0,255,%0\n cmp %%g0,%0\n addx %%g0,0,%1" : "+r"(crypto_int8_x), "=r"(crypto_int8_z) : : "cc"); return crypto_int8_z; #else crypto_int8_x |= -crypto_int8_x; return crypto_int8_unsigned_topbit_01(crypto_int8_x); #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_positive_mask(crypto_int8 crypto_int8_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $-1,%1\n testb %b2,%b2\n cmovgl %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("sxtb %w0,%w1\n cmp %w0,0\n csetm %w0,gt" : "=r"(crypto_int8_z) : "r"(crypto_int8_x) : "cc"); return crypto_int8_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int8 crypto_int8_z; __asm__ ("sll %1,24,%0\n sra %0,31,%0\n sub %0,%1,%0\n sra %0,31,%0" : "=&r"(crypto_int8_z) : "r"(crypto_int8_x) : ); return crypto_int8_z; #else crypto_int8 crypto_int8_z = -crypto_int8_x; crypto_int8_z ^= crypto_int8_x & crypto_int8_z; return crypto_int8_negative_mask(crypto_int8_z); #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_positive_01(crypto_int8 crypto_int8_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $1,%1\n testb %b2,%b2\n cmovgl %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("sxtb %w0,%w1\n cmp %w0,0\n cset %w0,gt" : "=r"(crypto_int8_z) : "r"(crypto_int8_x) : "cc"); return crypto_int8_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int8 crypto_int8_z; __asm__ ("sll %1,24,%0\n sra %0,31,%0\n sub %0,%1,%0\n srl %0,31,%0" : "=&r"(crypto_int8_z) : "r"(crypto_int8_x) : ); return crypto_int8_z; #else crypto_int8 crypto_int8_z = -crypto_int8_x; crypto_int8_z ^= crypto_int8_x & crypto_int8_z; return crypto_int8_unsigned_topbit_01(crypto_int8_z); #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_zero_mask(crypto_int8 crypto_int8_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $-1,%1\n testb %b2,%b2\n cmovel %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("tst %w1,255\n csetm %w0,eq" : "=r"(crypto_int8_z) : "r"(crypto_int8_x) : "cc"); return crypto_int8_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int8 crypto_int8_z; __asm__ ("and %0,255,%0\n cmp %%g0,%0\n addx %%g0,-1,%1" : "+r"(crypto_int8_x), "=r"(crypto_int8_z) : : "cc"); return crypto_int8_z; #else return ~crypto_int8_nonzero_mask(crypto_int8_x); #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_zero_01(crypto_int8 crypto_int8_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $1,%1\n testb %b2,%b2\n cmovel %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("tst %w1,255\n cset %w0,eq" : "=r"(crypto_int8_z) : "r"(crypto_int8_x) : "cc"); return crypto_int8_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_int8 crypto_int8_z; __asm__ ("and %0,255,%0\n cmp %%g0,%0\n subx %%g0,-1,%1" : "+r"(crypto_int8_x), "=r"(crypto_int8_z) : : "cc"); return crypto_int8_z; #else return 1-crypto_int8_nonzero_01(crypto_int8_x); #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_unequal_mask(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_y32 = crypto_int8_y,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpb %b3,%b2\n cmovnel %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32), "q"(crypto_int8_y32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("and %w0,%w1,255\n cmp %w0,%w2,uxtb\n csetm %w0,ne" : "=&r"(crypto_int8_z) : "r"(crypto_int8_x), "r"(crypto_int8_y) : "cc"); return crypto_int8_z; #else return crypto_int8_nonzero_mask(crypto_int8_x ^ crypto_int8_y); #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_unequal_01(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_y32 = crypto_int8_y,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpb %b3,%b2\n cmovnel %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32), "q"(crypto_int8_y32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("and %w0,%w1,255\n cmp %w0,%w2,uxtb\n cset %w0,ne" : "=&r"(crypto_int8_z) : "r"(crypto_int8_x), "r"(crypto_int8_y) : "cc"); return crypto_int8_z; #else return crypto_int8_nonzero_01(crypto_int8_x ^ crypto_int8_y); #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_equal_mask(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_y32 = crypto_int8_y,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpb %b3,%b2\n cmovel %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32), "q"(crypto_int8_y32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("and %w0,%w1,255\n cmp %w0,%w2,uxtb\n csetm %w0,eq" : "=&r"(crypto_int8_z) : "r"(crypto_int8_x), "r"(crypto_int8_y) : "cc"); return crypto_int8_z; #else return crypto_int8_zero_mask(crypto_int8_x ^ crypto_int8_y); #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_equal_01(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_y32 = crypto_int8_y,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpb %b3,%b2\n cmovel %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32), "q"(crypto_int8_y32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("and %w0,%w1,255\n cmp %w0,%w2,uxtb\n cset %w0,eq" : "=&r"(crypto_int8_z) : "r"(crypto_int8_x), "r"(crypto_int8_y) : "cc"); return crypto_int8_z; #else return crypto_int8_zero_01(crypto_int8_x ^ crypto_int8_y); #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_min(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_y) { #if defined(__GNUC__) && defined(__x86_64__) int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_y32 = crypto_int8_y; __asm__ ("cmpb %b1,%b0\n cmovgl %1,%0" : "+q"(crypto_int8_x32) : "q"(crypto_int8_y32) : "cc"); crypto_int8_x = crypto_int8_x32; return crypto_int8_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("sxtb %w0,%w0\n cmp %w0,%w1,sxtb\n csel %w0,%w0,%w1,lt" : "+&r"(crypto_int8_x) : "r"(crypto_int8_y) : "cc"); return crypto_int8_x; #else crypto_int8 crypto_int8_r = crypto_int8_y ^ crypto_int8_x; crypto_int8 crypto_int8_z = crypto_int8_y - crypto_int8_x; crypto_int8_z ^= crypto_int8_r & (crypto_int8_z ^ crypto_int8_y); crypto_int8_z = crypto_int8_negative_mask(crypto_int8_z); crypto_int8_z &= crypto_int8_r; return crypto_int8_x ^ crypto_int8_z; #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_max(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_y) { #if defined(__GNUC__) && defined(__x86_64__) int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_y32 = crypto_int8_y; __asm__ ("cmpb %b1,%b0\n cmovll %1,%0" : "+q"(crypto_int8_x32) : "q"(crypto_int8_y32) : "cc"); crypto_int8_x = crypto_int8_x32; return crypto_int8_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("sxtb %w0,%w0\n cmp %w0,%w1,sxtb\n csel %w0,%w1,%w0,lt" : "+&r"(crypto_int8_x) : "r"(crypto_int8_y) : "cc"); return crypto_int8_x; #else crypto_int8 crypto_int8_r = crypto_int8_y ^ crypto_int8_x; crypto_int8 crypto_int8_z = crypto_int8_y - crypto_int8_x; crypto_int8_z ^= crypto_int8_r & (crypto_int8_z ^ crypto_int8_y); crypto_int8_z = crypto_int8_negative_mask(crypto_int8_z); crypto_int8_z &= crypto_int8_r; return crypto_int8_y ^ crypto_int8_z; #endif } __attribute__((unused)) static inline void crypto_int8_minmax(crypto_int8 *crypto_int8_p,crypto_int8 *crypto_int8_q) { crypto_int8 crypto_int8_x = *crypto_int8_p; crypto_int8 crypto_int8_y = *crypto_int8_q; #if defined(__GNUC__) && defined(__x86_64__) int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_y32 = crypto_int8_y,crypto_int8_z32; __asm__ ("cmpb %b2,%b1\n movl %1,%0\n cmovgl %2,%1\n cmovgl %0,%2" : "=&r"(crypto_int8_z32), "+&q"(crypto_int8_x32), "+q"(crypto_int8_y32) : : "cc"); crypto_int8_x = crypto_int8_x32; crypto_int8_y = crypto_int8_y32; *crypto_int8_p = crypto_int8_x; *crypto_int8_q = crypto_int8_y; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_r, crypto_int8_s; __asm__ ("sxtb %w0,%w0\n cmp %w0,%w3,sxtb\n csel %w1,%w0,%w3,lt\n csel %w2,%w3,%w0,lt" : "+&r"(crypto_int8_x), "=&r"(crypto_int8_r), "=r"(crypto_int8_s) : "r"(crypto_int8_y) : "cc"); *crypto_int8_p = crypto_int8_r; *crypto_int8_q = crypto_int8_s; #else crypto_int8 crypto_int8_r = crypto_int8_y ^ crypto_int8_x; crypto_int8 crypto_int8_z = crypto_int8_y - crypto_int8_x; crypto_int8_z ^= crypto_int8_r & (crypto_int8_z ^ crypto_int8_y); crypto_int8_z = crypto_int8_negative_mask(crypto_int8_z); crypto_int8_z &= crypto_int8_r; crypto_int8_x ^= crypto_int8_z; crypto_int8_y ^= crypto_int8_z; *crypto_int8_p = crypto_int8_x; *crypto_int8_q = crypto_int8_y; #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_smaller_mask(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_y32 = crypto_int8_y,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpb %b3,%b2\n cmovll %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32), "q"(crypto_int8_y32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("sxtb %w0,%w1\n cmp %w0,%w2,sxtb\n csetm %w0,lt" : "=&r"(crypto_int8_z) : "r"(crypto_int8_x), "r"(crypto_int8_y) : "cc"); return crypto_int8_z; #else crypto_int8 crypto_int8_r = crypto_int8_x ^ crypto_int8_y; crypto_int8 crypto_int8_z = crypto_int8_x - crypto_int8_y; crypto_int8_z ^= crypto_int8_r & (crypto_int8_z ^ crypto_int8_x); return crypto_int8_negative_mask(crypto_int8_z); #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_smaller_01(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_y32 = crypto_int8_y,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpb %b3,%b2\n cmovll %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32), "q"(crypto_int8_y32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("sxtb %w0,%w1\n cmp %w0,%w2,sxtb\n cset %w0,lt" : "=&r"(crypto_int8_z) : "r"(crypto_int8_x), "r"(crypto_int8_y) : "cc"); return crypto_int8_z; #else crypto_int8 crypto_int8_r = crypto_int8_x ^ crypto_int8_y; crypto_int8 crypto_int8_z = crypto_int8_x - crypto_int8_y; crypto_int8_z ^= crypto_int8_r & (crypto_int8_z ^ crypto_int8_x); return crypto_int8_unsigned_topbit_01(crypto_int8_z); #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_leq_mask(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_y32 = crypto_int8_y,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpb %b3,%b2\n cmovlel %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32), "q"(crypto_int8_y32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("sxtb %w0,%w1\n cmp %w0,%w2,sxtb\n csetm %w0,le" : "=&r"(crypto_int8_z) : "r"(crypto_int8_x), "r"(crypto_int8_y) : "cc"); return crypto_int8_z; #else return ~crypto_int8_smaller_mask(crypto_int8_y,crypto_int8_x); #endif } __attribute__((unused)) static inline crypto_int8 crypto_int8_leq_01(crypto_int8 crypto_int8_x,crypto_int8 crypto_int8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_int8 crypto_int8_z; int32_t crypto_int8_x32 = crypto_int8_x,crypto_int8_y32 = crypto_int8_y,crypto_int8_q32,crypto_int8_z32; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpb %b3,%b2\n cmovlel %1,%0" : "=&r"(crypto_int8_z32), "=&r"(crypto_int8_q32) : "q"(crypto_int8_x32), "q"(crypto_int8_y32) : "cc"); crypto_int8_z = crypto_int8_z32; return crypto_int8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_int8 crypto_int8_z; __asm__ ("sxtb %w0,%w1\n cmp %w0,%w2,sxtb\n cset %w0,le" : "=&r"(crypto_int8_z) : "r"(crypto_int8_x), "r"(crypto_int8_y) : "cc"); return crypto_int8_z; #else return 1-crypto_int8_smaller_01(crypto_int8_y,crypto_int8_x); #endif } __attribute__((unused)) static inline int crypto_int8_ones_num(crypto_int8 crypto_int8_x) { crypto_int8_unsigned crypto_int8_y = crypto_int8_x; const crypto_int8 C0 = 0x55; const crypto_int8 C1 = 0x33; const crypto_int8 C2 = 0x0f; crypto_int8_y -= ((crypto_int8_y >> 1) & C0); crypto_int8_y = (crypto_int8_y & C1) + ((crypto_int8_y >> 2) & C1); crypto_int8_y = (crypto_int8_y + (crypto_int8_y >> 4)) & C2; return crypto_int8_y; } __attribute__((unused)) static inline int crypto_int8_bottomzeros_num(crypto_int8 crypto_int8_x) { #if defined(__GNUC__) && defined(__x86_64__) int32_t fallback = 8; int32_t crypto_int8_x32 = crypto_int8_x; __asm__ ("bsfl %0,%0\n cmovel %1,%0" : "+&r"(crypto_int8_x32) : "r"(fallback) : "cc"); crypto_int8_x = crypto_int8_x32; return crypto_int8_x; #elif defined(__GNUC__) && defined(__aarch64__) int64_t crypto_int8_y; __asm__ ("orr %w0,%w1,-256\n rbit %w0,%w0\n clz %w0,%w0" : "=r"(crypto_int8_y) : "r"(crypto_int8_x) : ); return crypto_int8_y; #else crypto_int8 crypto_int8_y = crypto_int8_x ^ (crypto_int8_x-1); crypto_int8_y = ((crypto_int8) crypto_int8_y) >> 1; crypto_int8_y &= ~(crypto_int8_x & (((crypto_int8) 1) << (8-1))); return crypto_int8_ones_num(crypto_int8_y); #endif } #endif tinyssh-20250501/cryptoint/crypto_intN.h000066400000000000000000002063601500472222400201740ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #ifndef crypto_intN_h #define crypto_intN_h #include #define crypto_intN intN_t #define crypto_intN_unsigned uintN_t #define crypto_intN_optblocker namespace_intN_optblocker extern volatile crypto_intN crypto_intN_optblocker; __attribute__((unused)) static inline crypto_intN crypto_intN_load(const unsigned char *crypto_intN_s) { crypto_intN crypto_intN_z = 0; int crypto_intN_k; for (crypto_intN_k = 0;crypto_intN_k < N;crypto_intN_k += 8) crypto_intN_z |= ((crypto_intN) (*crypto_intN_s++)) << crypto_intN_k; return crypto_intN_z; } __attribute__((unused)) static inline crypto_intN crypto_intN_load_bigendian(const unsigned char *crypto_intN_s) { crypto_intN crypto_intN_z = 0; int crypto_intN_k; for (crypto_intN_k = N - 8;crypto_intN_k >= 0;crypto_intN_k -= 8) crypto_intN_z |= ((crypto_intN) (*crypto_intN_s++)) << crypto_intN_k; return crypto_intN_z; } __attribute__((unused)) static inline void crypto_intN_store(unsigned char *crypto_intN_s,crypto_intN crypto_intN_x) { int crypto_intN_k; for (crypto_intN_k = 0;crypto_intN_k < N;crypto_intN_k += 8) *crypto_intN_s++ = crypto_intN_x >> crypto_intN_k; } __attribute__((unused)) static inline void crypto_intN_store_bigendian(unsigned char *crypto_intN_s,crypto_intN crypto_intN_x) { int crypto_intN_k; for (crypto_intN_k = N - 8;crypto_intN_k >= 0;crypto_intN_k -= 8) *crypto_intN_s++ = crypto_intN_x >> crypto_intN_k; } __attribute__((unused)) static inline crypto_intN crypto_intN_negative_mask(crypto_intN crypto_intN_x) { #if amd64 8: readasm("amd64; int8 crypto_intN_x; crypto_intN_x signed>>= 7"); 16: readasm("amd64; int16 crypto_intN_x; crypto_intN_x signed>>= 15"); 32: readasm("amd64; int32 crypto_intN_x; crypto_intN_x signed>>= 31"); 64: readasm("amd64; int64 crypto_intN_x; crypto_intN_x signed>>= 63"); return crypto_intN_x; #elif arm64 crypto_intN crypto_intN_y; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y; crypto_intN_y = -(1 & (crypto_intN_x unsigned>> 7))"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y; crypto_intN_y = -(1 & (crypto_intN_x unsigned>> 15))"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x signed>> 31"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x signed>> 63"); return crypto_intN_y; #elif arm32 crypto_intN crypto_intN_y; 8: readasm("arm32; int8 crypto_intN_x crypto_intN_y; crypto_intN_y = (int8) crypto_intN_x; crypto_intN_y = crypto_intN_y signed>> 31"); 16: readasm("arm32; int16 crypto_intN_x crypto_intN_y; crypto_intN_y = (int16) crypto_intN_x; crypto_intN_y = crypto_intN_y signed>> 31"); 32: readasm("arm32; int32 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x signed>> 31"); 64: readasm("arm32; int64 crypto_intN_x crypto_intN_y; crypto_intN_y.lo = crypto_intN_x.hi signed>> 31; crypto_intN_y.hi = crypto_intN_y.lo"); return crypto_intN_y; #elif sparc32 crypto_intN crypto_intN_y; 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x << 24; crypto_intN_y = crypto_intN_y signed>> 31"); 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x << 16; crypto_intN_y = crypto_intN_y signed>> 31"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x signed>> 31"); 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_y; crypto_intN_y.lo = crypto_intN_x.hi signed>> 31; crypto_intN_y.hi = crypto_intN_y.lo"); return crypto_intN_y; #else crypto_intN_x >>= N-6; crypto_intN_x += crypto_intN_optblocker; crypto_intN_x >>= 5; return crypto_intN_x; #endif } __attribute__((unused)) static inline crypto_intN_unsigned crypto_intN_unsigned_topbit_01(crypto_intN_unsigned crypto_intN_x) { #if amd64 8: readasm("amd64; int8 crypto_intN_x; crypto_intN_x unsigned>>= 7"); 16: readasm("amd64; int16 crypto_intN_x; crypto_intN_x unsigned>>= 15"); 32: readasm("amd64; int32 crypto_intN_x; crypto_intN_x unsigned>>= 31"); 64: readasm("amd64; int64 crypto_intN_x; crypto_intN_x unsigned>>= 63"); return crypto_intN_x; #elif arm64 crypto_intN_unsigned crypto_intN_y; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y; crypto_intN_y = 1 & (crypto_intN_x unsigned>> 7)"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y; crypto_intN_y = 1 & (crypto_intN_x unsigned>> 15)"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x unsigned>> 31"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x unsigned>> 63"); return crypto_intN_y; #elif arm32 crypto_intN crypto_intN_y; 8: readasm("arm32; int8 crypto_intN_x crypto_intN_y; crypto_intN_y = (uint8) crypto_intN_x; crypto_intN_y = crypto_intN_y unsigned>> 7"); 16: readasm("arm32; int16 crypto_intN_x crypto_intN_y; crypto_intN_y = (uint16) crypto_intN_x; crypto_intN_y = crypto_intN_y unsigned>> 15"); 32: readasm("arm32; int32 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x unsigned>> 31"); 64: readasm("arm32; int64 crypto_intN_x crypto_intN_y; crypto_intN_y.lo = crypto_intN_x.hi unsigned>> 31; crypto_intN_y.hi = 0"); return crypto_intN_y; #elif sparc32 crypto_intN_unsigned crypto_intN_y; 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_y; crypto_intN_y = (uint8) crypto_intN_x; crypto_intN_y = crypto_intN_y unsigned>> 7"); 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_y; crypto_intN_y = (uint16) crypto_intN_x; crypto_intN_y = crypto_intN_y unsigned>> 15"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x unsigned>> 31"); 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_y; crypto_intN_y.lo = crypto_intN_x.hi unsigned>> 31; crypto_intN_y.hi = 0"); return crypto_intN_y; #else crypto_intN_x >>= N-6; crypto_intN_x += crypto_intN_optblocker; crypto_intN_x >>= 5; return crypto_intN_x; #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_negative_01(crypto_intN crypto_intN_x) { return crypto_intN_unsigned_topbit_01(crypto_intN_x); } __attribute__((unused)) static inline crypto_intN crypto_intN_topbit_mask(crypto_intN crypto_intN_x) { return crypto_intN_negative_mask(crypto_intN_x); } __attribute__((unused)) static inline crypto_intN crypto_intN_topbit_01(crypto_intN crypto_intN_x) { return crypto_intN_unsigned_topbit_01(crypto_intN_x); } __attribute__((unused)) static inline crypto_intN crypto_intN_bottombit_mask(crypto_intN crypto_intN_x) { #if amd64 8: readasm("amd64; int8 crypto_intN_x; crypto_intN_x &= 1"); 16: readasm("amd64; int16 crypto_intN_x; crypto_intN_x &= 1"); 32: readasm("amd64; int32 crypto_intN_x; crypto_intN_x &= 1"); 64: readasm("amd64; int64 crypto_intN_x; crypto_intN_x &= 1"); return -crypto_intN_x; #elif arm64 crypto_intN crypto_intN_y; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y; crypto_intN_y = -(1 & (crypto_intN_x unsigned>> 0))"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y; crypto_intN_y = -(1 & (crypto_intN_x unsigned>> 0))"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y; crypto_intN_y = -(1 & (crypto_intN_x unsigned>> 0))"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y; crypto_intN_y = -(1 & (crypto_intN_x unsigned>> 0))"); return crypto_intN_y; #elif arm32 crypto_intN crypto_intN_y; 8: readasm("arm32; int8 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x & 1; crypto_intN_y = -crypto_intN_y"); 16: readasm("arm32; int16 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x & 1; crypto_intN_y = -crypto_intN_y"); 32: readasm("arm32; int32 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x & 1; crypto_intN_y = -crypto_intN_y"); 64: readasm("arm32; int64 crypto_intN_x crypto_intN_y; crypto_intN_y.lo = crypto_intN_x.lo & 1; crypto_intN_y.lo = -crypto_intN_y.lo; crypto_intN_y.hi = crypto_intN_y.lo"); return crypto_intN_y; #elif sparc32 crypto_intN crypto_intN_y; 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x & 1; crypto_intN_y = -crypto_intN_y"); 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x & 1; crypto_intN_y = -crypto_intN_y"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x & 1; crypto_intN_y = -crypto_intN_y"); 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_y; crypto_intN_y.lo = crypto_intN_x.lo & 1; crypto_intN_y.lo = -crypto_intN_y.lo; crypto_intN_y.hi = crypto_intN_y.lo"); return crypto_intN_y; #else crypto_intN_x &= 1 + crypto_intN_optblocker; return -crypto_intN_x; #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_bottombit_01(crypto_intN crypto_intN_x) { #if amd64 8: readasm("amd64; int8 crypto_intN_x; crypto_intN_x &= 1"); 16: readasm("amd64; int16 crypto_intN_x; crypto_intN_x &= 1"); 32: readasm("amd64; int32 crypto_intN_x; crypto_intN_x &= 1"); 64: readasm("amd64; int64 crypto_intN_x; crypto_intN_x &= 1"); return crypto_intN_x; #elif arm64 crypto_intN crypto_intN_y; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y; crypto_intN_y = 1 & (crypto_intN_x unsigned>> 0)"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y; crypto_intN_y = 1 & (crypto_intN_x unsigned>> 0)"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y; crypto_intN_y = 1 & (crypto_intN_x unsigned>> 0)"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y; crypto_intN_y = 1 & (crypto_intN_x unsigned>> 0)"); return crypto_intN_y; #elif arm32 crypto_intN crypto_intN_y; 8: readasm("arm32; int8 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x & 1"); 16: readasm("arm32; int16 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x & 1"); 32: readasm("arm32; int32 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x & 1"); 64: readasm("arm32; int64 crypto_intN_x crypto_intN_y; crypto_intN_y.lo = crypto_intN_x.lo & 1; crypto_intN_y.hi = 0"); return crypto_intN_y; #elif sparc32 crypto_intN crypto_intN_y; 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x & 1"); 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x & 1"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x & 1"); 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_y; crypto_intN_y.lo = crypto_intN_x.lo & 1; crypto_intN_y.hi = 0"); return crypto_intN_y; #else crypto_intN_x &= 1 + crypto_intN_optblocker; return crypto_intN_x; #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_bitinrangepublicpos_mask(crypto_intN crypto_intN_x,crypto_intN crypto_intN_s) { #if amd64 8: readasm("amd64; int8 crypto_intN_x crypto_intN_s; crypto_intN_x signed>>= crypto_intN_s"); 16: readasm("amd64; int16 crypto_intN_x crypto_intN_s; crypto_intN_x signed>>= crypto_intN_s"); 32: readasm("amd64; int32 crypto_intN_x crypto_intN_s; crypto_intN_x signed>>= crypto_intN_s"); 64: readasm("amd64; int64 crypto_intN_x crypto_intN_s; crypto_intN_x signed>>= crypto_intN_s"); #elif arm64 8: readasm("arm64; int8 crypto_intN_x crypto_intN_s; crypto_intN_x = (int8) crypto_intN_x; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_s; crypto_intN_x = (int16) crypto_intN_x; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); #elif arm32 8: readasm("arm32; int8 crypto_intN_x crypto_intN_s; crypto_intN_s = crypto_intN_s & 7; crypto_intN_x = (int8) crypto_intN_x; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 16: readasm("arm32; int16 crypto_intN_x crypto_intN_s; crypto_intN_s = crypto_intN_s & 15; crypto_intN_x = (int16) crypto_intN_x; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 32: readasm("arm32; int32 crypto_intN_x crypto_intN_s; crypto_intN_s = crypto_intN_s & 31; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 64: readasm("arm32; int64 crypto_intN_x crypto_intN_s; crypto_intN_s.lo = crypto_intN_s.lo & 63; crypto_intN_x.lo = crypto_intN_x.lo unsigned>> crypto_intN_s.lo; crypto_intN_s.hi = 32 - crypto_intN_s.lo; crypto_intN_x.lo = crypto_intN_x.lo | (crypto_intN_x.hi << crypto_intN_s.hi); flags, crypto_intN_s.hi = crypto_intN_s.lo - 32; crypto_intN_x.lo = crypto_intN_x.lo | (crypto_intN_x.hi signed>> crypto_intN_s.hi) if unsigned>=; crypto_intN_x.hi = crypto_intN_x.hi signed>> crypto_intN_s.lo"); #elif sparc32 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_s; crypto_intN_s = crypto_intN_s & 7; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_s; crypto_intN_s = crypto_intN_s & 15; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 64: crypto_intN crypto_intN_y, crypto_intN_z; 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_y crypto_intN_z crypto_intN_s; crypto_intN_s.hi = ~crypto_intN_s.lo; crypto_intN_z.hi = crypto_intN_s.lo << 26; crypto_intN_z.lo = crypto_intN_x.hi << 1; crypto_intN_y.lo = crypto_intN_x.lo unsigned>> crypto_intN_s.lo; crypto_intN_z.lo = crypto_intN_z.lo << crypto_intN_s.hi; crypto_intN_y.hi = crypto_intN_x.hi signed>> crypto_intN_s.lo; crypto_intN_z.hi = crypto_intN_z.hi signed>> 31; crypto_intN_y.lo = crypto_intN_y.lo | crypto_intN_z.lo; crypto_intN_z.lo = crypto_intN_y.lo ^ crypto_intN_y.hi; crypto_intN_z.lo = crypto_intN_z.hi & crypto_intN_z.lo; crypto_intN_x.hi = crypto_intN_y.hi signed>> crypto_intN_z.hi; crypto_intN_x.lo = crypto_intN_y.lo ^ crypto_intN_z.lo"); #else crypto_intN_x >>= crypto_intN_s ^ crypto_intN_optblocker; #endif return crypto_intN_bottombit_mask(crypto_intN_x); } __attribute__((unused)) static inline crypto_intN crypto_intN_bitinrangepublicpos_01(crypto_intN crypto_intN_x,crypto_intN crypto_intN_s) { #if amd64 8: readasm("amd64; int8 crypto_intN_x crypto_intN_s; crypto_intN_x signed>>= crypto_intN_s"); 16: readasm("amd64; int16 crypto_intN_x crypto_intN_s; crypto_intN_x signed>>= crypto_intN_s"); 32: readasm("amd64; int32 crypto_intN_x crypto_intN_s; crypto_intN_x signed>>= crypto_intN_s"); 64: readasm("amd64; int64 crypto_intN_x crypto_intN_s; crypto_intN_x signed>>= crypto_intN_s"); #elif arm64 8: readasm("arm64; int8 crypto_intN_x crypto_intN_s; crypto_intN_x = (int8) crypto_intN_x; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_s; crypto_intN_x = (int16) crypto_intN_x; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); #elif arm32 8: readasm("arm32; int8 crypto_intN_x crypto_intN_s; crypto_intN_s = crypto_intN_s & 7; crypto_intN_x = (int8) crypto_intN_x; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 16: readasm("arm32; int16 crypto_intN_x crypto_intN_s; crypto_intN_s = crypto_intN_s & 15; crypto_intN_x = (int16) crypto_intN_x; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 32: readasm("arm32; int32 crypto_intN_x crypto_intN_s; crypto_intN_s = crypto_intN_s & 31; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 64: readasm("arm32; int64 crypto_intN_x crypto_intN_s; crypto_intN_s.lo = crypto_intN_s.lo & 63; crypto_intN_x.lo = crypto_intN_x.lo unsigned>> crypto_intN_s.lo; crypto_intN_s.hi = 32 - crypto_intN_s.lo; crypto_intN_x.lo = crypto_intN_x.lo | (crypto_intN_x.hi << crypto_intN_s.hi); flags, crypto_intN_s.hi = crypto_intN_s.lo - 32; crypto_intN_x.lo = crypto_intN_x.lo | (crypto_intN_x.hi signed>> crypto_intN_s.hi) if unsigned>=; crypto_intN_x.hi = crypto_intN_x.hi signed>> crypto_intN_s.lo"); #elif sparc32 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_s; crypto_intN_s = crypto_intN_s & 7; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_s; crypto_intN_s = crypto_intN_s & 15; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 64: crypto_intN crypto_intN_y, crypto_intN_z; 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_y crypto_intN_z crypto_intN_s; crypto_intN_s.hi = ~crypto_intN_s.lo; crypto_intN_z.hi = crypto_intN_s.lo << 26; crypto_intN_z.lo = crypto_intN_x.hi << 1; crypto_intN_y.lo = crypto_intN_x.lo unsigned>> crypto_intN_s.lo; crypto_intN_z.lo = crypto_intN_z.lo << crypto_intN_s.hi; crypto_intN_y.hi = crypto_intN_x.hi signed>> crypto_intN_s.lo; crypto_intN_z.hi = crypto_intN_z.hi signed>> 31; crypto_intN_y.lo = crypto_intN_y.lo | crypto_intN_z.lo; crypto_intN_z.lo = crypto_intN_y.lo ^ crypto_intN_y.hi; crypto_intN_z.lo = crypto_intN_z.hi & crypto_intN_z.lo; crypto_intN_x.hi = crypto_intN_y.hi signed>> crypto_intN_z.hi; crypto_intN_x.lo = crypto_intN_y.lo ^ crypto_intN_z.lo"); #else crypto_intN_x >>= crypto_intN_s ^ crypto_intN_optblocker; #endif return crypto_intN_bottombit_01(crypto_intN_x); } __attribute__((unused)) static inline crypto_intN crypto_intN_shlmod(crypto_intN crypto_intN_x,crypto_intN crypto_intN_s) { #if amd64 8: crypto_intN_s &= 7; 8: readasm("amd64; int8 crypto_intN_x crypto_intN_s; crypto_intN_x <<= crypto_intN_s"); 16: crypto_intN_s &= 15; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_s; crypto_intN_x <<= crypto_intN_s"); 32: readasm("amd64; int32 crypto_intN_x crypto_intN_s; crypto_intN_x <<= crypto_intN_s"); 64: readasm("amd64; int64 crypto_intN_x crypto_intN_s; crypto_intN_x <<= crypto_intN_s"); #elif arm64 8: crypto_intN_s &= 7; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_s; crypto_intN_x = (uint8) crypto_intN_x; crypto_intN_x = crypto_intN_x << crypto_intN_s"); 16: crypto_intN_s &= 15; 16: readasm("arm64; int16 crypto_intN_x crypto_intN_s; crypto_intN_x = (uint16) crypto_intN_x; crypto_intN_x = crypto_intN_x << crypto_intN_s"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x << crypto_intN_s"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x << crypto_intN_s"); #elif arm32 8: crypto_intN_s &= 7; 8: readasm("arm32; int8 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x << crypto_intN_s; crypto_intN_x = (int8) crypto_intN_x"); 16: crypto_intN_s &= 15; 16: readasm("arm32; int16 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x << crypto_intN_s; crypto_intN_x = (int16) crypto_intN_x"); 32: crypto_intN_s &= 31; 32: readasm("arm32; int32 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x << crypto_intN_s"); 64: readasm("arm32; int64 crypto_intN_x crypto_intN_s; crypto_intN_s.lo = crypto_intN_s.lo & 63; crypto_intN_x.hi = crypto_intN_x.hi << crypto_intN_s.lo; crypto_intN_s.hi = crypto_intN_s.lo - 32; crypto_intN_x.hi = crypto_intN_x.hi | (crypto_intN_x.lo << crypto_intN_s.hi); crypto_intN_s.hi = 32 - crypto_intN_s.lo; crypto_intN_x.hi = crypto_intN_x.hi | (crypto_intN_x.lo unsigned>> crypto_intN_s.hi); crypto_intN_x.lo = crypto_intN_x.lo << crypto_intN_s.lo"); #elif sparc32 8: crypto_intN_s &= 7; crypto_intN_s += 24; 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x << crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> 24"); 16: crypto_intN_s &= 15; crypto_intN_s += 16; 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x << crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> 16"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x << crypto_intN_s"); 64: crypto_intN crypto_intN_y, crypto_intN_z; 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_y crypto_intN_z crypto_intN_s; crypto_intN_s.hi = ~crypto_intN_s.lo; crypto_intN_z.hi = crypto_intN_s.lo << 26; crypto_intN_z.lo = crypto_intN_x.lo unsigned>> 1; crypto_intN_y.lo = crypto_intN_x.lo << crypto_intN_s.lo; crypto_intN_z.lo = crypto_intN_z.lo unsigned>> crypto_intN_s.hi; crypto_intN_y.hi = crypto_intN_x.hi << crypto_intN_s.lo; crypto_intN_z.hi = crypto_intN_z.hi signed>> 31; crypto_intN_y.hi = crypto_intN_y.hi | crypto_intN_z.lo; crypto_intN_z.lo = crypto_intN_y.lo ^ crypto_intN_y.hi; crypto_intN_x.lo = crypto_intN_z.hi & crypto_intN_y.lo; crypto_intN_z.lo = crypto_intN_z.hi & crypto_intN_z.lo; crypto_intN_x.lo = crypto_intN_x.lo ^ crypto_intN_y.lo; crypto_intN_x.hi = crypto_intN_y.hi ^ crypto_intN_z.lo"); #else int crypto_intN_k, crypto_intN_l; for (crypto_intN_l = 0,crypto_intN_k = 1;crypto_intN_k < N;++crypto_intN_l,crypto_intN_k *= 2) crypto_intN_x ^= (crypto_intN_x ^ (crypto_intN_x << crypto_intN_k)) & crypto_intN_bitinrangepublicpos_mask(crypto_intN_s,crypto_intN_l); #endif return crypto_intN_x; } __attribute__((unused)) static inline crypto_intN crypto_intN_shrmod(crypto_intN crypto_intN_x,crypto_intN crypto_intN_s) { #if amd64 8: crypto_intN_s &= 7; 8: readasm("amd64; int8 crypto_intN_x crypto_intN_s; crypto_intN_x signed>>= crypto_intN_s"); 16: crypto_intN_s &= 15; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_s; crypto_intN_x signed>>= crypto_intN_s"); 32: readasm("amd64; int32 crypto_intN_x crypto_intN_s; crypto_intN_x signed>>= crypto_intN_s"); 64: readasm("amd64; int64 crypto_intN_x crypto_intN_s; crypto_intN_x signed>>= crypto_intN_s"); #elif arm64 8: crypto_intN_s &= 7; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_s; crypto_intN_x = (int8) crypto_intN_x; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 16: crypto_intN_s &= 15; 16: readasm("arm64; int16 crypto_intN_x crypto_intN_s; crypto_intN_x = (int16) crypto_intN_x; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); #elif arm32 8: crypto_intN_s &= 7; 8: readasm("arm32; int8 crypto_intN_x crypto_intN_s; crypto_intN_x = (int8) crypto_intN_x; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 16: crypto_intN_s &= 15; 16: readasm("arm32; int16 crypto_intN_x crypto_intN_s; crypto_intN_x = (int16) crypto_intN_x; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 32: crypto_intN_s &= 31; 32: readasm("arm32; int32 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 64: readasm("arm32; int64 crypto_intN_x crypto_intN_s; crypto_intN_s.lo = crypto_intN_s.lo & 63; crypto_intN_x.lo = crypto_intN_x.lo unsigned>> crypto_intN_s.lo; crypto_intN_s.hi = 32 - crypto_intN_s.lo; crypto_intN_x.lo = crypto_intN_x.lo | (crypto_intN_x.hi << crypto_intN_s.hi); flags, crypto_intN_s.hi = crypto_intN_s.lo - 32; crypto_intN_x.lo = crypto_intN_x.lo | (crypto_intN_x.hi signed>> crypto_intN_s.hi) if unsigned>=; crypto_intN_x.hi = crypto_intN_x.hi signed>> crypto_intN_s.lo"); #elif sparc32 8: crypto_intN_s &= 7; 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 16: crypto_intN_s &= 15; 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_s; crypto_intN_x = crypto_intN_x signed>> crypto_intN_s"); 64: crypto_intN crypto_intN_y, crypto_intN_z; 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_y crypto_intN_z crypto_intN_s; crypto_intN_s.hi = ~crypto_intN_s.lo; crypto_intN_z.hi = crypto_intN_s.lo << 26; crypto_intN_z.lo = crypto_intN_x.hi << 1; crypto_intN_y.lo = crypto_intN_x.lo unsigned>> crypto_intN_s.lo; crypto_intN_z.lo = crypto_intN_z.lo << crypto_intN_s.hi; crypto_intN_y.hi = crypto_intN_x.hi signed>> crypto_intN_s.lo; crypto_intN_z.hi = crypto_intN_z.hi signed>> 31; crypto_intN_y.lo = crypto_intN_y.lo | crypto_intN_z.lo; crypto_intN_z.lo = crypto_intN_y.lo ^ crypto_intN_y.hi; crypto_intN_z.lo = crypto_intN_z.hi & crypto_intN_z.lo; crypto_intN_x.hi = crypto_intN_y.hi signed>> crypto_intN_z.hi; crypto_intN_x.lo = crypto_intN_y.lo ^ crypto_intN_z.lo"); #else int crypto_intN_k, crypto_intN_l; for (crypto_intN_l = 0,crypto_intN_k = 1;crypto_intN_k < N;++crypto_intN_l,crypto_intN_k *= 2) crypto_intN_x ^= (crypto_intN_x ^ (crypto_intN_x >> crypto_intN_k)) & crypto_intN_bitinrangepublicpos_mask(crypto_intN_s,crypto_intN_l); #endif return crypto_intN_x; } __attribute__((unused)) static inline crypto_intN crypto_intN_bitmod_mask(crypto_intN crypto_intN_x,crypto_intN crypto_intN_s) { crypto_intN_x = crypto_intN_shrmod(crypto_intN_x,crypto_intN_s); return crypto_intN_bottombit_mask(crypto_intN_x); } __attribute__((unused)) static inline crypto_intN crypto_intN_bitmod_01(crypto_intN crypto_intN_x,crypto_intN crypto_intN_s) { crypto_intN_x = crypto_intN_shrmod(crypto_intN_x,crypto_intN_s); return crypto_intN_bottombit_01(crypto_intN_x); } __attribute__((unused)) static inline crypto_intN crypto_intN_nonzero_mask(crypto_intN crypto_intN_x) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = -1; crypto_intN_x32 & (int8) crypto_intN_x32; crypto_intN_z32 = crypto_intN_q32 if !="); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if !="); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if !="); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if !="); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_z; crypto_intN_x & 255; crypto_intN_z = -1 if != else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_z; crypto_intN_x & 65535; crypto_intN_z = -1 if != else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_z; crypto_intN_x - 0; crypto_intN_z = -1 if != else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_z; crypto_intN_x - 0; crypto_intN_z = -1 if != else 0"); return crypto_intN_z; #elif arm32 8: readasm("arm32; int8 crypto_intN_x; crypto_intN_x = (uint8) crypto_intN_x; crypto_intN_x - 0; crypto_intN_x = -1 if !="); 16: readasm("arm32; int16 crypto_intN_x; crypto_intN_x = (uint16) crypto_intN_x; crypto_intN_x - 0; crypto_intN_x = -1 if !="); 32: readasm("arm32; int32 crypto_intN_x; crypto_intN_x - 0; crypto_intN_x = -1 if !="); 64: readasm("arm32; int64 crypto_intN_x; flags, crypto_intN_x.lo = crypto_intN_x.lo | crypto_intN_x.hi; crypto_intN_x.lo = -1 if !=; crypto_intN_x.hi = crypto_intN_x.lo"); return crypto_intN_x; #elif sparc32 crypto_intN crypto_intN_z; 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_z; crypto_intN_x = (uint8) crypto_intN_x; 0 - crypto_intN_x; crypto_intN_z = -carry"); 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_z; crypto_intN_x = (uint16) crypto_intN_x; 0 - crypto_intN_x; crypto_intN_z = -carry"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_z; 0 - crypto_intN_x; crypto_intN_z = -carry"); 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_z; crypto_intN_z.lo = crypto_intN_x.lo | crypto_intN_x.hi; 0 - crypto_intN_z.lo; crypto_intN_z.lo = -carry; crypto_intN_z.hi = crypto_intN_z.lo"); return crypto_intN_z; #else crypto_intN_x |= -crypto_intN_x; return crypto_intN_negative_mask(crypto_intN_x); #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_nonzero_01(crypto_intN crypto_intN_x) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = 1; crypto_intN_x32 & (int8) crypto_intN_x32; crypto_intN_z32 = crypto_intN_q32 if !="); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if !="); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if !="); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if !="); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_z; crypto_intN_x & 255; crypto_intN_z = 1 if != else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_z; crypto_intN_x & 65535; crypto_intN_z = 1 if != else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_z; crypto_intN_x - 0; crypto_intN_z = 1 if != else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_z; crypto_intN_x - 0; crypto_intN_z = 1 if != else 0"); return crypto_intN_z; #elif arm32 8: readasm("arm32; int8 crypto_intN_x; crypto_intN_x = (uint8) crypto_intN_x; crypto_intN_x - 0; crypto_intN_x = 1 if !="); 16: readasm("arm32; int16 crypto_intN_x; crypto_intN_x = (uint16) crypto_intN_x; crypto_intN_x - 0; crypto_intN_x = 1 if !="); 32: readasm("arm32; int32 crypto_intN_x; crypto_intN_x - 0; crypto_intN_x = 1 if !="); 64: readasm("arm32; int64 crypto_intN_x; flags, crypto_intN_x.lo = crypto_intN_x.lo | crypto_intN_x.hi; crypto_intN_x.lo = 1 if !=; crypto_intN_x.hi = 0"); return crypto_intN_x; #elif sparc32 crypto_intN crypto_intN_z; 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_z; crypto_intN_x = (uint8) crypto_intN_x; 0 - crypto_intN_x; crypto_intN_z = carry"); 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_z; crypto_intN_x = (uint16) crypto_intN_x; 0 - crypto_intN_x; crypto_intN_z = carry"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_z; 0 - crypto_intN_x; crypto_intN_z = carry"); 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_z; crypto_intN_z.lo = crypto_intN_x.lo | crypto_intN_x.hi; 0 - crypto_intN_z.lo; crypto_intN_z.lo = carry; crypto_intN_z.hi = 0"); return crypto_intN_z; #else crypto_intN_x |= -crypto_intN_x; return crypto_intN_unsigned_topbit_01(crypto_intN_x); #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_positive_mask(crypto_intN crypto_intN_x) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = -1; crypto_intN_x32 & (int8) crypto_intN_x32; crypto_intN_z32 = crypto_intN_q32 if signed>"); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if signed>"); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if signed>"); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if signed>"); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_z; crypto_intN_z = (int8) crypto_intN_x; crypto_intN_z - 0; crypto_intN_z = -1 if signed> else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_z; crypto_intN_z = (int16) crypto_intN_x; crypto_intN_z - 0; crypto_intN_z = -1 if signed> else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_z; crypto_intN_x - 0; crypto_intN_z = -1 if signed> else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_z; crypto_intN_x - 0; crypto_intN_z = -1 if signed> else 0"); return crypto_intN_z; #elif sparc32 crypto_intN crypto_intN_z; 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_z; crypto_intN_z = crypto_intN_x << 24; crypto_intN_z = crypto_intN_z signed>> 31; crypto_intN_z = crypto_intN_z - crypto_intN_x; crypto_intN_z = crypto_intN_z signed>> 31"); 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_z; crypto_intN_z = crypto_intN_x << 16; crypto_intN_z = crypto_intN_z signed>> 31; crypto_intN_z = crypto_intN_z - crypto_intN_x; crypto_intN_z = crypto_intN_z signed>> 31"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_z; crypto_intN_z = crypto_intN_x signed>> 31; crypto_intN_z = crypto_intN_z - crypto_intN_x; crypto_intN_z = crypto_intN_z signed>> 31"); 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_z; crypto_intN_z.lo = crypto_intN_x.hi signed>> 31; carry, crypto_intN_z.hi = crypto_intN_z.lo - crypto_intN_x.lo; crypto_intN_z.hi = crypto_intN_z.lo - crypto_intN_x.hi - carry; crypto_intN_z.hi = crypto_intN_z.hi signed>> 31; crypto_intN_z.lo = crypto_intN_z.hi"); return crypto_intN_z; #else crypto_intN crypto_intN_z = -crypto_intN_x; crypto_intN_z ^= crypto_intN_x & crypto_intN_z; return crypto_intN_negative_mask(crypto_intN_z); #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_positive_01(crypto_intN crypto_intN_x) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = 1; crypto_intN_x32 & (int8) crypto_intN_x32; crypto_intN_z32 = crypto_intN_q32 if signed>"); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if signed>"); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if signed>"); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if signed>"); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_z; crypto_intN_z = (int8) crypto_intN_x; crypto_intN_z - 0; crypto_intN_z = 1 if signed> else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_z; crypto_intN_z = (int16) crypto_intN_x; crypto_intN_z - 0; crypto_intN_z = 1 if signed> else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_z; crypto_intN_x - 0; crypto_intN_z = 1 if signed> else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_z; crypto_intN_x - 0; crypto_intN_z = 1 if signed> else 0"); return crypto_intN_z; #elif sparc32 crypto_intN crypto_intN_z; 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_z; crypto_intN_z = crypto_intN_x << 24; crypto_intN_z = crypto_intN_z signed>> 31; crypto_intN_z = crypto_intN_z - crypto_intN_x; crypto_intN_z = crypto_intN_z unsigned>> 31"); 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_z; crypto_intN_z = crypto_intN_x << 16; crypto_intN_z = crypto_intN_z signed>> 31; crypto_intN_z = crypto_intN_z - crypto_intN_x; crypto_intN_z = crypto_intN_z unsigned>> 31"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_z; crypto_intN_z = crypto_intN_x signed>> 31; crypto_intN_z = crypto_intN_z - crypto_intN_x; crypto_intN_z = crypto_intN_z unsigned>> 31"); 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_z; crypto_intN_z.hi = crypto_intN_x.hi signed>> 31; carry, crypto_intN_z.lo = crypto_intN_z.hi - crypto_intN_x.lo; crypto_intN_z.lo = crypto_intN_z.hi - crypto_intN_x.hi - carry; crypto_intN_z.lo = crypto_intN_z.lo unsigned>> 31; crypto_intN_z.hi = 0"); return crypto_intN_z; #else crypto_intN crypto_intN_z = -crypto_intN_x; crypto_intN_z ^= crypto_intN_x & crypto_intN_z; return crypto_intN_unsigned_topbit_01(crypto_intN_z); #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_zero_mask(crypto_intN crypto_intN_x) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = -1; crypto_intN_x32 & (int8) crypto_intN_x32; crypto_intN_z32 = crypto_intN_q32 if ="); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if ="); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if ="); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if ="); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_z; crypto_intN_x & 255; crypto_intN_z = -1 if = else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_z; crypto_intN_x & 65535; crypto_intN_z = -1 if = else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_z; crypto_intN_x - 0; crypto_intN_z = -1 if = else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_z; crypto_intN_x - 0; crypto_intN_z = -1 if = else 0"); return crypto_intN_z; #elif sparc32 crypto_intN crypto_intN_z; 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_z; crypto_intN_x = (uint8) crypto_intN_x; 0 - crypto_intN_x; crypto_intN_z = carry - 1"); 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_z; crypto_intN_x = (uint16) crypto_intN_x; 0 - crypto_intN_x; crypto_intN_z = carry - 1"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_z; 0 - crypto_intN_x; crypto_intN_z = carry - 1"); 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_z; crypto_intN_z.lo = crypto_intN_x.lo | crypto_intN_x.hi; 0 - crypto_intN_z.lo; crypto_intN_z.lo = carry - 1; crypto_intN_z.hi = crypto_intN_z.lo"); return crypto_intN_z; #else return ~crypto_intN_nonzero_mask(crypto_intN_x); #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_zero_01(crypto_intN crypto_intN_x) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = 1; crypto_intN_x32 & (int8) crypto_intN_x32; crypto_intN_z32 = crypto_intN_q32 if ="); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if ="); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if ="); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x & crypto_intN_x; crypto_intN_z = crypto_intN_q if ="); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_z; crypto_intN_x & 255; crypto_intN_z = 1 if = else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_z; crypto_intN_x & 65535; crypto_intN_z = 1 if = else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_z; crypto_intN_x - 0; crypto_intN_z = 1 if = else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_z; crypto_intN_x - 0; crypto_intN_z = 1 if = else 0"); return crypto_intN_z; #elif sparc32 crypto_intN crypto_intN_z; 8: readasm("sparc32; int8 crypto_intN_x crypto_intN_z; crypto_intN_x = (uint8) crypto_intN_x; 0 - crypto_intN_x; crypto_intN_z = 1 - carry"); 16: readasm("sparc32; int16 crypto_intN_x crypto_intN_z; crypto_intN_x = (uint16) crypto_intN_x; 0 - crypto_intN_x; crypto_intN_z = 1 - carry"); 32: readasm("sparc32; int32 crypto_intN_x crypto_intN_z; 0 - crypto_intN_x; crypto_intN_z = 1 - carry"); 64: readasm("sparc32; int64 crypto_intN_x crypto_intN_z; crypto_intN_z.lo = crypto_intN_x.lo | crypto_intN_x.hi; 0 - crypto_intN_z.lo; crypto_intN_z.lo = 1 - carry; crypto_intN_z.hi = 0"); return crypto_intN_z; #else return 1-crypto_intN_nonzero_01(crypto_intN_x); #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_unequal_mask(crypto_intN crypto_intN_x,crypto_intN crypto_intN_y) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_y32 = crypto_intN_y,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_y32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = -1; crypto_intN_x32 - (int8) crypto_intN_y32; crypto_intN_z32 = crypto_intN_q32 if !="); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if !="); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if !="); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if !="); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (uint8) crypto_intN_x; crypto_intN_z - (uint8) crypto_intN_y; crypto_intN_z = -1 if != else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (uint16) crypto_intN_x; crypto_intN_z - (uint16) crypto_intN_y; crypto_intN_z = -1 if != else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = -1 if != else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = -1 if != else 0"); return crypto_intN_z; #else return crypto_intN_nonzero_mask(crypto_intN_x ^ crypto_intN_y); #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_unequal_01(crypto_intN crypto_intN_x,crypto_intN crypto_intN_y) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_y32 = crypto_intN_y,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_y32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = 1; crypto_intN_x32 - (int8) crypto_intN_y32; crypto_intN_z32 = crypto_intN_q32 if !="); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if !="); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if !="); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if !="); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (uint8) crypto_intN_x; crypto_intN_z - (uint8) crypto_intN_y; crypto_intN_z = 1 if != else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (uint16) crypto_intN_x; crypto_intN_z - (uint16) crypto_intN_y; crypto_intN_z = 1 if != else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = 1 if != else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = 1 if != else 0"); return crypto_intN_z; #else return crypto_intN_nonzero_01(crypto_intN_x ^ crypto_intN_y); #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_equal_mask(crypto_intN crypto_intN_x,crypto_intN crypto_intN_y) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_y32 = crypto_intN_y,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_y32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = -1; crypto_intN_x32 - (int8) crypto_intN_y32; crypto_intN_z32 = crypto_intN_q32 if ="); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if ="); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if ="); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if ="); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (uint8) crypto_intN_x; crypto_intN_z - (uint8) crypto_intN_y; crypto_intN_z = -1 if = else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (uint16) crypto_intN_x; crypto_intN_z - (uint16) crypto_intN_y; crypto_intN_z = -1 if = else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = -1 if = else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = -1 if = else 0"); return crypto_intN_z; #else return crypto_intN_zero_mask(crypto_intN_x ^ crypto_intN_y); #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_equal_01(crypto_intN crypto_intN_x,crypto_intN crypto_intN_y) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_y32 = crypto_intN_y,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_y32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = 1; crypto_intN_x32 - (int8) crypto_intN_y32; crypto_intN_z32 = crypto_intN_q32 if ="); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if ="); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if ="); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if ="); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (uint8) crypto_intN_x; crypto_intN_z - (uint8) crypto_intN_y; crypto_intN_z = 1 if = else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (uint16) crypto_intN_x; crypto_intN_z - (uint16) crypto_intN_y; crypto_intN_z = 1 if = else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = 1 if = else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = 1 if = else 0"); return crypto_intN_z; #else return crypto_intN_zero_01(crypto_intN_x ^ crypto_intN_y); #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_min(crypto_intN crypto_intN_x,crypto_intN crypto_intN_y) { #if amd64 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_y32 = crypto_intN_y; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_y32; crypto_intN_x32 - (int8) crypto_intN_y32; crypto_intN_x32 = crypto_intN_y32 if signed>"); 8: crypto_intN_x = crypto_intN_x32; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_y; crypto_intN_x - crypto_intN_y; crypto_intN_x = crypto_intN_y if signed>"); 32: readasm("amd64; int32 crypto_intN_x crypto_intN_y; crypto_intN_x - crypto_intN_y; crypto_intN_x = crypto_intN_y if signed>"); 64: readasm("amd64; int64 crypto_intN_x crypto_intN_y; crypto_intN_x - crypto_intN_y; crypto_intN_x = crypto_intN_y if signed>"); return crypto_intN_x; #elif arm64 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y; crypto_intN_x = (int8) crypto_intN_x; crypto_intN_x - (int8) crypto_intN_y; crypto_intN_x = crypto_intN_x if signed< else crypto_intN_y"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y; crypto_intN_x = (int16) crypto_intN_x; crypto_intN_x - (int16) crypto_intN_y; crypto_intN_x = crypto_intN_x if signed< else crypto_intN_y"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y; crypto_intN_x - crypto_intN_y; crypto_intN_x = crypto_intN_x if signed< else crypto_intN_y"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y; crypto_intN_x - crypto_intN_y; crypto_intN_x = crypto_intN_x if signed< else crypto_intN_y"); return crypto_intN_x; #else crypto_intN crypto_intN_r = crypto_intN_y ^ crypto_intN_x; crypto_intN crypto_intN_z = crypto_intN_y - crypto_intN_x; crypto_intN_z ^= crypto_intN_r & (crypto_intN_z ^ crypto_intN_y); crypto_intN_z = crypto_intN_negative_mask(crypto_intN_z); crypto_intN_z &= crypto_intN_r; return crypto_intN_x ^ crypto_intN_z; #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_max(crypto_intN crypto_intN_x,crypto_intN crypto_intN_y) { #if amd64 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_y32 = crypto_intN_y; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_y32; crypto_intN_x32 - (int8) crypto_intN_y32; crypto_intN_x32 = crypto_intN_y32 if signed<"); 8: crypto_intN_x = crypto_intN_x32; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_y; crypto_intN_x - crypto_intN_y; crypto_intN_x = crypto_intN_y if signed<"); 32: readasm("amd64; int32 crypto_intN_x crypto_intN_y; crypto_intN_x - crypto_intN_y; crypto_intN_x = crypto_intN_y if signed<"); 64: readasm("amd64; int64 crypto_intN_x crypto_intN_y; crypto_intN_x - crypto_intN_y; crypto_intN_x = crypto_intN_y if signed<"); return crypto_intN_x; #elif arm64 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y; crypto_intN_x = (int8) crypto_intN_x; crypto_intN_x - (int8) crypto_intN_y; crypto_intN_x = crypto_intN_y if signed< else crypto_intN_x"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y; crypto_intN_x = (int16) crypto_intN_x; crypto_intN_x - (int16) crypto_intN_y; crypto_intN_x = crypto_intN_y if signed< else crypto_intN_x"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y; crypto_intN_x - crypto_intN_y; crypto_intN_x = crypto_intN_y if signed< else crypto_intN_x"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y; crypto_intN_x - crypto_intN_y; crypto_intN_x = crypto_intN_y if signed< else crypto_intN_x"); return crypto_intN_x; #else crypto_intN crypto_intN_r = crypto_intN_y ^ crypto_intN_x; crypto_intN crypto_intN_z = crypto_intN_y - crypto_intN_x; crypto_intN_z ^= crypto_intN_r & (crypto_intN_z ^ crypto_intN_y); crypto_intN_z = crypto_intN_negative_mask(crypto_intN_z); crypto_intN_z &= crypto_intN_r; return crypto_intN_y ^ crypto_intN_z; #endif } __attribute__((unused)) static inline void crypto_intN_minmax(crypto_intN *crypto_intN_p,crypto_intN *crypto_intN_q) { crypto_intN crypto_intN_x = *crypto_intN_p; crypto_intN crypto_intN_y = *crypto_intN_q; #if amd64 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_y32 = crypto_intN_y,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_y32 crypto_intN_z32; crypto_intN_x32 - (int8) crypto_intN_y32; crypto_intN_z32 = crypto_intN_x32; crypto_intN_x32 = crypto_intN_y32 if signed>; crypto_intN_y32 = crypto_intN_z32 if signed>"); 8: crypto_intN_x = crypto_intN_x32; crypto_intN_y = crypto_intN_y32; 16: crypto_intN crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_x; crypto_intN_x = crypto_intN_y if signed>; crypto_intN_y = crypto_intN_z if signed>"); 32: crypto_intN crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_x; crypto_intN_x = crypto_intN_y if signed>; crypto_intN_y = crypto_intN_z if signed>"); 64: crypto_intN crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_x; crypto_intN_x = crypto_intN_y if signed>; crypto_intN_y = crypto_intN_z if signed>"); *crypto_intN_p = crypto_intN_x; *crypto_intN_q = crypto_intN_y; #elif arm64 crypto_intN crypto_intN_r, crypto_intN_s; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y crypto_intN_r crypto_intN_s; crypto_intN_x = (int8) crypto_intN_x; crypto_intN_x - (int8) crypto_intN_y; crypto_intN_r = crypto_intN_x if signed< else crypto_intN_y; crypto_intN_s = crypto_intN_y if signed< else crypto_intN_x"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y crypto_intN_r crypto_intN_s; crypto_intN_x = (int16) crypto_intN_x; crypto_intN_x - (int16) crypto_intN_y; crypto_intN_r = crypto_intN_x if signed< else crypto_intN_y; crypto_intN_s = crypto_intN_y if signed< else crypto_intN_x"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y crypto_intN_r crypto_intN_s; crypto_intN_x - crypto_intN_y; crypto_intN_r = crypto_intN_x if signed< else crypto_intN_y; crypto_intN_s = crypto_intN_y if signed< else crypto_intN_x"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y crypto_intN_r crypto_intN_s; crypto_intN_x - crypto_intN_y; crypto_intN_r = crypto_intN_x if signed< else crypto_intN_y; crypto_intN_s = crypto_intN_y if signed< else crypto_intN_x"); *crypto_intN_p = crypto_intN_r; *crypto_intN_q = crypto_intN_s; #else crypto_intN crypto_intN_r = crypto_intN_y ^ crypto_intN_x; crypto_intN crypto_intN_z = crypto_intN_y - crypto_intN_x; crypto_intN_z ^= crypto_intN_r & (crypto_intN_z ^ crypto_intN_y); crypto_intN_z = crypto_intN_negative_mask(crypto_intN_z); crypto_intN_z &= crypto_intN_r; crypto_intN_x ^= crypto_intN_z; crypto_intN_y ^= crypto_intN_z; *crypto_intN_p = crypto_intN_x; *crypto_intN_q = crypto_intN_y; #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_smaller_mask(crypto_intN crypto_intN_x,crypto_intN crypto_intN_y) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_y32 = crypto_intN_y,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_y32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = -1; crypto_intN_x32 - (int8) crypto_intN_y32; crypto_intN_z32 = crypto_intN_q32 if signed<"); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if signed<"); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if signed<"); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if signed<"); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (int8) crypto_intN_x; crypto_intN_z - (int8) crypto_intN_y; crypto_intN_z = -1 if signed< else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (int16) crypto_intN_x; crypto_intN_z - (int16) crypto_intN_y; crypto_intN_z = -1 if signed< else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = -1 if signed< else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = -1 if signed< else 0"); return crypto_intN_z; #else crypto_intN crypto_intN_r = crypto_intN_x ^ crypto_intN_y; crypto_intN crypto_intN_z = crypto_intN_x - crypto_intN_y; crypto_intN_z ^= crypto_intN_r & (crypto_intN_z ^ crypto_intN_x); return crypto_intN_negative_mask(crypto_intN_z); #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_smaller_01(crypto_intN crypto_intN_x,crypto_intN crypto_intN_y) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_y32 = crypto_intN_y,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_y32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = 1; crypto_intN_x32 - (int8) crypto_intN_y32; crypto_intN_z32 = crypto_intN_q32 if signed<"); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if signed<"); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if signed<"); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if signed<"); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (int8) crypto_intN_x; crypto_intN_z - (int8) crypto_intN_y; crypto_intN_z = 1 if signed< else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (int16) crypto_intN_x; crypto_intN_z - (int16) crypto_intN_y; crypto_intN_z = 1 if signed< else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = 1 if signed< else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = 1 if signed< else 0"); return crypto_intN_z; #else crypto_intN crypto_intN_r = crypto_intN_x ^ crypto_intN_y; crypto_intN crypto_intN_z = crypto_intN_x - crypto_intN_y; crypto_intN_z ^= crypto_intN_r & (crypto_intN_z ^ crypto_intN_x); return crypto_intN_unsigned_topbit_01(crypto_intN_z); #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_leq_mask(crypto_intN crypto_intN_x,crypto_intN crypto_intN_y) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_y32 = crypto_intN_y,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_y32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = -1; crypto_intN_x32 - (int8) crypto_intN_y32; crypto_intN_z32 = crypto_intN_q32 if signed<="); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if signed<="); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if signed<="); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = -1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if signed<="); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (int8) crypto_intN_x; crypto_intN_z - (int8) crypto_intN_y; crypto_intN_z = -1 if signed<= else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (int16) crypto_intN_x; crypto_intN_z - (int16) crypto_intN_y; crypto_intN_z = -1 if signed<= else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = -1 if signed<= else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = -1 if signed<= else 0"); return crypto_intN_z; #else return ~crypto_intN_smaller_mask(crypto_intN_y,crypto_intN_x); #endif } __attribute__((unused)) static inline crypto_intN crypto_intN_leq_01(crypto_intN crypto_intN_x,crypto_intN crypto_intN_y) { #if amd64 8: crypto_intN crypto_intN_z; 8: int32_t crypto_intN_x32 = crypto_intN_x,crypto_intN_y32 = crypto_intN_y,crypto_intN_q32,crypto_intN_z32; 8: readasm("amd64; int32 crypto_intN_x32 crypto_intN_q32 crypto_intN_y32 crypto_intN_z32; crypto_intN_z32 = 0; crypto_intN_q32 = 1; crypto_intN_x32 - (int8) crypto_intN_y32; crypto_intN_z32 = crypto_intN_q32 if signed<="); 8: crypto_intN_z = crypto_intN_z32; 16: crypto_intN crypto_intN_q,crypto_intN_z; 16: readasm("amd64; int16 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if signed<="); 32: crypto_intN crypto_intN_q,crypto_intN_z; 32: readasm("amd64; int32 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if signed<="); 64: crypto_intN crypto_intN_q,crypto_intN_z; 64: readasm("amd64; int64 crypto_intN_x crypto_intN_q crypto_intN_y crypto_intN_z; crypto_intN_z = 0; crypto_intN_q = 1; crypto_intN_x - crypto_intN_y; crypto_intN_z = crypto_intN_q if signed<="); return crypto_intN_z; #elif arm64 crypto_intN crypto_intN_z; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (int8) crypto_intN_x; crypto_intN_z - (int8) crypto_intN_y; crypto_intN_z = 1 if signed<= else 0"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_z = (int16) crypto_intN_x; crypto_intN_z - (int16) crypto_intN_y; crypto_intN_z = 1 if signed<= else 0"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = 1 if signed<= else 0"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y crypto_intN_z; crypto_intN_x - crypto_intN_y; crypto_intN_z = 1 if signed<= else 0"); return crypto_intN_z; #else return 1-crypto_intN_smaller_01(crypto_intN_y,crypto_intN_x); #endif } __attribute__((unused)) static inline int crypto_intN_ones_num(crypto_intN crypto_intN_x) { crypto_intN_unsigned crypto_intN_y = crypto_intN_x; 8: const crypto_intN C0 = 0x55; 16: const crypto_intN C0 = 0x5555; 32: const crypto_intN C0 = 0x55555555; 64: const crypto_intN C0 = 0x5555555555555555; 8: const crypto_intN C1 = 0x33; 16: const crypto_intN C1 = 0x3333; 32: const crypto_intN C1 = 0x33333333; 64: const crypto_intN C1 = 0x3333333333333333; 8: const crypto_intN C2 = 0x0f; 16: const crypto_intN C2 = 0x0f0f; 32: const crypto_intN C2 = 0x0f0f0f0f; 64: const crypto_intN C2 = 0x0f0f0f0f0f0f0f0f; crypto_intN_y -= ((crypto_intN_y >> 1) & C0); crypto_intN_y = (crypto_intN_y & C1) + ((crypto_intN_y >> 2) & C1); crypto_intN_y = (crypto_intN_y + (crypto_intN_y >> 4)) & C2; 16: crypto_intN_y = (crypto_intN_y + (crypto_intN_y >> 8)) & 0xff; 32: crypto_intN_y += crypto_intN_y >> 8; 32: crypto_intN_y = (crypto_intN_y + (crypto_intN_y >> 16)) & 0xff; 64: crypto_intN_y += crypto_intN_y >> 8; 64: crypto_intN_y += crypto_intN_y >> 16; 64: crypto_intN_y = (crypto_intN_y + (crypto_intN_y >> 32)) & 0xff; return crypto_intN_y; } __attribute__((unused)) static inline int crypto_intN_bottomzeros_num(crypto_intN crypto_intN_x) { #if amd64 8: int32_t fallback = N; 8: int32_t crypto_intN_x32 = crypto_intN_x; 8: readasm("amd64; int32 crypto_intN_x32 fallback; crypto_intN_x32 = numbottomzeros_tricky crypto_intN_x32; crypto_intN_x32 = fallback if ="); 8: crypto_intN_x = crypto_intN_x32; 16: crypto_intN fallback = N; 16: readasm("amd64; int16 crypto_intN_x fallback; crypto_intN_x = numbottomzeros_tricky crypto_intN_x; crypto_intN_x = fallback if ="); 32: crypto_intN fallback = N; 32: readasm("amd64; int32 crypto_intN_x fallback; crypto_intN_x = numbottomzeros_tricky crypto_intN_x; crypto_intN_x = fallback if ="); 64: crypto_intN fallback = N; 64: readasm("amd64; int64 crypto_intN_x fallback; crypto_intN_x = numbottomzeros_tricky crypto_intN_x; crypto_intN_x = fallback if ="); return crypto_intN_x; #elif arm64 int64_t crypto_intN_y; 8: readasm("arm64; int8 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x | -256; crypto_intN_y = bitrev32 crypto_intN_y; crypto_intN_y = numbottomzeros crypto_intN_y"); 16: readasm("arm64; int16 crypto_intN_x crypto_intN_y; crypto_intN_y = crypto_intN_x | -65536; crypto_intN_y = bitrev32 crypto_intN_y; crypto_intN_y = numbottomzeros crypto_intN_y"); 32: readasm("arm64; int32 crypto_intN_x crypto_intN_y; crypto_intN_y = bitrev32 crypto_intN_x; crypto_intN_y = numbottomzeros crypto_intN_y"); 64: readasm("arm64; int64 crypto_intN_x crypto_intN_y; crypto_intN_y = bitrev64 crypto_intN_x; crypto_intN_y = numbottomzeros crypto_intN_y"); return crypto_intN_y; #else crypto_intN crypto_intN_y = crypto_intN_x ^ (crypto_intN_x-1); crypto_intN_y = ((crypto_intN) crypto_intN_y) >> 1; crypto_intN_y &= ~(crypto_intN_x & (((crypto_intN) 1) << (N-1))); return crypto_intN_ones_num(crypto_intN_y); #endif } #endif tinyssh-20250501/cryptoint/crypto_uint16.h000066400000000000000000000624521500472222400204140ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #ifndef crypto_uint16_h #define crypto_uint16_h #include #define crypto_uint16 uint16_t #define crypto_uint16_signed int16_t #define crypto_uint16_signed_optblocker tinyssh_uint16_signed_optblocker extern volatile crypto_uint16_signed crypto_uint16_signed_optblocker; __attribute__((unused)) static inline crypto_uint16 crypto_uint16_load(const unsigned char *crypto_uint16_s) { crypto_uint16 crypto_uint16_z = 0; crypto_uint16_z |= ((crypto_uint16) (*crypto_uint16_s++)) << 0; crypto_uint16_z |= ((crypto_uint16) (*crypto_uint16_s++)) << 8; return crypto_uint16_z; } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_load_bigendian(const unsigned char *crypto_uint16_s) { crypto_uint16 crypto_uint16_z = 0; crypto_uint16_z |= ((crypto_uint16) (*crypto_uint16_s++)) << 8; crypto_uint16_z |= ((crypto_uint16) (*crypto_uint16_s++)) << 0; return crypto_uint16_z; } __attribute__((unused)) static inline void crypto_uint16_store(unsigned char *crypto_uint16_s,crypto_uint16 crypto_uint16_x) { *crypto_uint16_s++ = crypto_uint16_x >> 0; *crypto_uint16_s++ = crypto_uint16_x >> 8; } __attribute__((unused)) static inline void crypto_uint16_store_bigendian(unsigned char *crypto_uint16_s,crypto_uint16 crypto_uint16_x) { *crypto_uint16_s++ = crypto_uint16_x >> 8; *crypto_uint16_s++ = crypto_uint16_x >> 0; } __attribute__((unused)) static inline crypto_uint16_signed crypto_uint16_signed_negative_mask(crypto_uint16_signed crypto_uint16_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarw $15,%0" : "+r"(crypto_uint16_x) : : "cc"); return crypto_uint16_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16_signed crypto_uint16_y; __asm__ ("sbfx %w0,%w1,15,1" : "=r"(crypto_uint16_y) : "r"(crypto_uint16_x) : ); return crypto_uint16_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint16_signed crypto_uint16_y; __asm__ ("sxth %0,%1\n asr %0,%0,#31" : "=r"(crypto_uint16_y) : "r"(crypto_uint16_x) : ); return crypto_uint16_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint16_signed crypto_uint16_y; __asm__ ("sll %1,16,%0\n sra %0,31,%0" : "=r"(crypto_uint16_y) : "r"(crypto_uint16_x) : ); return crypto_uint16_y; #else crypto_uint16_x >>= 16-6; crypto_uint16_x += crypto_uint16_signed_optblocker; crypto_uint16_x >>= 5; return crypto_uint16_x; #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_topbit_01(crypto_uint16 crypto_uint16_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrw $15,%0" : "+r"(crypto_uint16_x) : : "cc"); return crypto_uint16_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_y; __asm__ ("ubfx %w0,%w1,15,1" : "=r"(crypto_uint16_y) : "r"(crypto_uint16_x) : ); return crypto_uint16_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint16_signed crypto_uint16_y; __asm__ ("uxth %0,%1\n lsr %0,%0,#15" : "=r"(crypto_uint16_y) : "r"(crypto_uint16_x) : ); return crypto_uint16_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint16 crypto_uint16_y; __asm__ ("sll %1,16,%0\n srl %0,16,%0\n srl %0,15,%0" : "=r"(crypto_uint16_y) : "r"(crypto_uint16_x) : ); return crypto_uint16_y; #else crypto_uint16_x >>= 16-6; crypto_uint16_x += crypto_uint16_signed_optblocker; crypto_uint16_x >>= 5; return crypto_uint16_x; #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_topbit_mask(crypto_uint16 crypto_uint16_x) { return crypto_uint16_signed_negative_mask(crypto_uint16_x); } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_bottombit_mask(crypto_uint16 crypto_uint16_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andw $1,%0" : "+r"(crypto_uint16_x) : : "cc"); return -crypto_uint16_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_y; __asm__ ("sbfx %w0,%w1,0,1" : "=r"(crypto_uint16_y) : "r"(crypto_uint16_x) : ); return crypto_uint16_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint16 crypto_uint16_y; __asm__ ("and %0,%1,#1\n neg %0,%0\n uxth %0,%0" : "=r"(crypto_uint16_y) : "r"(crypto_uint16_x) : ); return crypto_uint16_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint16 crypto_uint16_y; __asm__ ("and %1,1,%0\n neg %0,%0\n sll %0,16,%0\n srl %0,16,%0" : "=r"(crypto_uint16_y) : "r"(crypto_uint16_x) : ); return crypto_uint16_y; #else crypto_uint16_x &= 1 + crypto_uint16_signed_optblocker; return -crypto_uint16_x; #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_bottombit_01(crypto_uint16 crypto_uint16_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andw $1,%0" : "+r"(crypto_uint16_x) : : "cc"); return crypto_uint16_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_y; __asm__ ("ubfx %w0,%w1,0,1" : "=r"(crypto_uint16_y) : "r"(crypto_uint16_x) : ); return crypto_uint16_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint16 crypto_uint16_y; __asm__ ("and %0,%1,#1" : "=r"(crypto_uint16_y) : "r"(crypto_uint16_x) : ); return crypto_uint16_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint16 crypto_uint16_y; __asm__ ("and %1,1,%0" : "=r"(crypto_uint16_y) : "r"(crypto_uint16_x) : ); return crypto_uint16_y; #else crypto_uint16_x &= 1 + crypto_uint16_signed_optblocker; return crypto_uint16_x; #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_bitinrangepublicpos_mask(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrw %%cl,%0" : "+r"(crypto_uint16_x) : "c"(crypto_uint16_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("and %w0,%w0,65535\n lsr %w0,%w0,%w1" : "+&r"(crypto_uint16_x) : "r"(crypto_uint16_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %0,%0,#15\n uxth %1,%1\n lsr %1,%1,%0" : "+&r"(crypto_uint16_s), "+r"(crypto_uint16_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("and %0,15,%0\n srl %1,%0,%1" : "+&r"(crypto_uint16_s), "+r"(crypto_uint16_x) : : ); #else crypto_uint16_x >>= crypto_uint16_s ^ crypto_uint16_signed_optblocker; #endif return crypto_uint16_bottombit_mask(crypto_uint16_x); } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_bitinrangepublicpos_01(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrw %%cl,%0" : "+r"(crypto_uint16_x) : "c"(crypto_uint16_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("and %w0,%w0,65535\n lsr %w0,%w0,%w1" : "+&r"(crypto_uint16_x) : "r"(crypto_uint16_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %0,%0,#15\n uxth %1,%1\n lsr %1,%1,%0" : "+&r"(crypto_uint16_s), "+r"(crypto_uint16_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("and %0,15,%0\n srl %1,%0,%1" : "+&r"(crypto_uint16_s), "+r"(crypto_uint16_x) : : ); #else crypto_uint16_x >>= crypto_uint16_s ^ crypto_uint16_signed_optblocker; #endif return crypto_uint16_bottombit_01(crypto_uint16_x); } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_shlmod(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_s) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16_s &= 15; __asm__ ("shlw %%cl,%0" : "+r"(crypto_uint16_x) : "c"(crypto_uint16_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16_s &= 15; __asm__ ("and %w0,%w0,65535\n lsl %w0,%w0,%w1" : "+&r"(crypto_uint16_x) : "r"(crypto_uint16_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint16_s &= 15; __asm__ ("lsl %0,%0,%1\n uxth %0,%0" : "+r"(crypto_uint16_x) : "r"(crypto_uint16_s) : ); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint16_s &= 15; __asm__ ("sll %0,%1,%0\n sll %0,16,%0\n srl %0,16,%0" : "+r"(crypto_uint16_x) : "r"(crypto_uint16_s) : ); #else int crypto_uint16_k, crypto_uint16_l; for (crypto_uint16_l = 0,crypto_uint16_k = 1;crypto_uint16_k < 16;++crypto_uint16_l,crypto_uint16_k *= 2) crypto_uint16_x ^= (crypto_uint16_x ^ (crypto_uint16_x << crypto_uint16_k)) & crypto_uint16_bitinrangepublicpos_mask(crypto_uint16_s,crypto_uint16_l); #endif return crypto_uint16_x; } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_shrmod(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_s) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16_s &= 15; __asm__ ("shrw %%cl,%0" : "+r"(crypto_uint16_x) : "c"(crypto_uint16_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16_s &= 15; __asm__ ("and %w0,%w0,65535\n lsr %w0,%w0,%w1" : "+&r"(crypto_uint16_x) : "r"(crypto_uint16_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint16_s &= 15; __asm__ ("uxth %0,%0\n lsr %0,%0,%1" : "+&r"(crypto_uint16_x) : "r"(crypto_uint16_s) : ); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint16_s &= 15; __asm__ ("srl %0,%1,%0" : "+r"(crypto_uint16_x) : "r"(crypto_uint16_s) : ); #else int crypto_uint16_k, crypto_uint16_l; for (crypto_uint16_l = 0,crypto_uint16_k = 1;crypto_uint16_k < 16;++crypto_uint16_l,crypto_uint16_k *= 2) crypto_uint16_x ^= (crypto_uint16_x ^ (crypto_uint16_x >> crypto_uint16_k)) & crypto_uint16_bitinrangepublicpos_mask(crypto_uint16_s,crypto_uint16_l); #endif return crypto_uint16_x; } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_bitmod_mask(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_s) { crypto_uint16_x = crypto_uint16_shrmod(crypto_uint16_x,crypto_uint16_s); return crypto_uint16_bottombit_mask(crypto_uint16_x); } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_bitmod_01(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_s) { crypto_uint16_x = crypto_uint16_shrmod(crypto_uint16_x,crypto_uint16_s); return crypto_uint16_bottombit_01(crypto_uint16_x); } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_nonzero_mask(crypto_uint16 crypto_uint16_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 crypto_uint16_q,crypto_uint16_z; __asm__ ("xorw %0,%0\n movw $-1,%1\n testw %2,%2\n cmovnew %1,%0" : "=&r"(crypto_uint16_z), "=&r"(crypto_uint16_q) : "r"(crypto_uint16_x) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_z; __asm__ ("tst %w1,65535\n csetm %w0,ne" : "=r"(crypto_uint16_z) : "r"(crypto_uint16_x) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("uxth %0,%0\n cmp %0,#0\n movne %0,#-1" : "+r"(crypto_uint16_x) : : "cc"); return crypto_uint16_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint16 crypto_uint16_z; __asm__ ("sll %0,16,%0\n srl %0,16,%0\n cmp %%g0,%0\n subx %%g0,0,%1" : "+r"(crypto_uint16_x), "=r"(crypto_uint16_z) : : "cc"); return crypto_uint16_z; #else crypto_uint16_x |= -crypto_uint16_x; return crypto_uint16_signed_negative_mask(crypto_uint16_x); #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_nonzero_01(crypto_uint16 crypto_uint16_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 crypto_uint16_q,crypto_uint16_z; __asm__ ("xorw %0,%0\n movw $1,%1\n testw %2,%2\n cmovnew %1,%0" : "=&r"(crypto_uint16_z), "=&r"(crypto_uint16_q) : "r"(crypto_uint16_x) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_z; __asm__ ("tst %w1,65535\n cset %w0,ne" : "=r"(crypto_uint16_z) : "r"(crypto_uint16_x) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("uxth %0,%0\n cmp %0,#0\n movne %0,#1" : "+r"(crypto_uint16_x) : : "cc"); return crypto_uint16_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint16 crypto_uint16_z; __asm__ ("sll %0,16,%0\n srl %0,16,%0\n cmp %%g0,%0\n addx %%g0,0,%1" : "+r"(crypto_uint16_x), "=r"(crypto_uint16_z) : : "cc"); return crypto_uint16_z; #else crypto_uint16_x |= -crypto_uint16_x; return crypto_uint16_topbit_01(crypto_uint16_x); #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_zero_mask(crypto_uint16 crypto_uint16_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 crypto_uint16_q,crypto_uint16_z; __asm__ ("xorw %0,%0\n movw $-1,%1\n testw %2,%2\n cmovew %1,%0" : "=&r"(crypto_uint16_z), "=&r"(crypto_uint16_q) : "r"(crypto_uint16_x) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_z; __asm__ ("tst %w1,65535\n csetm %w0,eq" : "=r"(crypto_uint16_z) : "r"(crypto_uint16_x) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint16 crypto_uint16_z; __asm__ ("sll %0,16,%0\n srl %0,16,%0\n cmp %%g0,%0\n addx %%g0,-1,%1" : "+r"(crypto_uint16_x), "=r"(crypto_uint16_z) : : "cc"); return crypto_uint16_z; #else return ~crypto_uint16_nonzero_mask(crypto_uint16_x); #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_zero_01(crypto_uint16 crypto_uint16_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 crypto_uint16_q,crypto_uint16_z; __asm__ ("xorw %0,%0\n movw $1,%1\n testw %2,%2\n cmovew %1,%0" : "=&r"(crypto_uint16_z), "=&r"(crypto_uint16_q) : "r"(crypto_uint16_x) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_z; __asm__ ("tst %w1,65535\n cset %w0,eq" : "=r"(crypto_uint16_z) : "r"(crypto_uint16_x) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint16 crypto_uint16_z; __asm__ ("sll %0,16,%0\n srl %0,16,%0\n cmp %%g0,%0\n subx %%g0,-1,%1" : "+r"(crypto_uint16_x), "=r"(crypto_uint16_z) : : "cc"); return crypto_uint16_z; #else return 1-crypto_uint16_nonzero_01(crypto_uint16_x); #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_unequal_mask(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 crypto_uint16_q,crypto_uint16_z; __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovnew %1,%0" : "=&r"(crypto_uint16_z), "=&r"(crypto_uint16_q) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_z; __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n csetm %w0,ne" : "=&r"(crypto_uint16_z) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #else return crypto_uint16_nonzero_mask(crypto_uint16_x ^ crypto_uint16_y); #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_unequal_01(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 crypto_uint16_q,crypto_uint16_z; __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovnew %1,%0" : "=&r"(crypto_uint16_z), "=&r"(crypto_uint16_q) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_z; __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n cset %w0,ne" : "=&r"(crypto_uint16_z) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #else return crypto_uint16_nonzero_01(crypto_uint16_x ^ crypto_uint16_y); #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_equal_mask(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 crypto_uint16_q,crypto_uint16_z; __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovew %1,%0" : "=&r"(crypto_uint16_z), "=&r"(crypto_uint16_q) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_z; __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n csetm %w0,eq" : "=&r"(crypto_uint16_z) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #else return crypto_uint16_zero_mask(crypto_uint16_x ^ crypto_uint16_y); #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_equal_01(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 crypto_uint16_q,crypto_uint16_z; __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovew %1,%0" : "=&r"(crypto_uint16_z), "=&r"(crypto_uint16_q) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_z; __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n cset %w0,eq" : "=&r"(crypto_uint16_z) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #else return crypto_uint16_zero_01(crypto_uint16_x ^ crypto_uint16_y); #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_min(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("cmpw %1,%0\n cmovaw %1,%0" : "+r"(crypto_uint16_x) : "r"(crypto_uint16_y) : "cc"); return crypto_uint16_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("and %w0,%w0,65535\n cmp %w0,%w1,uxth\n csel %w0,%w0,%w1,lo" : "+&r"(crypto_uint16_x) : "r"(crypto_uint16_y) : "cc"); return crypto_uint16_x; #else crypto_uint16 crypto_uint16_r = crypto_uint16_y ^ crypto_uint16_x; crypto_uint16 crypto_uint16_z = crypto_uint16_y - crypto_uint16_x; crypto_uint16_z ^= crypto_uint16_r & (crypto_uint16_z ^ crypto_uint16_y ^ (((crypto_uint16) 1) << (16-1))); crypto_uint16_z = crypto_uint16_signed_negative_mask(crypto_uint16_z); crypto_uint16_z &= crypto_uint16_r; return crypto_uint16_x ^ crypto_uint16_z; #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_max(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("cmpw %1,%0\n cmovbw %1,%0" : "+r"(crypto_uint16_x) : "r"(crypto_uint16_y) : "cc"); return crypto_uint16_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("and %w0,%w0,65535\n cmp %w0,%w1,uxth\n csel %w0,%w1,%w0,lo" : "+&r"(crypto_uint16_x) : "r"(crypto_uint16_y) : "cc"); return crypto_uint16_x; #else crypto_uint16 crypto_uint16_r = crypto_uint16_y ^ crypto_uint16_x; crypto_uint16 crypto_uint16_z = crypto_uint16_y - crypto_uint16_x; crypto_uint16_z ^= crypto_uint16_r & (crypto_uint16_z ^ crypto_uint16_y ^ (((crypto_uint16) 1) << (16-1))); crypto_uint16_z = crypto_uint16_signed_negative_mask(crypto_uint16_z); crypto_uint16_z &= crypto_uint16_r; return crypto_uint16_y ^ crypto_uint16_z; #endif } __attribute__((unused)) static inline void crypto_uint16_minmax(crypto_uint16 *crypto_uint16_p,crypto_uint16 *crypto_uint16_q) { crypto_uint16 crypto_uint16_x = *crypto_uint16_p; crypto_uint16 crypto_uint16_y = *crypto_uint16_q; #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 crypto_uint16_z; __asm__ ("cmpw %2,%1\n movw %1,%0\n cmovaw %2,%1\n cmovaw %0,%2" : "=&r"(crypto_uint16_z), "+&r"(crypto_uint16_x), "+r"(crypto_uint16_y) : : "cc"); *crypto_uint16_p = crypto_uint16_x; *crypto_uint16_q = crypto_uint16_y; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_r, crypto_uint16_s; __asm__ ("and %w0,%w0,65535\n cmp %w0,%w3,uxth\n csel %w1,%w0,%w3,lo\n csel %w2,%w3,%w0,lo" : "+&r"(crypto_uint16_x), "=&r"(crypto_uint16_r), "=r"(crypto_uint16_s) : "r"(crypto_uint16_y) : "cc"); *crypto_uint16_p = crypto_uint16_r; *crypto_uint16_q = crypto_uint16_s; #else crypto_uint16 crypto_uint16_r = crypto_uint16_y ^ crypto_uint16_x; crypto_uint16 crypto_uint16_z = crypto_uint16_y - crypto_uint16_x; crypto_uint16_z ^= crypto_uint16_r & (crypto_uint16_z ^ crypto_uint16_y ^ (((crypto_uint16) 1) << (16-1))); crypto_uint16_z = crypto_uint16_signed_negative_mask(crypto_uint16_z); crypto_uint16_z &= crypto_uint16_r; crypto_uint16_x ^= crypto_uint16_z; crypto_uint16_y ^= crypto_uint16_z; *crypto_uint16_p = crypto_uint16_x; *crypto_uint16_q = crypto_uint16_y; #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_smaller_mask(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 crypto_uint16_q,crypto_uint16_z; __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovbw %1,%0" : "=&r"(crypto_uint16_z), "=&r"(crypto_uint16_q) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_z; __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n csetm %w0,lo" : "=&r"(crypto_uint16_z) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #else crypto_uint16 crypto_uint16_r = crypto_uint16_x ^ crypto_uint16_y; crypto_uint16 crypto_uint16_z = crypto_uint16_x - crypto_uint16_y; crypto_uint16_z ^= crypto_uint16_r & (crypto_uint16_z ^ crypto_uint16_x ^ (((crypto_uint16) 1) << (16-1))); return crypto_uint16_signed_negative_mask(crypto_uint16_z); #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_smaller_01(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 crypto_uint16_q,crypto_uint16_z; __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovbw %1,%0" : "=&r"(crypto_uint16_z), "=&r"(crypto_uint16_q) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_z; __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n cset %w0,lo" : "=&r"(crypto_uint16_z) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #else crypto_uint16 crypto_uint16_r = crypto_uint16_x ^ crypto_uint16_y; crypto_uint16 crypto_uint16_z = crypto_uint16_x - crypto_uint16_y; crypto_uint16_z ^= crypto_uint16_r & (crypto_uint16_z ^ crypto_uint16_x ^ (((crypto_uint16) 1) << (16-1))); return crypto_uint16_topbit_01(crypto_uint16_z); #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_leq_mask(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 crypto_uint16_q,crypto_uint16_z; __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovbew %1,%0" : "=&r"(crypto_uint16_z), "=&r"(crypto_uint16_q) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_z; __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n csetm %w0,ls" : "=&r"(crypto_uint16_z) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #else return ~crypto_uint16_smaller_mask(crypto_uint16_y,crypto_uint16_x); #endif } __attribute__((unused)) static inline crypto_uint16 crypto_uint16_leq_01(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 crypto_uint16_q,crypto_uint16_z; __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovbew %1,%0" : "=&r"(crypto_uint16_z), "=&r"(crypto_uint16_q) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint16 crypto_uint16_z; __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n cset %w0,ls" : "=&r"(crypto_uint16_z) : "r"(crypto_uint16_x), "r"(crypto_uint16_y) : "cc"); return crypto_uint16_z; #else return 1-crypto_uint16_smaller_01(crypto_uint16_y,crypto_uint16_x); #endif } __attribute__((unused)) static inline int crypto_uint16_ones_num(crypto_uint16 crypto_uint16_x) { crypto_uint16 crypto_uint16_y = crypto_uint16_x; const crypto_uint16 C0 = 0x5555; const crypto_uint16 C1 = 0x3333; const crypto_uint16 C2 = 0x0f0f; crypto_uint16_y -= ((crypto_uint16_y >> 1) & C0); crypto_uint16_y = (crypto_uint16_y & C1) + ((crypto_uint16_y >> 2) & C1); crypto_uint16_y = (crypto_uint16_y + (crypto_uint16_y >> 4)) & C2; crypto_uint16_y = (crypto_uint16_y + (crypto_uint16_y >> 8)) & 0xff; return crypto_uint16_y; } __attribute__((unused)) static inline int crypto_uint16_bottomzeros_num(crypto_uint16 crypto_uint16_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint16 fallback = 16; __asm__ ("bsfw %0,%0\n cmovew %1,%0" : "+&r"(crypto_uint16_x) : "r"(fallback) : "cc"); return crypto_uint16_x; #elif defined(__GNUC__) && defined(__aarch64__) int64_t crypto_uint16_y; __asm__ ("orr %w0,%w1,-65536\n rbit %w0,%w0\n clz %w0,%w0" : "=r"(crypto_uint16_y) : "r"(crypto_uint16_x) : ); return crypto_uint16_y; #else crypto_uint16 crypto_uint16_y = crypto_uint16_x ^ (crypto_uint16_x-1); crypto_uint16_y = ((crypto_uint16_signed) crypto_uint16_y) >> 1; crypto_uint16_y &= ~(crypto_uint16_x & (((crypto_uint16) 1) << (16-1))); return crypto_uint16_ones_num(crypto_uint16_y); #endif } #endif tinyssh-20250501/cryptoint/crypto_uint32.h000066400000000000000000000615571500472222400204170ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #ifndef crypto_uint32_h #define crypto_uint32_h #include #define crypto_uint32 uint32_t #define crypto_uint32_signed int32_t #define crypto_uint32_signed_optblocker tinyssh_uint32_signed_optblocker extern volatile crypto_uint32_signed crypto_uint32_signed_optblocker; __attribute__((unused)) static inline crypto_uint32 crypto_uint32_load(const unsigned char *crypto_uint32_s) { crypto_uint32 crypto_uint32_z = 0; crypto_uint32_z |= ((crypto_uint32) (*crypto_uint32_s++)) << 0; crypto_uint32_z |= ((crypto_uint32) (*crypto_uint32_s++)) << 8; crypto_uint32_z |= ((crypto_uint32) (*crypto_uint32_s++)) << 16; crypto_uint32_z |= ((crypto_uint32) (*crypto_uint32_s++)) << 24; return crypto_uint32_z; } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_load_bigendian(const unsigned char *crypto_uint32_s) { crypto_uint32 crypto_uint32_z = 0; crypto_uint32_z |= ((crypto_uint32) (*crypto_uint32_s++)) << 24; crypto_uint32_z |= ((crypto_uint32) (*crypto_uint32_s++)) << 16; crypto_uint32_z |= ((crypto_uint32) (*crypto_uint32_s++)) << 8; crypto_uint32_z |= ((crypto_uint32) (*crypto_uint32_s++)) << 0; return crypto_uint32_z; } __attribute__((unused)) static inline void crypto_uint32_store(unsigned char *crypto_uint32_s,crypto_uint32 crypto_uint32_x) { *crypto_uint32_s++ = crypto_uint32_x >> 0; *crypto_uint32_s++ = crypto_uint32_x >> 8; *crypto_uint32_s++ = crypto_uint32_x >> 16; *crypto_uint32_s++ = crypto_uint32_x >> 24; } __attribute__((unused)) static inline void crypto_uint32_store_bigendian(unsigned char *crypto_uint32_s,crypto_uint32 crypto_uint32_x) { *crypto_uint32_s++ = crypto_uint32_x >> 24; *crypto_uint32_s++ = crypto_uint32_x >> 16; *crypto_uint32_s++ = crypto_uint32_x >> 8; *crypto_uint32_s++ = crypto_uint32_x >> 0; } __attribute__((unused)) static inline crypto_uint32_signed crypto_uint32_signed_negative_mask(crypto_uint32_signed crypto_uint32_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarl $31,%0" : "+r"(crypto_uint32_x) : : "cc"); return crypto_uint32_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32_signed crypto_uint32_y; __asm__ ("asr %w0,%w1,31" : "=r"(crypto_uint32_y) : "r"(crypto_uint32_x) : ); return crypto_uint32_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint32_signed crypto_uint32_y; __asm__ ("asr %0,%1,#31" : "=r"(crypto_uint32_y) : "r"(crypto_uint32_x) : ); return crypto_uint32_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint32_signed crypto_uint32_y; __asm__ ("sra %1,31,%0" : "=r"(crypto_uint32_y) : "r"(crypto_uint32_x) : ); return crypto_uint32_y; #else crypto_uint32_x >>= 32-6; crypto_uint32_x += crypto_uint32_signed_optblocker; crypto_uint32_x >>= 5; return crypto_uint32_x; #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_topbit_01(crypto_uint32 crypto_uint32_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrl $31,%0" : "+r"(crypto_uint32_x) : : "cc"); return crypto_uint32_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_y; __asm__ ("lsr %w0,%w1,31" : "=r"(crypto_uint32_y) : "r"(crypto_uint32_x) : ); return crypto_uint32_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint32_signed crypto_uint32_y; __asm__ ("lsr %0,%1,#31" : "=r"(crypto_uint32_y) : "r"(crypto_uint32_x) : ); return crypto_uint32_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint32 crypto_uint32_y; __asm__ ("srl %1,31,%0" : "=r"(crypto_uint32_y) : "r"(crypto_uint32_x) : ); return crypto_uint32_y; #else crypto_uint32_x >>= 32-6; crypto_uint32_x += crypto_uint32_signed_optblocker; crypto_uint32_x >>= 5; return crypto_uint32_x; #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_topbit_mask(crypto_uint32 crypto_uint32_x) { return crypto_uint32_signed_negative_mask(crypto_uint32_x); } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_bottombit_mask(crypto_uint32 crypto_uint32_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andl $1,%0" : "+r"(crypto_uint32_x) : : "cc"); return -crypto_uint32_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_y; __asm__ ("sbfx %w0,%w1,0,1" : "=r"(crypto_uint32_y) : "r"(crypto_uint32_x) : ); return crypto_uint32_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint32 crypto_uint32_y; __asm__ ("and %0,%1,#1\n neg %0,%0" : "=r"(crypto_uint32_y) : "r"(crypto_uint32_x) : ); return crypto_uint32_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint32 crypto_uint32_y; __asm__ ("and %1,1,%0\n neg %0,%0" : "=r"(crypto_uint32_y) : "r"(crypto_uint32_x) : ); return crypto_uint32_y; #else crypto_uint32_x &= 1 + crypto_uint32_signed_optblocker; return -crypto_uint32_x; #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_bottombit_01(crypto_uint32 crypto_uint32_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andl $1,%0" : "+r"(crypto_uint32_x) : : "cc"); return crypto_uint32_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_y; __asm__ ("ubfx %w0,%w1,0,1" : "=r"(crypto_uint32_y) : "r"(crypto_uint32_x) : ); return crypto_uint32_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint32 crypto_uint32_y; __asm__ ("and %0,%1,#1" : "=r"(crypto_uint32_y) : "r"(crypto_uint32_x) : ); return crypto_uint32_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint32 crypto_uint32_y; __asm__ ("and %1,1,%0" : "=r"(crypto_uint32_y) : "r"(crypto_uint32_x) : ); return crypto_uint32_y; #else crypto_uint32_x &= 1 + crypto_uint32_signed_optblocker; return crypto_uint32_x; #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_bitinrangepublicpos_mask(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrl %%cl,%0" : "+r"(crypto_uint32_x) : "c"(crypto_uint32_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("lsr %w0,%w0,%w1" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %0,%0,#31\n lsr %1,%1,%0" : "+&r"(crypto_uint32_s), "+r"(crypto_uint32_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("srl %0,%1,%0" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_s) : ); #else crypto_uint32_x >>= crypto_uint32_s ^ crypto_uint32_signed_optblocker; #endif return crypto_uint32_bottombit_mask(crypto_uint32_x); } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_bitinrangepublicpos_01(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrl %%cl,%0" : "+r"(crypto_uint32_x) : "c"(crypto_uint32_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("lsr %w0,%w0,%w1" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %0,%0,#31\n lsr %1,%1,%0" : "+&r"(crypto_uint32_s), "+r"(crypto_uint32_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("srl %0,%1,%0" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_s) : ); #else crypto_uint32_x >>= crypto_uint32_s ^ crypto_uint32_signed_optblocker; #endif return crypto_uint32_bottombit_01(crypto_uint32_x); } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_shlmod(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shll %%cl,%0" : "+r"(crypto_uint32_x) : "c"(crypto_uint32_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("lsl %w0,%w0,%w1" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint32_s &= 31; __asm__ ("lsl %0,%0,%1" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_s) : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("sll %0,%1,%0" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_s) : ); #else int crypto_uint32_k, crypto_uint32_l; for (crypto_uint32_l = 0,crypto_uint32_k = 1;crypto_uint32_k < 32;++crypto_uint32_l,crypto_uint32_k *= 2) crypto_uint32_x ^= (crypto_uint32_x ^ (crypto_uint32_x << crypto_uint32_k)) & crypto_uint32_bitinrangepublicpos_mask(crypto_uint32_s,crypto_uint32_l); #endif return crypto_uint32_x; } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_shrmod(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrl %%cl,%0" : "+r"(crypto_uint32_x) : "c"(crypto_uint32_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("lsr %w0,%w0,%w1" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint32_s &= 31; __asm__ ("lsr %0,%0,%1" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_s) : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("srl %0,%1,%0" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_s) : ); #else int crypto_uint32_k, crypto_uint32_l; for (crypto_uint32_l = 0,crypto_uint32_k = 1;crypto_uint32_k < 32;++crypto_uint32_l,crypto_uint32_k *= 2) crypto_uint32_x ^= (crypto_uint32_x ^ (crypto_uint32_x >> crypto_uint32_k)) & crypto_uint32_bitinrangepublicpos_mask(crypto_uint32_s,crypto_uint32_l); #endif return crypto_uint32_x; } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_bitmod_mask(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_s) { crypto_uint32_x = crypto_uint32_shrmod(crypto_uint32_x,crypto_uint32_s); return crypto_uint32_bottombit_mask(crypto_uint32_x); } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_bitmod_01(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_s) { crypto_uint32_x = crypto_uint32_shrmod(crypto_uint32_x,crypto_uint32_s); return crypto_uint32_bottombit_01(crypto_uint32_x); } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_nonzero_mask(crypto_uint32 crypto_uint32_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 crypto_uint32_q,crypto_uint32_z; __asm__ ("xorl %0,%0\n movl $-1,%1\n testl %2,%2\n cmovnel %1,%0" : "=&r"(crypto_uint32_z), "=&r"(crypto_uint32_q) : "r"(crypto_uint32_x) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %w1,0\n csetm %w0,ne" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("cmp %0,#0\n movne %0,#-1" : "+r"(crypto_uint32_x) : : "cc"); return crypto_uint32_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %%g0,%1\n subx %%g0,0,%0" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x) : "cc"); return crypto_uint32_z; #else crypto_uint32_x |= -crypto_uint32_x; return crypto_uint32_signed_negative_mask(crypto_uint32_x); #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_nonzero_01(crypto_uint32 crypto_uint32_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 crypto_uint32_q,crypto_uint32_z; __asm__ ("xorl %0,%0\n movl $1,%1\n testl %2,%2\n cmovnel %1,%0" : "=&r"(crypto_uint32_z), "=&r"(crypto_uint32_q) : "r"(crypto_uint32_x) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %w1,0\n cset %w0,ne" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("cmp %0,#0\n movne %0,#1" : "+r"(crypto_uint32_x) : : "cc"); return crypto_uint32_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %%g0,%1\n addx %%g0,0,%0" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x) : "cc"); return crypto_uint32_z; #else crypto_uint32_x |= -crypto_uint32_x; return crypto_uint32_topbit_01(crypto_uint32_x); #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_zero_mask(crypto_uint32 crypto_uint32_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 crypto_uint32_q,crypto_uint32_z; __asm__ ("xorl %0,%0\n movl $-1,%1\n testl %2,%2\n cmovel %1,%0" : "=&r"(crypto_uint32_z), "=&r"(crypto_uint32_q) : "r"(crypto_uint32_x) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %w1,0\n csetm %w0,eq" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %%g0,%1\n addx %%g0,-1,%0" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x) : "cc"); return crypto_uint32_z; #else return ~crypto_uint32_nonzero_mask(crypto_uint32_x); #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_zero_01(crypto_uint32 crypto_uint32_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 crypto_uint32_q,crypto_uint32_z; __asm__ ("xorl %0,%0\n movl $1,%1\n testl %2,%2\n cmovel %1,%0" : "=&r"(crypto_uint32_z), "=&r"(crypto_uint32_q) : "r"(crypto_uint32_x) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %w1,0\n cset %w0,eq" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %%g0,%1\n subx %%g0,-1,%0" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x) : "cc"); return crypto_uint32_z; #else return 1-crypto_uint32_nonzero_01(crypto_uint32_x); #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_unequal_mask(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 crypto_uint32_q,crypto_uint32_z; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovnel %1,%0" : "=&r"(crypto_uint32_z), "=&r"(crypto_uint32_q) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %w1,%w2\n csetm %w0,ne" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #else return crypto_uint32_nonzero_mask(crypto_uint32_x ^ crypto_uint32_y); #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_unequal_01(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 crypto_uint32_q,crypto_uint32_z; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovnel %1,%0" : "=&r"(crypto_uint32_z), "=&r"(crypto_uint32_q) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %w1,%w2\n cset %w0,ne" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #else return crypto_uint32_nonzero_01(crypto_uint32_x ^ crypto_uint32_y); #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_equal_mask(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 crypto_uint32_q,crypto_uint32_z; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovel %1,%0" : "=&r"(crypto_uint32_z), "=&r"(crypto_uint32_q) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %w1,%w2\n csetm %w0,eq" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #else return crypto_uint32_zero_mask(crypto_uint32_x ^ crypto_uint32_y); #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_equal_01(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 crypto_uint32_q,crypto_uint32_z; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovel %1,%0" : "=&r"(crypto_uint32_z), "=&r"(crypto_uint32_q) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %w1,%w2\n cset %w0,eq" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #else return crypto_uint32_zero_01(crypto_uint32_x ^ crypto_uint32_y); #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_min(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("cmpl %1,%0\n cmoval %1,%0" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_y) : "cc"); return crypto_uint32_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("cmp %w0,%w1\n csel %w0,%w0,%w1,lo" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_y) : "cc"); return crypto_uint32_x; #else crypto_uint32 crypto_uint32_r = crypto_uint32_y ^ crypto_uint32_x; crypto_uint32 crypto_uint32_z = crypto_uint32_y - crypto_uint32_x; crypto_uint32_z ^= crypto_uint32_r & (crypto_uint32_z ^ crypto_uint32_y ^ (((crypto_uint32) 1) << (32-1))); crypto_uint32_z = crypto_uint32_signed_negative_mask(crypto_uint32_z); crypto_uint32_z &= crypto_uint32_r; return crypto_uint32_x ^ crypto_uint32_z; #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_max(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("cmpl %1,%0\n cmovbl %1,%0" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_y) : "cc"); return crypto_uint32_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("cmp %w0,%w1\n csel %w0,%w1,%w0,lo" : "+r"(crypto_uint32_x) : "r"(crypto_uint32_y) : "cc"); return crypto_uint32_x; #else crypto_uint32 crypto_uint32_r = crypto_uint32_y ^ crypto_uint32_x; crypto_uint32 crypto_uint32_z = crypto_uint32_y - crypto_uint32_x; crypto_uint32_z ^= crypto_uint32_r & (crypto_uint32_z ^ crypto_uint32_y ^ (((crypto_uint32) 1) << (32-1))); crypto_uint32_z = crypto_uint32_signed_negative_mask(crypto_uint32_z); crypto_uint32_z &= crypto_uint32_r; return crypto_uint32_y ^ crypto_uint32_z; #endif } __attribute__((unused)) static inline void crypto_uint32_minmax(crypto_uint32 *crypto_uint32_p,crypto_uint32 *crypto_uint32_q) { crypto_uint32 crypto_uint32_x = *crypto_uint32_p; crypto_uint32 crypto_uint32_y = *crypto_uint32_q; #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 crypto_uint32_z; __asm__ ("cmpl %2,%1\n movl %1,%0\n cmoval %2,%1\n cmoval %0,%2" : "=&r"(crypto_uint32_z), "+&r"(crypto_uint32_x), "+r"(crypto_uint32_y) : : "cc"); *crypto_uint32_p = crypto_uint32_x; *crypto_uint32_q = crypto_uint32_y; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_r, crypto_uint32_s; __asm__ ("cmp %w2,%w3\n csel %w0,%w2,%w3,lo\n csel %w1,%w3,%w2,lo" : "=&r"(crypto_uint32_r), "=r"(crypto_uint32_s) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); *crypto_uint32_p = crypto_uint32_r; *crypto_uint32_q = crypto_uint32_s; #else crypto_uint32 crypto_uint32_r = crypto_uint32_y ^ crypto_uint32_x; crypto_uint32 crypto_uint32_z = crypto_uint32_y - crypto_uint32_x; crypto_uint32_z ^= crypto_uint32_r & (crypto_uint32_z ^ crypto_uint32_y ^ (((crypto_uint32) 1) << (32-1))); crypto_uint32_z = crypto_uint32_signed_negative_mask(crypto_uint32_z); crypto_uint32_z &= crypto_uint32_r; crypto_uint32_x ^= crypto_uint32_z; crypto_uint32_y ^= crypto_uint32_z; *crypto_uint32_p = crypto_uint32_x; *crypto_uint32_q = crypto_uint32_y; #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_smaller_mask(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 crypto_uint32_q,crypto_uint32_z; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovbl %1,%0" : "=&r"(crypto_uint32_z), "=&r"(crypto_uint32_q) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %w1,%w2\n csetm %w0,lo" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #else crypto_uint32 crypto_uint32_r = crypto_uint32_x ^ crypto_uint32_y; crypto_uint32 crypto_uint32_z = crypto_uint32_x - crypto_uint32_y; crypto_uint32_z ^= crypto_uint32_r & (crypto_uint32_z ^ crypto_uint32_x ^ (((crypto_uint32) 1) << (32-1))); return crypto_uint32_signed_negative_mask(crypto_uint32_z); #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_smaller_01(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 crypto_uint32_q,crypto_uint32_z; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovbl %1,%0" : "=&r"(crypto_uint32_z), "=&r"(crypto_uint32_q) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %w1,%w2\n cset %w0,lo" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #else crypto_uint32 crypto_uint32_r = crypto_uint32_x ^ crypto_uint32_y; crypto_uint32 crypto_uint32_z = crypto_uint32_x - crypto_uint32_y; crypto_uint32_z ^= crypto_uint32_r & (crypto_uint32_z ^ crypto_uint32_x ^ (((crypto_uint32) 1) << (32-1))); return crypto_uint32_topbit_01(crypto_uint32_z); #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_leq_mask(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 crypto_uint32_q,crypto_uint32_z; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovbel %1,%0" : "=&r"(crypto_uint32_z), "=&r"(crypto_uint32_q) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %w1,%w2\n csetm %w0,ls" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #else return ~crypto_uint32_smaller_mask(crypto_uint32_y,crypto_uint32_x); #endif } __attribute__((unused)) static inline crypto_uint32 crypto_uint32_leq_01(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 crypto_uint32_q,crypto_uint32_z; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovbel %1,%0" : "=&r"(crypto_uint32_z), "=&r"(crypto_uint32_q) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint32 crypto_uint32_z; __asm__ ("cmp %w1,%w2\n cset %w0,ls" : "=r"(crypto_uint32_z) : "r"(crypto_uint32_x), "r"(crypto_uint32_y) : "cc"); return crypto_uint32_z; #else return 1-crypto_uint32_smaller_01(crypto_uint32_y,crypto_uint32_x); #endif } __attribute__((unused)) static inline int crypto_uint32_ones_num(crypto_uint32 crypto_uint32_x) { crypto_uint32 crypto_uint32_y = crypto_uint32_x; const crypto_uint32 C0 = 0x55555555; const crypto_uint32 C1 = 0x33333333; const crypto_uint32 C2 = 0x0f0f0f0f; crypto_uint32_y -= ((crypto_uint32_y >> 1) & C0); crypto_uint32_y = (crypto_uint32_y & C1) + ((crypto_uint32_y >> 2) & C1); crypto_uint32_y = (crypto_uint32_y + (crypto_uint32_y >> 4)) & C2; crypto_uint32_y += crypto_uint32_y >> 8; crypto_uint32_y = (crypto_uint32_y + (crypto_uint32_y >> 16)) & 0xff; return crypto_uint32_y; } __attribute__((unused)) static inline int crypto_uint32_bottomzeros_num(crypto_uint32 crypto_uint32_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint32 fallback = 32; __asm__ ("bsfl %0,%0\n cmovel %1,%0" : "+&r"(crypto_uint32_x) : "r"(fallback) : "cc"); return crypto_uint32_x; #elif defined(__GNUC__) && defined(__aarch64__) int64_t crypto_uint32_y; __asm__ ("rbit %w0,%w1\n clz %w0,%w0" : "=r"(crypto_uint32_y) : "r"(crypto_uint32_x) : ); return crypto_uint32_y; #else crypto_uint32 crypto_uint32_y = crypto_uint32_x ^ (crypto_uint32_x-1); crypto_uint32_y = ((crypto_uint32_signed) crypto_uint32_y) >> 1; crypto_uint32_y &= ~(crypto_uint32_x & (((crypto_uint32) 1) << (32-1))); return crypto_uint32_ones_num(crypto_uint32_y); #endif } #endif tinyssh-20250501/cryptoint/crypto_uint64.h000066400000000000000000000672461500472222400204250ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #ifndef crypto_uint64_h #define crypto_uint64_h #include #define crypto_uint64 uint64_t #define crypto_uint64_signed int64_t #define crypto_uint64_signed_optblocker tinyssh_uint64_signed_optblocker extern volatile crypto_uint64_signed crypto_uint64_signed_optblocker; __attribute__((unused)) static inline crypto_uint64 crypto_uint64_load(const unsigned char *crypto_uint64_s) { crypto_uint64 crypto_uint64_z = 0; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 0; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 8; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 16; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 24; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 32; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 40; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 48; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 56; return crypto_uint64_z; } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_load_bigendian(const unsigned char *crypto_uint64_s) { crypto_uint64 crypto_uint64_z = 0; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 56; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 48; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 40; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 32; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 24; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 16; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 8; crypto_uint64_z |= ((crypto_uint64) (*crypto_uint64_s++)) << 0; return crypto_uint64_z; } __attribute__((unused)) static inline void crypto_uint64_store(unsigned char *crypto_uint64_s,crypto_uint64 crypto_uint64_x) { *crypto_uint64_s++ = crypto_uint64_x >> 0; *crypto_uint64_s++ = crypto_uint64_x >> 8; *crypto_uint64_s++ = crypto_uint64_x >> 16; *crypto_uint64_s++ = crypto_uint64_x >> 24; *crypto_uint64_s++ = crypto_uint64_x >> 32; *crypto_uint64_s++ = crypto_uint64_x >> 40; *crypto_uint64_s++ = crypto_uint64_x >> 48; *crypto_uint64_s++ = crypto_uint64_x >> 56; } __attribute__((unused)) static inline void crypto_uint64_store_bigendian(unsigned char *crypto_uint64_s,crypto_uint64 crypto_uint64_x) { *crypto_uint64_s++ = crypto_uint64_x >> 56; *crypto_uint64_s++ = crypto_uint64_x >> 48; *crypto_uint64_s++ = crypto_uint64_x >> 40; *crypto_uint64_s++ = crypto_uint64_x >> 32; *crypto_uint64_s++ = crypto_uint64_x >> 24; *crypto_uint64_s++ = crypto_uint64_x >> 16; *crypto_uint64_s++ = crypto_uint64_x >> 8; *crypto_uint64_s++ = crypto_uint64_x >> 0; } __attribute__((unused)) static inline crypto_uint64_signed crypto_uint64_signed_negative_mask(crypto_uint64_signed crypto_uint64_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarq $63,%0" : "+r"(crypto_uint64_x) : : "cc"); return crypto_uint64_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64_signed crypto_uint64_y; __asm__ ("asr %0,%1,63" : "=r"(crypto_uint64_y) : "r"(crypto_uint64_x) : ); return crypto_uint64_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint64_signed crypto_uint64_y; __asm__ ("asr %Q0,%R1,#31\n mov %R0,%Q0" : "=r"(crypto_uint64_y) : "r"(crypto_uint64_x) : ); return crypto_uint64_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint64_signed crypto_uint64_y; __asm__ ("sra %H1,31,%L0\n mov %L0,%H0" : "=r"(crypto_uint64_y) : "r"(crypto_uint64_x) : ); return crypto_uint64_y; #else crypto_uint64_x >>= 64-6; crypto_uint64_x += crypto_uint64_signed_optblocker; crypto_uint64_x >>= 5; return crypto_uint64_x; #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_topbit_01(crypto_uint64 crypto_uint64_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrq $63,%0" : "+r"(crypto_uint64_x) : : "cc"); return crypto_uint64_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_y; __asm__ ("lsr %0,%1,63" : "=r"(crypto_uint64_y) : "r"(crypto_uint64_x) : ); return crypto_uint64_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint64_signed crypto_uint64_y; __asm__ ("lsr %Q0,%R1,#31\n mov %R0,#0" : "=r"(crypto_uint64_y) : "r"(crypto_uint64_x) : ); return crypto_uint64_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint64 crypto_uint64_y; __asm__ ("srl %H1,31,%L0\n mov 0,%H0" : "=r"(crypto_uint64_y) : "r"(crypto_uint64_x) : ); return crypto_uint64_y; #else crypto_uint64_x >>= 64-6; crypto_uint64_x += crypto_uint64_signed_optblocker; crypto_uint64_x >>= 5; return crypto_uint64_x; #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_topbit_mask(crypto_uint64 crypto_uint64_x) { return crypto_uint64_signed_negative_mask(crypto_uint64_x); } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_bottombit_mask(crypto_uint64 crypto_uint64_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andq $1,%0" : "+r"(crypto_uint64_x) : : "cc"); return -crypto_uint64_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_y; __asm__ ("sbfx %0,%1,0,1" : "=r"(crypto_uint64_y) : "r"(crypto_uint64_x) : ); return crypto_uint64_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint64 crypto_uint64_y; __asm__ ("and %Q0,%Q1,#1\n neg %Q0,%Q0\n mov %R0,%Q0" : "=r"(crypto_uint64_y) : "r"(crypto_uint64_x) : ); return crypto_uint64_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint64 crypto_uint64_y; __asm__ ("and %L1,1,%L0\n neg %L0,%L0\n mov %L0,%H0" : "=r"(crypto_uint64_y) : "r"(crypto_uint64_x) : ); return crypto_uint64_y; #else crypto_uint64_x &= 1 + crypto_uint64_signed_optblocker; return -crypto_uint64_x; #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_bottombit_01(crypto_uint64 crypto_uint64_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andq $1,%0" : "+r"(crypto_uint64_x) : : "cc"); return crypto_uint64_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_y; __asm__ ("ubfx %0,%1,0,1" : "=r"(crypto_uint64_y) : "r"(crypto_uint64_x) : ); return crypto_uint64_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint64 crypto_uint64_y; __asm__ ("and %Q0,%Q1,#1\n mov %R0,#0" : "=r"(crypto_uint64_y) : "r"(crypto_uint64_x) : ); return crypto_uint64_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint64 crypto_uint64_y; __asm__ ("and %L1,1,%L0\n mov 0,%H0" : "=r"(crypto_uint64_y) : "r"(crypto_uint64_x) : ); return crypto_uint64_y; #else crypto_uint64_x &= 1 + crypto_uint64_signed_optblocker; return crypto_uint64_x; #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_bitinrangepublicpos_mask(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrq %%cl,%0" : "+r"(crypto_uint64_x) : "c"(crypto_uint64_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("lsr %0,%0,%1" : "+r"(crypto_uint64_x) : "r"(crypto_uint64_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %Q0,%Q0,#63\n lsr %Q1,%Q1,%Q0\n rsb %R0,%Q0,#32\n orr %Q1,%Q1,%R1,lsl %R0\n sub %R0,%Q0,#32\n orr %Q1,%Q1,%R1,lsr %R0\n lsr %R1,%R1,%Q0" : "+&r"(crypto_uint64_s), "+r"(crypto_uint64_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint64 crypto_uint64_y, crypto_uint64_z; __asm__ ("not %L0,%H0\n sll %L0,26,%H1\n sll %H3,1,%L1\n srl %L3,%L0,%L2\n sll %L1,%H0,%L1\n srl %H3,%L0,%H2\n sra %H1,31,%H1\n or %L2,%L1,%L2\n xor %L2,%H2,%L1\n and %H1,%H2,%H3\n and %H1,%L1,%L1\n xor %H3,%H2,%H3\n xor %L2,%L1,%L3" : "+&r"(crypto_uint64_s), "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_y), "+r"(crypto_uint64_x) : : ); #else crypto_uint64_x >>= crypto_uint64_s ^ crypto_uint64_signed_optblocker; #endif return crypto_uint64_bottombit_mask(crypto_uint64_x); } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_bitinrangepublicpos_01(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrq %%cl,%0" : "+r"(crypto_uint64_x) : "c"(crypto_uint64_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("lsr %0,%0,%1" : "+r"(crypto_uint64_x) : "r"(crypto_uint64_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %Q0,%Q0,#63\n lsr %Q1,%Q1,%Q0\n rsb %R0,%Q0,#32\n orr %Q1,%Q1,%R1,lsl %R0\n sub %R0,%Q0,#32\n orr %Q1,%Q1,%R1,lsr %R0\n lsr %R1,%R1,%Q0" : "+&r"(crypto_uint64_s), "+r"(crypto_uint64_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint64 crypto_uint64_y, crypto_uint64_z; __asm__ ("not %L0,%H0\n sll %L0,26,%H1\n sll %H3,1,%L1\n srl %L3,%L0,%L2\n sll %L1,%H0,%L1\n srl %H3,%L0,%H2\n sra %H1,31,%H1\n or %L2,%L1,%L2\n xor %L2,%H2,%L1\n and %H1,%H2,%H3\n and %H1,%L1,%L1\n xor %H3,%H2,%H3\n xor %L2,%L1,%L3" : "+&r"(crypto_uint64_s), "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_y), "+r"(crypto_uint64_x) : : ); #else crypto_uint64_x >>= crypto_uint64_s ^ crypto_uint64_signed_optblocker; #endif return crypto_uint64_bottombit_01(crypto_uint64_x); } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_shlmod(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shlq %%cl,%0" : "+r"(crypto_uint64_x) : "c"(crypto_uint64_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("lsl %0,%0,%1" : "+r"(crypto_uint64_x) : "r"(crypto_uint64_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %Q0,%Q0,#63\n lsl %R1,%R1,%Q0\n sub %R0,%Q0,#32\n orr %R1,%R1,%Q1,lsl %R0\n rsb %R0,%Q0,#32\n orr %R1,%R1,%Q1,lsr %R0\n lsl %Q1,%Q1,%Q0" : "+&r"(crypto_uint64_s), "+r"(crypto_uint64_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint64 crypto_uint64_y, crypto_uint64_z; __asm__ ("not %L0,%H0\n sll %L0,26,%H1\n srl %L3,1,%L1\n sll %L3,%L0,%L2\n srl %L1,%H0,%L1\n sll %H3,%L0,%H2\n sra %H1,31,%H1\n or %H2,%L1,%H2\n xor %L2,%H2,%L1\n and %H1,%L2,%L3\n and %H1,%L1,%L1\n xor %L3,%L2,%L3\n xor %H2,%L1,%H3" : "+&r"(crypto_uint64_s), "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_y), "+r"(crypto_uint64_x) : : ); #else int crypto_uint64_k, crypto_uint64_l; for (crypto_uint64_l = 0,crypto_uint64_k = 1;crypto_uint64_k < 64;++crypto_uint64_l,crypto_uint64_k *= 2) crypto_uint64_x ^= (crypto_uint64_x ^ (crypto_uint64_x << crypto_uint64_k)) & crypto_uint64_bitinrangepublicpos_mask(crypto_uint64_s,crypto_uint64_l); #endif return crypto_uint64_x; } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_shrmod(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrq %%cl,%0" : "+r"(crypto_uint64_x) : "c"(crypto_uint64_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("lsr %0,%0,%1" : "+r"(crypto_uint64_x) : "r"(crypto_uint64_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %Q0,%Q0,#63\n lsr %Q1,%Q1,%Q0\n rsb %R0,%Q0,#32\n orr %Q1,%Q1,%R1,lsl %R0\n sub %R0,%Q0,#32\n orr %Q1,%Q1,%R1,lsr %R0\n lsr %R1,%R1,%Q0" : "+&r"(crypto_uint64_s), "+r"(crypto_uint64_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint64 crypto_uint64_y, crypto_uint64_z; __asm__ ("not %L0,%H0\n sll %L0,26,%H1\n sll %H3,1,%L1\n srl %L3,%L0,%L2\n sll %L1,%H0,%L1\n srl %H3,%L0,%H2\n sra %H1,31,%H1\n or %L2,%L1,%L2\n xor %L2,%H2,%L1\n and %H1,%H2,%H3\n and %H1,%L1,%L1\n xor %H3,%H2,%H3\n xor %L2,%L1,%L3" : "+&r"(crypto_uint64_s), "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_y), "+r"(crypto_uint64_x) : : ); #else int crypto_uint64_k, crypto_uint64_l; for (crypto_uint64_l = 0,crypto_uint64_k = 1;crypto_uint64_k < 64;++crypto_uint64_l,crypto_uint64_k *= 2) crypto_uint64_x ^= (crypto_uint64_x ^ (crypto_uint64_x >> crypto_uint64_k)) & crypto_uint64_bitinrangepublicpos_mask(crypto_uint64_s,crypto_uint64_l); #endif return crypto_uint64_x; } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_bitmod_mask(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_s) { crypto_uint64_x = crypto_uint64_shrmod(crypto_uint64_x,crypto_uint64_s); return crypto_uint64_bottombit_mask(crypto_uint64_x); } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_bitmod_01(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_s) { crypto_uint64_x = crypto_uint64_shrmod(crypto_uint64_x,crypto_uint64_s); return crypto_uint64_bottombit_01(crypto_uint64_x); } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_nonzero_mask(crypto_uint64 crypto_uint64_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 crypto_uint64_q,crypto_uint64_z; __asm__ ("xorq %0,%0\n movq $-1,%1\n testq %2,%2\n cmovneq %1,%0" : "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_q) : "r"(crypto_uint64_x) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_z; __asm__ ("cmp %1,0\n csetm %0,ne" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("orrs %Q0,%Q0,%R0\n movne %Q0,#-1\n mov %R0,%Q0" : "+r"(crypto_uint64_x) : : "cc"); return crypto_uint64_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint64 crypto_uint64_z; __asm__ ("or %L1,%H1,%L0\n cmp %%g0,%L0\n subx %%g0,0,%L0\n mov %L0,%H0" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x) : "cc"); return crypto_uint64_z; #else crypto_uint64_x |= -crypto_uint64_x; return crypto_uint64_signed_negative_mask(crypto_uint64_x); #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_nonzero_01(crypto_uint64 crypto_uint64_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 crypto_uint64_q,crypto_uint64_z; __asm__ ("xorq %0,%0\n movq $1,%1\n testq %2,%2\n cmovneq %1,%0" : "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_q) : "r"(crypto_uint64_x) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_z; __asm__ ("cmp %1,0\n cset %0,ne" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("orrs %Q0,%Q0,%R0\n movne %Q0,#1\n mov %R0,#0" : "+r"(crypto_uint64_x) : : "cc"); return crypto_uint64_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint64 crypto_uint64_z; __asm__ ("or %L1,%H1,%L0\n cmp %%g0,%L0\n addx %%g0,0,%L0\n mov 0,%H0" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x) : "cc"); return crypto_uint64_z; #else crypto_uint64_x |= -crypto_uint64_x; return crypto_uint64_topbit_01(crypto_uint64_x); #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_zero_mask(crypto_uint64 crypto_uint64_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 crypto_uint64_q,crypto_uint64_z; __asm__ ("xorq %0,%0\n movq $-1,%1\n testq %2,%2\n cmoveq %1,%0" : "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_q) : "r"(crypto_uint64_x) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_z; __asm__ ("cmp %1,0\n csetm %0,eq" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint64 crypto_uint64_z; __asm__ ("or %L1,%H1,%L0\n cmp %%g0,%L0\n addx %%g0,-1,%L0\n mov %L0,%H0" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x) : "cc"); return crypto_uint64_z; #else return ~crypto_uint64_nonzero_mask(crypto_uint64_x); #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_zero_01(crypto_uint64 crypto_uint64_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 crypto_uint64_q,crypto_uint64_z; __asm__ ("xorq %0,%0\n movq $1,%1\n testq %2,%2\n cmoveq %1,%0" : "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_q) : "r"(crypto_uint64_x) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_z; __asm__ ("cmp %1,0\n cset %0,eq" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint64 crypto_uint64_z; __asm__ ("or %L1,%H1,%L0\n cmp %%g0,%L0\n subx %%g0,-1,%L0\n mov 0,%H0" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x) : "cc"); return crypto_uint64_z; #else return 1-crypto_uint64_nonzero_01(crypto_uint64_x); #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_unequal_mask(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 crypto_uint64_q,crypto_uint64_z; __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmovneq %1,%0" : "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_q) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_z; __asm__ ("cmp %1,%2\n csetm %0,ne" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #else return crypto_uint64_nonzero_mask(crypto_uint64_x ^ crypto_uint64_y); #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_unequal_01(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 crypto_uint64_q,crypto_uint64_z; __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmovneq %1,%0" : "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_q) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_z; __asm__ ("cmp %1,%2\n cset %0,ne" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #else return crypto_uint64_nonzero_01(crypto_uint64_x ^ crypto_uint64_y); #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_equal_mask(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 crypto_uint64_q,crypto_uint64_z; __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmoveq %1,%0" : "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_q) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_z; __asm__ ("cmp %1,%2\n csetm %0,eq" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #else return crypto_uint64_zero_mask(crypto_uint64_x ^ crypto_uint64_y); #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_equal_01(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 crypto_uint64_q,crypto_uint64_z; __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmoveq %1,%0" : "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_q) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_z; __asm__ ("cmp %1,%2\n cset %0,eq" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #else return crypto_uint64_zero_01(crypto_uint64_x ^ crypto_uint64_y); #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_min(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("cmpq %1,%0\n cmovaq %1,%0" : "+r"(crypto_uint64_x) : "r"(crypto_uint64_y) : "cc"); return crypto_uint64_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("cmp %0,%1\n csel %0,%0,%1,lo" : "+r"(crypto_uint64_x) : "r"(crypto_uint64_y) : "cc"); return crypto_uint64_x; #else crypto_uint64 crypto_uint64_r = crypto_uint64_y ^ crypto_uint64_x; crypto_uint64 crypto_uint64_z = crypto_uint64_y - crypto_uint64_x; crypto_uint64_z ^= crypto_uint64_r & (crypto_uint64_z ^ crypto_uint64_y ^ (((crypto_uint64) 1) << (64-1))); crypto_uint64_z = crypto_uint64_signed_negative_mask(crypto_uint64_z); crypto_uint64_z &= crypto_uint64_r; return crypto_uint64_x ^ crypto_uint64_z; #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_max(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("cmpq %1,%0\n cmovbq %1,%0" : "+r"(crypto_uint64_x) : "r"(crypto_uint64_y) : "cc"); return crypto_uint64_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("cmp %0,%1\n csel %0,%1,%0,lo" : "+r"(crypto_uint64_x) : "r"(crypto_uint64_y) : "cc"); return crypto_uint64_x; #else crypto_uint64 crypto_uint64_r = crypto_uint64_y ^ crypto_uint64_x; crypto_uint64 crypto_uint64_z = crypto_uint64_y - crypto_uint64_x; crypto_uint64_z ^= crypto_uint64_r & (crypto_uint64_z ^ crypto_uint64_y ^ (((crypto_uint64) 1) << (64-1))); crypto_uint64_z = crypto_uint64_signed_negative_mask(crypto_uint64_z); crypto_uint64_z &= crypto_uint64_r; return crypto_uint64_y ^ crypto_uint64_z; #endif } __attribute__((unused)) static inline void crypto_uint64_minmax(crypto_uint64 *crypto_uint64_p,crypto_uint64 *crypto_uint64_q) { crypto_uint64 crypto_uint64_x = *crypto_uint64_p; crypto_uint64 crypto_uint64_y = *crypto_uint64_q; #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 crypto_uint64_z; __asm__ ("cmpq %2,%1\n movq %1,%0\n cmovaq %2,%1\n cmovaq %0,%2" : "=&r"(crypto_uint64_z), "+&r"(crypto_uint64_x), "+r"(crypto_uint64_y) : : "cc"); *crypto_uint64_p = crypto_uint64_x; *crypto_uint64_q = crypto_uint64_y; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_r, crypto_uint64_s; __asm__ ("cmp %2,%3\n csel %0,%2,%3,lo\n csel %1,%3,%2,lo" : "=&r"(crypto_uint64_r), "=r"(crypto_uint64_s) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); *crypto_uint64_p = crypto_uint64_r; *crypto_uint64_q = crypto_uint64_s; #else crypto_uint64 crypto_uint64_r = crypto_uint64_y ^ crypto_uint64_x; crypto_uint64 crypto_uint64_z = crypto_uint64_y - crypto_uint64_x; crypto_uint64_z ^= crypto_uint64_r & (crypto_uint64_z ^ crypto_uint64_y ^ (((crypto_uint64) 1) << (64-1))); crypto_uint64_z = crypto_uint64_signed_negative_mask(crypto_uint64_z); crypto_uint64_z &= crypto_uint64_r; crypto_uint64_x ^= crypto_uint64_z; crypto_uint64_y ^= crypto_uint64_z; *crypto_uint64_p = crypto_uint64_x; *crypto_uint64_q = crypto_uint64_y; #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_smaller_mask(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 crypto_uint64_q,crypto_uint64_z; __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmovbq %1,%0" : "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_q) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_z; __asm__ ("cmp %1,%2\n csetm %0,lo" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #else crypto_uint64 crypto_uint64_r = crypto_uint64_x ^ crypto_uint64_y; crypto_uint64 crypto_uint64_z = crypto_uint64_x - crypto_uint64_y; crypto_uint64_z ^= crypto_uint64_r & (crypto_uint64_z ^ crypto_uint64_x ^ (((crypto_uint64) 1) << (64-1))); return crypto_uint64_signed_negative_mask(crypto_uint64_z); #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_smaller_01(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 crypto_uint64_q,crypto_uint64_z; __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmovbq %1,%0" : "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_q) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_z; __asm__ ("cmp %1,%2\n cset %0,lo" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #else crypto_uint64 crypto_uint64_r = crypto_uint64_x ^ crypto_uint64_y; crypto_uint64 crypto_uint64_z = crypto_uint64_x - crypto_uint64_y; crypto_uint64_z ^= crypto_uint64_r & (crypto_uint64_z ^ crypto_uint64_x ^ (((crypto_uint64) 1) << (64-1))); return crypto_uint64_topbit_01(crypto_uint64_z); #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_leq_mask(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 crypto_uint64_q,crypto_uint64_z; __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmovbeq %1,%0" : "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_q) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_z; __asm__ ("cmp %1,%2\n csetm %0,ls" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #else return ~crypto_uint64_smaller_mask(crypto_uint64_y,crypto_uint64_x); #endif } __attribute__((unused)) static inline crypto_uint64 crypto_uint64_leq_01(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 crypto_uint64_q,crypto_uint64_z; __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmovbeq %1,%0" : "=&r"(crypto_uint64_z), "=&r"(crypto_uint64_q) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint64 crypto_uint64_z; __asm__ ("cmp %1,%2\n cset %0,ls" : "=r"(crypto_uint64_z) : "r"(crypto_uint64_x), "r"(crypto_uint64_y) : "cc"); return crypto_uint64_z; #else return 1-crypto_uint64_smaller_01(crypto_uint64_y,crypto_uint64_x); #endif } __attribute__((unused)) static inline int crypto_uint64_ones_num(crypto_uint64 crypto_uint64_x) { crypto_uint64 crypto_uint64_y = crypto_uint64_x; const crypto_uint64 C0 = 0x5555555555555555; const crypto_uint64 C1 = 0x3333333333333333; const crypto_uint64 C2 = 0x0f0f0f0f0f0f0f0f; crypto_uint64_y -= ((crypto_uint64_y >> 1) & C0); crypto_uint64_y = (crypto_uint64_y & C1) + ((crypto_uint64_y >> 2) & C1); crypto_uint64_y = (crypto_uint64_y + (crypto_uint64_y >> 4)) & C2; crypto_uint64_y += crypto_uint64_y >> 8; crypto_uint64_y += crypto_uint64_y >> 16; crypto_uint64_y = (crypto_uint64_y + (crypto_uint64_y >> 32)) & 0xff; return crypto_uint64_y; } __attribute__((unused)) static inline int crypto_uint64_bottomzeros_num(crypto_uint64 crypto_uint64_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint64 fallback = 64; __asm__ ("bsfq %0,%0\n cmoveq %1,%0" : "+&r"(crypto_uint64_x) : "r"(fallback) : "cc"); return crypto_uint64_x; #elif defined(__GNUC__) && defined(__aarch64__) int64_t crypto_uint64_y; __asm__ ("rbit %0,%1\n clz %0,%0" : "=r"(crypto_uint64_y) : "r"(crypto_uint64_x) : ); return crypto_uint64_y; #else crypto_uint64 crypto_uint64_y = crypto_uint64_x ^ (crypto_uint64_x-1); crypto_uint64_y = ((crypto_uint64_signed) crypto_uint64_y) >> 1; crypto_uint64_y &= ~(crypto_uint64_x & (((crypto_uint64) 1) << (64-1))); return crypto_uint64_ones_num(crypto_uint64_y); #endif } #endif tinyssh-20250501/cryptoint/crypto_uint8.h000066400000000000000000000642041500472222400203320ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #ifndef crypto_uint8_h #define crypto_uint8_h #include #define crypto_uint8 uint8_t #define crypto_uint8_signed int8_t #define crypto_uint8_signed_optblocker tinyssh_uint8_signed_optblocker extern volatile crypto_uint8_signed crypto_uint8_signed_optblocker; __attribute__((unused)) static inline crypto_uint8 crypto_uint8_load(const unsigned char *crypto_uint8_s) { crypto_uint8 crypto_uint8_z = 0; crypto_uint8_z |= ((crypto_uint8) (*crypto_uint8_s++)) << 0; return crypto_uint8_z; } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_load_bigendian(const unsigned char *crypto_uint8_s) { crypto_uint8 crypto_uint8_z = 0; crypto_uint8_z |= ((crypto_uint8) (*crypto_uint8_s++)) << 0; return crypto_uint8_z; } __attribute__((unused)) static inline void crypto_uint8_store(unsigned char *crypto_uint8_s,crypto_uint8 crypto_uint8_x) { *crypto_uint8_s++ = crypto_uint8_x >> 0; } __attribute__((unused)) static inline void crypto_uint8_store_bigendian(unsigned char *crypto_uint8_s,crypto_uint8 crypto_uint8_x) { *crypto_uint8_s++ = crypto_uint8_x >> 0; } __attribute__((unused)) static inline crypto_uint8_signed crypto_uint8_signed_negative_mask(crypto_uint8_signed crypto_uint8_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("sarb $7,%0" : "+r"(crypto_uint8_x) : : "cc"); return crypto_uint8_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8_signed crypto_uint8_y; __asm__ ("sbfx %w0,%w1,7,1" : "=r"(crypto_uint8_y) : "r"(crypto_uint8_x) : ); return crypto_uint8_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint8_signed crypto_uint8_y; __asm__ ("sxtb %0,%1\n asr %0,%0,#31" : "=r"(crypto_uint8_y) : "r"(crypto_uint8_x) : ); return crypto_uint8_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint8_signed crypto_uint8_y; __asm__ ("sll %1,24,%0\n sra %0,31,%0" : "=r"(crypto_uint8_y) : "r"(crypto_uint8_x) : ); return crypto_uint8_y; #else crypto_uint8_x >>= 8-6; crypto_uint8_x += crypto_uint8_signed_optblocker; crypto_uint8_x >>= 5; return crypto_uint8_x; #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_topbit_01(crypto_uint8 crypto_uint8_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrb $7,%0" : "+r"(crypto_uint8_x) : : "cc"); return crypto_uint8_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_y; __asm__ ("ubfx %w0,%w1,7,1" : "=r"(crypto_uint8_y) : "r"(crypto_uint8_x) : ); return crypto_uint8_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint8_signed crypto_uint8_y; __asm__ ("uxtb %0,%1\n lsr %0,%0,#7" : "=r"(crypto_uint8_y) : "r"(crypto_uint8_x) : ); return crypto_uint8_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint8 crypto_uint8_y; __asm__ ("and %1,255,%0\n srl %0,7,%0" : "=r"(crypto_uint8_y) : "r"(crypto_uint8_x) : ); return crypto_uint8_y; #else crypto_uint8_x >>= 8-6; crypto_uint8_x += crypto_uint8_signed_optblocker; crypto_uint8_x >>= 5; return crypto_uint8_x; #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_topbit_mask(crypto_uint8 crypto_uint8_x) { return crypto_uint8_signed_negative_mask(crypto_uint8_x); } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_bottombit_mask(crypto_uint8 crypto_uint8_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andb $1,%0" : "+r"(crypto_uint8_x) : : "cc"); return -crypto_uint8_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_y; __asm__ ("sbfx %w0,%w1,0,1" : "=r"(crypto_uint8_y) : "r"(crypto_uint8_x) : ); return crypto_uint8_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint8 crypto_uint8_y; __asm__ ("and %0,%1,#1\n neg %0,%0\n uxtb %0,%0" : "=r"(crypto_uint8_y) : "r"(crypto_uint8_x) : ); return crypto_uint8_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint8 crypto_uint8_y; __asm__ ("and %1,1,%0\n neg %0,%0\n and %0,255,%0" : "=r"(crypto_uint8_y) : "r"(crypto_uint8_x) : ); return crypto_uint8_y; #else crypto_uint8_x &= 1 + crypto_uint8_signed_optblocker; return -crypto_uint8_x; #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_bottombit_01(crypto_uint8 crypto_uint8_x) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("andb $1,%0" : "+r"(crypto_uint8_x) : : "cc"); return crypto_uint8_x; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_y; __asm__ ("ubfx %w0,%w1,0,1" : "=r"(crypto_uint8_y) : "r"(crypto_uint8_x) : ); return crypto_uint8_y; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint8 crypto_uint8_y; __asm__ ("and %0,%1,#1" : "=r"(crypto_uint8_y) : "r"(crypto_uint8_x) : ); return crypto_uint8_y; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint8 crypto_uint8_y; __asm__ ("and %1,1,%0" : "=r"(crypto_uint8_y) : "r"(crypto_uint8_x) : ); return crypto_uint8_y; #else crypto_uint8_x &= 1 + crypto_uint8_signed_optblocker; return crypto_uint8_x; #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_bitinrangepublicpos_mask(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrb %%cl,%0" : "+r"(crypto_uint8_x) : "c"(crypto_uint8_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("and %w0,%w0,255\n lsr %w0,%w0,%w1" : "+&r"(crypto_uint8_x) : "r"(crypto_uint8_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %0,%0,#7\n uxtb %1,%1\n lsr %1,%1,%0" : "+&r"(crypto_uint8_s), "+r"(crypto_uint8_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("and %0,7,%0\n srl %1,%0,%1" : "+&r"(crypto_uint8_s), "+r"(crypto_uint8_x) : : ); #else crypto_uint8_x >>= crypto_uint8_s ^ crypto_uint8_signed_optblocker; #endif return crypto_uint8_bottombit_mask(crypto_uint8_x); } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_bitinrangepublicpos_01(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_s) { #if defined(__GNUC__) && defined(__x86_64__) __asm__ ("shrb %%cl,%0" : "+r"(crypto_uint8_x) : "c"(crypto_uint8_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("and %w0,%w0,255\n lsr %w0,%w0,%w1" : "+&r"(crypto_uint8_x) : "r"(crypto_uint8_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("and %0,%0,#7\n uxtb %1,%1\n lsr %1,%1,%0" : "+&r"(crypto_uint8_s), "+r"(crypto_uint8_x) : : ); #elif defined(__GNUC__) && defined(__sparc_v8__) __asm__ ("and %0,7,%0\n srl %1,%0,%1" : "+&r"(crypto_uint8_s), "+r"(crypto_uint8_x) : : ); #else crypto_uint8_x >>= crypto_uint8_s ^ crypto_uint8_signed_optblocker; #endif return crypto_uint8_bottombit_01(crypto_uint8_x); } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_shlmod(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_s) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8_s &= 7; __asm__ ("shlb %%cl,%0" : "+r"(crypto_uint8_x) : "c"(crypto_uint8_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8_s &= 7; __asm__ ("and %w0,%w0,255\n lsl %w0,%w0,%w1" : "+&r"(crypto_uint8_x) : "r"(crypto_uint8_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint8_s &= 7; __asm__ ("lsl %0,%0,%1\n uxtb %0,%0" : "+r"(crypto_uint8_x) : "r"(crypto_uint8_s) : ); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint8_s &= 7; __asm__ ("sll %0,%1,%0\n and %0,255,%0" : "+r"(crypto_uint8_x) : "r"(crypto_uint8_s) : ); #else int crypto_uint8_k, crypto_uint8_l; for (crypto_uint8_l = 0,crypto_uint8_k = 1;crypto_uint8_k < 8;++crypto_uint8_l,crypto_uint8_k *= 2) crypto_uint8_x ^= (crypto_uint8_x ^ (crypto_uint8_x << crypto_uint8_k)) & crypto_uint8_bitinrangepublicpos_mask(crypto_uint8_s,crypto_uint8_l); #endif return crypto_uint8_x; } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_shrmod(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_s) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8_s &= 7; __asm__ ("shrb %%cl,%0" : "+r"(crypto_uint8_x) : "c"(crypto_uint8_s) : "cc"); #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8_s &= 7; __asm__ ("and %w0,%w0,255\n lsr %w0,%w0,%w1" : "+&r"(crypto_uint8_x) : "r"(crypto_uint8_s) : ); #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) crypto_uint8_s &= 7; __asm__ ("uxtb %0,%0\n lsr %0,%0,%1" : "+&r"(crypto_uint8_x) : "r"(crypto_uint8_s) : ); #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint8_s &= 7; __asm__ ("srl %0,%1,%0" : "+r"(crypto_uint8_x) : "r"(crypto_uint8_s) : ); #else int crypto_uint8_k, crypto_uint8_l; for (crypto_uint8_l = 0,crypto_uint8_k = 1;crypto_uint8_k < 8;++crypto_uint8_l,crypto_uint8_k *= 2) crypto_uint8_x ^= (crypto_uint8_x ^ (crypto_uint8_x >> crypto_uint8_k)) & crypto_uint8_bitinrangepublicpos_mask(crypto_uint8_s,crypto_uint8_l); #endif return crypto_uint8_x; } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_bitmod_mask(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_s) { crypto_uint8_x = crypto_uint8_shrmod(crypto_uint8_x,crypto_uint8_s); return crypto_uint8_bottombit_mask(crypto_uint8_x); } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_bitmod_01(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_s) { crypto_uint8_x = crypto_uint8_shrmod(crypto_uint8_x,crypto_uint8_s); return crypto_uint8_bottombit_01(crypto_uint8_x); } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_nonzero_mask(crypto_uint8 crypto_uint8_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8 crypto_uint8_z; int32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_q32,crypto_uint8_z32; __asm__ ("xorl %0,%0\n movl $-1,%1\n testb %b2,%b2\n cmovnel %1,%0" : "=&r"(crypto_uint8_z32), "=&r"(crypto_uint8_q32) : "q"(crypto_uint8_x32) : "cc"); crypto_uint8_z = crypto_uint8_z32; return crypto_uint8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_z; __asm__ ("tst %w1,255\n csetm %w0,ne" : "=r"(crypto_uint8_z) : "r"(crypto_uint8_x) : "cc"); return crypto_uint8_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("uxtb %0,%0\n cmp %0,#0\n movne %0,#-1" : "+r"(crypto_uint8_x) : : "cc"); return crypto_uint8_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint8 crypto_uint8_z; __asm__ ("and %0,255,%0\n cmp %%g0,%0\n subx %%g0,0,%1" : "+r"(crypto_uint8_x), "=r"(crypto_uint8_z) : : "cc"); return crypto_uint8_z; #else crypto_uint8_x |= -crypto_uint8_x; return crypto_uint8_signed_negative_mask(crypto_uint8_x); #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_nonzero_01(crypto_uint8 crypto_uint8_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8 crypto_uint8_z; int32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_q32,crypto_uint8_z32; __asm__ ("xorl %0,%0\n movl $1,%1\n testb %b2,%b2\n cmovnel %1,%0" : "=&r"(crypto_uint8_z32), "=&r"(crypto_uint8_q32) : "q"(crypto_uint8_x32) : "cc"); crypto_uint8_z = crypto_uint8_z32; return crypto_uint8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_z; __asm__ ("tst %w1,255\n cset %w0,ne" : "=r"(crypto_uint8_z) : "r"(crypto_uint8_x) : "cc"); return crypto_uint8_z; #elif defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__) __asm__ ("uxtb %0,%0\n cmp %0,#0\n movne %0,#1" : "+r"(crypto_uint8_x) : : "cc"); return crypto_uint8_x; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint8 crypto_uint8_z; __asm__ ("and %0,255,%0\n cmp %%g0,%0\n addx %%g0,0,%1" : "+r"(crypto_uint8_x), "=r"(crypto_uint8_z) : : "cc"); return crypto_uint8_z; #else crypto_uint8_x |= -crypto_uint8_x; return crypto_uint8_topbit_01(crypto_uint8_x); #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_zero_mask(crypto_uint8 crypto_uint8_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8 crypto_uint8_z; int32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_q32,crypto_uint8_z32; __asm__ ("xorl %0,%0\n movl $-1,%1\n testb %b2,%b2\n cmovel %1,%0" : "=&r"(crypto_uint8_z32), "=&r"(crypto_uint8_q32) : "q"(crypto_uint8_x32) : "cc"); crypto_uint8_z = crypto_uint8_z32; return crypto_uint8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_z; __asm__ ("tst %w1,255\n csetm %w0,eq" : "=r"(crypto_uint8_z) : "r"(crypto_uint8_x) : "cc"); return crypto_uint8_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint8 crypto_uint8_z; __asm__ ("and %0,255,%0\n cmp %%g0,%0\n addx %%g0,-1,%1" : "+r"(crypto_uint8_x), "=r"(crypto_uint8_z) : : "cc"); return crypto_uint8_z; #else return ~crypto_uint8_nonzero_mask(crypto_uint8_x); #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_zero_01(crypto_uint8 crypto_uint8_x) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8 crypto_uint8_z; int32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_q32,crypto_uint8_z32; __asm__ ("xorl %0,%0\n movl $1,%1\n testb %b2,%b2\n cmovel %1,%0" : "=&r"(crypto_uint8_z32), "=&r"(crypto_uint8_q32) : "q"(crypto_uint8_x32) : "cc"); crypto_uint8_z = crypto_uint8_z32; return crypto_uint8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_z; __asm__ ("tst %w1,255\n cset %w0,eq" : "=r"(crypto_uint8_z) : "r"(crypto_uint8_x) : "cc"); return crypto_uint8_z; #elif defined(__GNUC__) && defined(__sparc_v8__) crypto_uint8 crypto_uint8_z; __asm__ ("and %0,255,%0\n cmp %%g0,%0\n subx %%g0,-1,%1" : "+r"(crypto_uint8_x), "=r"(crypto_uint8_z) : : "cc"); return crypto_uint8_z; #else return 1-crypto_uint8_nonzero_01(crypto_uint8_x); #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_unequal_mask(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8 crypto_uint8_z; int32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_y32 = crypto_uint8_y,crypto_uint8_q32,crypto_uint8_z32; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpb %b3,%b2\n cmovnel %1,%0" : "=&r"(crypto_uint8_z32), "=&r"(crypto_uint8_q32) : "q"(crypto_uint8_x32), "q"(crypto_uint8_y32) : "cc"); crypto_uint8_z = crypto_uint8_z32; return crypto_uint8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_z; __asm__ ("and %w0,%w1,255\n cmp %w0,%w2,uxtb\n csetm %w0,ne" : "=&r"(crypto_uint8_z) : "r"(crypto_uint8_x), "r"(crypto_uint8_y) : "cc"); return crypto_uint8_z; #else return crypto_uint8_nonzero_mask(crypto_uint8_x ^ crypto_uint8_y); #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_unequal_01(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8 crypto_uint8_z; int32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_y32 = crypto_uint8_y,crypto_uint8_q32,crypto_uint8_z32; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpb %b3,%b2\n cmovnel %1,%0" : "=&r"(crypto_uint8_z32), "=&r"(crypto_uint8_q32) : "q"(crypto_uint8_x32), "q"(crypto_uint8_y32) : "cc"); crypto_uint8_z = crypto_uint8_z32; return crypto_uint8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_z; __asm__ ("and %w0,%w1,255\n cmp %w0,%w2,uxtb\n cset %w0,ne" : "=&r"(crypto_uint8_z) : "r"(crypto_uint8_x), "r"(crypto_uint8_y) : "cc"); return crypto_uint8_z; #else return crypto_uint8_nonzero_01(crypto_uint8_x ^ crypto_uint8_y); #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_equal_mask(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8 crypto_uint8_z; int32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_y32 = crypto_uint8_y,crypto_uint8_q32,crypto_uint8_z32; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpb %b3,%b2\n cmovel %1,%0" : "=&r"(crypto_uint8_z32), "=&r"(crypto_uint8_q32) : "q"(crypto_uint8_x32), "q"(crypto_uint8_y32) : "cc"); crypto_uint8_z = crypto_uint8_z32; return crypto_uint8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_z; __asm__ ("and %w0,%w1,255\n cmp %w0,%w2,uxtb\n csetm %w0,eq" : "=&r"(crypto_uint8_z) : "r"(crypto_uint8_x), "r"(crypto_uint8_y) : "cc"); return crypto_uint8_z; #else return crypto_uint8_zero_mask(crypto_uint8_x ^ crypto_uint8_y); #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_equal_01(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8 crypto_uint8_z; int32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_y32 = crypto_uint8_y,crypto_uint8_q32,crypto_uint8_z32; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpb %b3,%b2\n cmovel %1,%0" : "=&r"(crypto_uint8_z32), "=&r"(crypto_uint8_q32) : "q"(crypto_uint8_x32), "q"(crypto_uint8_y32) : "cc"); crypto_uint8_z = crypto_uint8_z32; return crypto_uint8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_z; __asm__ ("and %w0,%w1,255\n cmp %w0,%w2,uxtb\n cset %w0,eq" : "=&r"(crypto_uint8_z) : "r"(crypto_uint8_x), "r"(crypto_uint8_y) : "cc"); return crypto_uint8_z; #else return crypto_uint8_zero_01(crypto_uint8_x ^ crypto_uint8_y); #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_min(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_y) { #if defined(__GNUC__) && defined(__x86_64__) uint32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_y32 = crypto_uint8_y; __asm__ ("cmpb %b1,%b0\n cmoval %1,%0" : "+q"(crypto_uint8_x32) : "q"(crypto_uint8_y32) : "cc"); crypto_uint8_x = crypto_uint8_x32; return crypto_uint8_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("and %w0,%w0,255\n cmp %w0,%w1,uxtb\n csel %w0,%w0,%w1,lo" : "+&r"(crypto_uint8_x) : "r"(crypto_uint8_y) : "cc"); return crypto_uint8_x; #else crypto_uint8 crypto_uint8_r = crypto_uint8_y ^ crypto_uint8_x; crypto_uint8 crypto_uint8_z = crypto_uint8_y - crypto_uint8_x; crypto_uint8_z ^= crypto_uint8_r & (crypto_uint8_z ^ crypto_uint8_y ^ (((crypto_uint8) 1) << (8-1))); crypto_uint8_z = crypto_uint8_signed_negative_mask(crypto_uint8_z); crypto_uint8_z &= crypto_uint8_r; return crypto_uint8_x ^ crypto_uint8_z; #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_max(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_y) { #if defined(__GNUC__) && defined(__x86_64__) uint32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_y32 = crypto_uint8_y; __asm__ ("cmpb %b1,%b0\n cmovbl %1,%0" : "+q"(crypto_uint8_x32) : "q"(crypto_uint8_y32) : "cc"); crypto_uint8_x = crypto_uint8_x32; return crypto_uint8_x; #elif defined(__GNUC__) && defined(__aarch64__) __asm__ ("and %w0,%w0,255\n cmp %w0,%w1,uxtb\n csel %w0,%w1,%w0,lo" : "+&r"(crypto_uint8_x) : "r"(crypto_uint8_y) : "cc"); return crypto_uint8_x; #else crypto_uint8 crypto_uint8_r = crypto_uint8_y ^ crypto_uint8_x; crypto_uint8 crypto_uint8_z = crypto_uint8_y - crypto_uint8_x; crypto_uint8_z ^= crypto_uint8_r & (crypto_uint8_z ^ crypto_uint8_y ^ (((crypto_uint8) 1) << (8-1))); crypto_uint8_z = crypto_uint8_signed_negative_mask(crypto_uint8_z); crypto_uint8_z &= crypto_uint8_r; return crypto_uint8_y ^ crypto_uint8_z; #endif } __attribute__((unused)) static inline void crypto_uint8_minmax(crypto_uint8 *crypto_uint8_p,crypto_uint8 *crypto_uint8_q) { crypto_uint8 crypto_uint8_x = *crypto_uint8_p; crypto_uint8 crypto_uint8_y = *crypto_uint8_q; #if defined(__GNUC__) && defined(__x86_64__) uint32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_y32 = crypto_uint8_y,crypto_uint8_z32; __asm__ ("cmpb %b2,%b1\n movl %1,%0\n cmoval %2,%1\n cmoval %0,%2" : "=&r"(crypto_uint8_z32), "+&q"(crypto_uint8_x32), "+q"(crypto_uint8_y32) : : "cc"); crypto_uint8_x = crypto_uint8_x32; crypto_uint8_y = crypto_uint8_y32; *crypto_uint8_p = crypto_uint8_x; *crypto_uint8_q = crypto_uint8_y; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_r, crypto_uint8_s; __asm__ ("and %w0,%w0,255\n cmp %w0,%w3,uxtb\n csel %w1,%w0,%w3,lo\n csel %w2,%w3,%w0,lo" : "+&r"(crypto_uint8_x), "=&r"(crypto_uint8_r), "=r"(crypto_uint8_s) : "r"(crypto_uint8_y) : "cc"); *crypto_uint8_p = crypto_uint8_r; *crypto_uint8_q = crypto_uint8_s; #else crypto_uint8 crypto_uint8_r = crypto_uint8_y ^ crypto_uint8_x; crypto_uint8 crypto_uint8_z = crypto_uint8_y - crypto_uint8_x; crypto_uint8_z ^= crypto_uint8_r & (crypto_uint8_z ^ crypto_uint8_y ^ (((crypto_uint8) 1) << (8-1))); crypto_uint8_z = crypto_uint8_signed_negative_mask(crypto_uint8_z); crypto_uint8_z &= crypto_uint8_r; crypto_uint8_x ^= crypto_uint8_z; crypto_uint8_y ^= crypto_uint8_z; *crypto_uint8_p = crypto_uint8_x; *crypto_uint8_q = crypto_uint8_y; #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_smaller_mask(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8 crypto_uint8_z; int32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_y32 = crypto_uint8_y,crypto_uint8_q32,crypto_uint8_z32; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpb %b3,%b2\n cmovbl %1,%0" : "=&r"(crypto_uint8_z32), "=&r"(crypto_uint8_q32) : "q"(crypto_uint8_x32), "q"(crypto_uint8_y32) : "cc"); crypto_uint8_z = crypto_uint8_z32; return crypto_uint8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_z; __asm__ ("and %w0,%w1,255\n cmp %w0,%w2,uxtb\n csetm %w0,lo" : "=&r"(crypto_uint8_z) : "r"(crypto_uint8_x), "r"(crypto_uint8_y) : "cc"); return crypto_uint8_z; #else crypto_uint8 crypto_uint8_r = crypto_uint8_x ^ crypto_uint8_y; crypto_uint8 crypto_uint8_z = crypto_uint8_x - crypto_uint8_y; crypto_uint8_z ^= crypto_uint8_r & (crypto_uint8_z ^ crypto_uint8_x ^ (((crypto_uint8) 1) << (8-1))); return crypto_uint8_signed_negative_mask(crypto_uint8_z); #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_smaller_01(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8 crypto_uint8_z; int32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_y32 = crypto_uint8_y,crypto_uint8_q32,crypto_uint8_z32; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpb %b3,%b2\n cmovbl %1,%0" : "=&r"(crypto_uint8_z32), "=&r"(crypto_uint8_q32) : "q"(crypto_uint8_x32), "q"(crypto_uint8_y32) : "cc"); crypto_uint8_z = crypto_uint8_z32; return crypto_uint8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_z; __asm__ ("and %w0,%w1,255\n cmp %w0,%w2,uxtb\n cset %w0,lo" : "=&r"(crypto_uint8_z) : "r"(crypto_uint8_x), "r"(crypto_uint8_y) : "cc"); return crypto_uint8_z; #else crypto_uint8 crypto_uint8_r = crypto_uint8_x ^ crypto_uint8_y; crypto_uint8 crypto_uint8_z = crypto_uint8_x - crypto_uint8_y; crypto_uint8_z ^= crypto_uint8_r & (crypto_uint8_z ^ crypto_uint8_x ^ (((crypto_uint8) 1) << (8-1))); return crypto_uint8_topbit_01(crypto_uint8_z); #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_leq_mask(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8 crypto_uint8_z; int32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_y32 = crypto_uint8_y,crypto_uint8_q32,crypto_uint8_z32; __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpb %b3,%b2\n cmovbel %1,%0" : "=&r"(crypto_uint8_z32), "=&r"(crypto_uint8_q32) : "q"(crypto_uint8_x32), "q"(crypto_uint8_y32) : "cc"); crypto_uint8_z = crypto_uint8_z32; return crypto_uint8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_z; __asm__ ("and %w0,%w1,255\n cmp %w0,%w2,uxtb\n csetm %w0,ls" : "=&r"(crypto_uint8_z) : "r"(crypto_uint8_x), "r"(crypto_uint8_y) : "cc"); return crypto_uint8_z; #else return ~crypto_uint8_smaller_mask(crypto_uint8_y,crypto_uint8_x); #endif } __attribute__((unused)) static inline crypto_uint8 crypto_uint8_leq_01(crypto_uint8 crypto_uint8_x,crypto_uint8 crypto_uint8_y) { #if defined(__GNUC__) && defined(__x86_64__) crypto_uint8 crypto_uint8_z; int32_t crypto_uint8_x32 = crypto_uint8_x,crypto_uint8_y32 = crypto_uint8_y,crypto_uint8_q32,crypto_uint8_z32; __asm__ ("xorl %0,%0\n movl $1,%1\n cmpb %b3,%b2\n cmovbel %1,%0" : "=&r"(crypto_uint8_z32), "=&r"(crypto_uint8_q32) : "q"(crypto_uint8_x32), "q"(crypto_uint8_y32) : "cc"); crypto_uint8_z = crypto_uint8_z32; return crypto_uint8_z; #elif defined(__GNUC__) && defined(__aarch64__) crypto_uint8 crypto_uint8_z; __asm__ ("and %w0,%w1,255\n cmp %w0,%w2,uxtb\n cset %w0,ls" : "=&r"(crypto_uint8_z) : "r"(crypto_uint8_x), "r"(crypto_uint8_y) : "cc"); return crypto_uint8_z; #else return 1-crypto_uint8_smaller_01(crypto_uint8_y,crypto_uint8_x); #endif } __attribute__((unused)) static inline int crypto_uint8_ones_num(crypto_uint8 crypto_uint8_x) { crypto_uint8 crypto_uint8_y = crypto_uint8_x; const crypto_uint8 C0 = 0x55; const crypto_uint8 C1 = 0x33; const crypto_uint8 C2 = 0x0f; crypto_uint8_y -= ((crypto_uint8_y >> 1) & C0); crypto_uint8_y = (crypto_uint8_y & C1) + ((crypto_uint8_y >> 2) & C1); crypto_uint8_y = (crypto_uint8_y + (crypto_uint8_y >> 4)) & C2; return crypto_uint8_y; } __attribute__((unused)) static inline int crypto_uint8_bottomzeros_num(crypto_uint8 crypto_uint8_x) { #if defined(__GNUC__) && defined(__x86_64__) int32_t fallback = 8; int32_t crypto_uint8_x32 = crypto_uint8_x; __asm__ ("bsfl %0,%0\n cmovel %1,%0" : "+&r"(crypto_uint8_x32) : "r"(fallback) : "cc"); crypto_uint8_x = crypto_uint8_x32; return crypto_uint8_x; #elif defined(__GNUC__) && defined(__aarch64__) int64_t crypto_uint8_y; __asm__ ("orr %w0,%w1,-256\n rbit %w0,%w0\n clz %w0,%w0" : "=r"(crypto_uint8_y) : "r"(crypto_uint8_x) : ); return crypto_uint8_y; #else crypto_uint8 crypto_uint8_y = crypto_uint8_x ^ (crypto_uint8_x-1); crypto_uint8_y = ((crypto_uint8_signed) crypto_uint8_y) >> 1; crypto_uint8_y &= ~(crypto_uint8_x & (((crypto_uint8) 1) << (8-1))); return crypto_uint8_ones_num(crypto_uint8_y); #endif } #endif tinyssh-20250501/cryptoint/crypto_uintN.h000066400000000000000000002011001500472222400203440ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #ifndef crypto_uintN_h #define crypto_uintN_h #include #define crypto_uintN uintN_t #define crypto_uintN_signed intN_t #define crypto_uintN_signed_optblocker namespace_uintN_signed_optblocker extern volatile crypto_uintN_signed crypto_uintN_signed_optblocker; __attribute__((unused)) static inline crypto_uintN crypto_uintN_load(const unsigned char *crypto_uintN_s) { crypto_uintN crypto_uintN_z = 0; int crypto_uintN_k; for (crypto_uintN_k = 0;crypto_uintN_k < N;crypto_uintN_k += 8) crypto_uintN_z |= ((crypto_uintN) (*crypto_uintN_s++)) << crypto_uintN_k; return crypto_uintN_z; } __attribute__((unused)) static inline crypto_uintN crypto_uintN_load_bigendian(const unsigned char *crypto_uintN_s) { crypto_uintN crypto_uintN_z = 0; int crypto_uintN_k; for (crypto_uintN_k = N - 8;crypto_uintN_k >= 0;crypto_uintN_k -= 8) crypto_uintN_z |= ((crypto_uintN) (*crypto_uintN_s++)) << crypto_uintN_k; return crypto_uintN_z; } __attribute__((unused)) static inline void crypto_uintN_store(unsigned char *crypto_uintN_s,crypto_uintN crypto_uintN_x) { int crypto_uintN_k; for (crypto_uintN_k = 0;crypto_uintN_k < N;crypto_uintN_k += 8) *crypto_uintN_s++ = crypto_uintN_x >> crypto_uintN_k; } __attribute__((unused)) static inline void crypto_uintN_store_bigendian(unsigned char *crypto_uintN_s,crypto_uintN crypto_uintN_x) { int crypto_uintN_k; for (crypto_uintN_k = N - 8;crypto_uintN_k >= 0;crypto_uintN_k -= 8) *crypto_uintN_s++ = crypto_uintN_x >> crypto_uintN_k; } __attribute__((unused)) static inline crypto_uintN_signed crypto_uintN_signed_negative_mask(crypto_uintN_signed crypto_uintN_x) { #if amd64 8: readasm("amd64; int8 crypto_uintN_x; crypto_uintN_x signed>>= 7"); 16: readasm("amd64; int16 crypto_uintN_x; crypto_uintN_x signed>>= 15"); 32: readasm("amd64; int32 crypto_uintN_x; crypto_uintN_x signed>>= 31"); 64: readasm("amd64; int64 crypto_uintN_x; crypto_uintN_x signed>>= 63"); return crypto_uintN_x; #elif arm64 crypto_uintN_signed crypto_uintN_y; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = -(1 & (crypto_uintN_x unsigned>> 7))"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = -(1 & (crypto_uintN_x unsigned>> 15))"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x signed>> 31"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x signed>> 63"); return crypto_uintN_y; #elif arm32 crypto_uintN_signed crypto_uintN_y; 8: readasm("arm32; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = (int8) crypto_uintN_x; crypto_uintN_y = crypto_uintN_y signed>> 31"); 16: readasm("arm32; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = (int16) crypto_uintN_x; crypto_uintN_y = crypto_uintN_y signed>> 31"); 32: readasm("arm32; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x signed>> 31"); 64: readasm("arm32; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_y.lo = crypto_uintN_x.hi signed>> 31; crypto_uintN_y.hi = crypto_uintN_y.lo"); return crypto_uintN_y; #elif sparc32 crypto_uintN_signed crypto_uintN_y; 8: readasm("sparc32; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x << 24; crypto_uintN_y = crypto_uintN_y signed>> 31"); 16: readasm("sparc32; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x << 16; crypto_uintN_y = crypto_uintN_y signed>> 31"); 32: readasm("sparc32; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x signed>> 31"); 64: readasm("sparc32; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_y.lo = crypto_uintN_x.hi signed>> 31; crypto_uintN_y.hi = crypto_uintN_y.lo"); return crypto_uintN_y; #else crypto_uintN_x >>= N-6; crypto_uintN_x += crypto_uintN_signed_optblocker; crypto_uintN_x >>= 5; return crypto_uintN_x; #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_topbit_01(crypto_uintN crypto_uintN_x) { #if amd64 8: readasm("amd64; int8 crypto_uintN_x; crypto_uintN_x unsigned>>= 7"); 16: readasm("amd64; int16 crypto_uintN_x; crypto_uintN_x unsigned>>= 15"); 32: readasm("amd64; int32 crypto_uintN_x; crypto_uintN_x unsigned>>= 31"); 64: readasm("amd64; int64 crypto_uintN_x; crypto_uintN_x unsigned>>= 63"); return crypto_uintN_x; #elif arm64 crypto_uintN crypto_uintN_y; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = 1 & (crypto_uintN_x unsigned>> 7)"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = 1 & (crypto_uintN_x unsigned>> 15)"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x unsigned>> 31"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x unsigned>> 63"); return crypto_uintN_y; #elif arm32 crypto_uintN_signed crypto_uintN_y; 8: readasm("arm32; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = (uint8) crypto_uintN_x; crypto_uintN_y = crypto_uintN_y unsigned>> 7"); 16: readasm("arm32; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = (uint16) crypto_uintN_x; crypto_uintN_y = crypto_uintN_y unsigned>> 15"); 32: readasm("arm32; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x unsigned>> 31"); 64: readasm("arm32; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_y.lo = crypto_uintN_x.hi unsigned>> 31; crypto_uintN_y.hi = 0"); return crypto_uintN_y; #elif sparc32 crypto_uintN crypto_uintN_y; 8: readasm("sparc32; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = (uint8) crypto_uintN_x; crypto_uintN_y = crypto_uintN_y unsigned>> 7"); 16: readasm("sparc32; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = (uint16) crypto_uintN_x; crypto_uintN_y = crypto_uintN_y unsigned>> 15"); 32: readasm("sparc32; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x unsigned>> 31"); 64: readasm("sparc32; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_y.lo = crypto_uintN_x.hi unsigned>> 31; crypto_uintN_y.hi = 0"); return crypto_uintN_y; #else crypto_uintN_x >>= N-6; crypto_uintN_x += crypto_uintN_signed_optblocker; crypto_uintN_x >>= 5; return crypto_uintN_x; #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_topbit_mask(crypto_uintN crypto_uintN_x) { return crypto_uintN_signed_negative_mask(crypto_uintN_x); } __attribute__((unused)) static inline crypto_uintN crypto_uintN_bottombit_mask(crypto_uintN crypto_uintN_x) { #if amd64 8: readasm("amd64; int8 crypto_uintN_x; crypto_uintN_x &= 1"); 16: readasm("amd64; int16 crypto_uintN_x; crypto_uintN_x &= 1"); 32: readasm("amd64; int32 crypto_uintN_x; crypto_uintN_x &= 1"); 64: readasm("amd64; int64 crypto_uintN_x; crypto_uintN_x &= 1"); return -crypto_uintN_x; #elif arm64 crypto_uintN crypto_uintN_y; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = -(1 & (crypto_uintN_x unsigned>> 0))"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = -(1 & (crypto_uintN_x unsigned>> 0))"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = -(1 & (crypto_uintN_x unsigned>> 0))"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = -(1 & (crypto_uintN_x unsigned>> 0))"); return crypto_uintN_y; #elif arm32 crypto_uintN crypto_uintN_y; 8: readasm("arm32; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x & 1; crypto_uintN_y = -crypto_uintN_y; crypto_uintN_y = (uint8) crypto_uintN_y"); 16: readasm("arm32; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x & 1; crypto_uintN_y = -crypto_uintN_y; crypto_uintN_y = (uint16) crypto_uintN_y"); 32: readasm("arm32; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x & 1; crypto_uintN_y = -crypto_uintN_y"); 64: readasm("arm32; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_y.lo = crypto_uintN_x.lo & 1; crypto_uintN_y.lo = -crypto_uintN_y.lo; crypto_uintN_y.hi = crypto_uintN_y.lo"); return crypto_uintN_y; #elif sparc32 crypto_uintN crypto_uintN_y; 8: readasm("sparc32; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x & 1; crypto_uintN_y = -crypto_uintN_y; crypto_uintN_y = (uint8) crypto_uintN_y"); 16: readasm("sparc32; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x & 1; crypto_uintN_y = -crypto_uintN_y; crypto_uintN_y = (uint16) crypto_uintN_y"); 32: readasm("sparc32; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x & 1; crypto_uintN_y = -crypto_uintN_y"); 64: readasm("sparc32; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_y.lo = crypto_uintN_x.lo & 1; crypto_uintN_y.lo = -crypto_uintN_y.lo; crypto_uintN_y.hi = crypto_uintN_y.lo"); return crypto_uintN_y; #else crypto_uintN_x &= 1 + crypto_uintN_signed_optblocker; return -crypto_uintN_x; #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_bottombit_01(crypto_uintN crypto_uintN_x) { #if amd64 8: readasm("amd64; int8 crypto_uintN_x; crypto_uintN_x &= 1"); 16: readasm("amd64; int16 crypto_uintN_x; crypto_uintN_x &= 1"); 32: readasm("amd64; int32 crypto_uintN_x; crypto_uintN_x &= 1"); 64: readasm("amd64; int64 crypto_uintN_x; crypto_uintN_x &= 1"); return crypto_uintN_x; #elif arm64 crypto_uintN crypto_uintN_y; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = 1 & (crypto_uintN_x unsigned>> 0)"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = 1 & (crypto_uintN_x unsigned>> 0)"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = 1 & (crypto_uintN_x unsigned>> 0)"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = 1 & (crypto_uintN_x unsigned>> 0)"); return crypto_uintN_y; #elif arm32 crypto_uintN crypto_uintN_y; 8: readasm("arm32; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x & 1"); 16: readasm("arm32; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x & 1"); 32: readasm("arm32; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x & 1"); 64: readasm("arm32; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_y.lo = crypto_uintN_x.lo & 1; crypto_uintN_y.hi = 0"); return crypto_uintN_y; #elif sparc32 crypto_uintN crypto_uintN_y; 8: readasm("sparc32; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x & 1"); 16: readasm("sparc32; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x & 1"); 32: readasm("sparc32; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x & 1"); 64: readasm("sparc32; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_y.lo = crypto_uintN_x.lo & 1; crypto_uintN_y.hi = 0"); return crypto_uintN_y; #else crypto_uintN_x &= 1 + crypto_uintN_signed_optblocker; return crypto_uintN_x; #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_bitinrangepublicpos_mask(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_s) { #if amd64 8: readasm("amd64; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_x unsigned>>= crypto_uintN_s"); 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_x unsigned>>= crypto_uintN_s"); 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x unsigned>>= crypto_uintN_s"); 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_s; crypto_uintN_x unsigned>>= crypto_uintN_s"); #elif arm64 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = (uint8) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = (uint16) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); #elif arm32 8: readasm("arm32; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_s = crypto_uintN_s & 7; crypto_uintN_x = (uint8) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 16: readasm("arm32; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_s = crypto_uintN_s & 15; crypto_uintN_x = (uint16) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 32: readasm("arm32; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_s = crypto_uintN_s & 31; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 64: readasm("arm32; int64 crypto_uintN_x crypto_uintN_s; crypto_uintN_s.lo = crypto_uintN_s.lo & 63; crypto_uintN_x.lo = crypto_uintN_x.lo unsigned>> crypto_uintN_s.lo; crypto_uintN_s.hi = 32 - crypto_uintN_s.lo; crypto_uintN_x.lo = crypto_uintN_x.lo | (crypto_uintN_x.hi << crypto_uintN_s.hi); crypto_uintN_s.hi = crypto_uintN_s.lo - 32; crypto_uintN_x.lo = crypto_uintN_x.lo | (crypto_uintN_x.hi unsigned>> crypto_uintN_s.hi); crypto_uintN_x.hi = crypto_uintN_x.hi unsigned>> crypto_uintN_s.lo"); #elif sparc32 8: readasm("sparc32; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_s = crypto_uintN_s & 7; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 16: readasm("sparc32; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_s = crypto_uintN_s & 15; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 32: readasm("sparc32; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 64: crypto_uintN crypto_uintN_y, crypto_uintN_z; 64: readasm("sparc32; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_z crypto_uintN_s; crypto_uintN_s.hi = ~crypto_uintN_s.lo; crypto_uintN_z.hi = crypto_uintN_s.lo << 26; crypto_uintN_z.lo = crypto_uintN_x.hi << 1; crypto_uintN_y.lo = crypto_uintN_x.lo unsigned>> crypto_uintN_s.lo; crypto_uintN_z.lo = crypto_uintN_z.lo << crypto_uintN_s.hi; crypto_uintN_y.hi = crypto_uintN_x.hi unsigned>> crypto_uintN_s.lo; crypto_uintN_z.hi = crypto_uintN_z.hi signed>> 31; crypto_uintN_y.lo = crypto_uintN_y.lo | crypto_uintN_z.lo; crypto_uintN_z.lo = crypto_uintN_y.lo ^ crypto_uintN_y.hi; crypto_uintN_x.hi = crypto_uintN_z.hi & crypto_uintN_y.hi; crypto_uintN_z.lo = crypto_uintN_z.hi & crypto_uintN_z.lo; crypto_uintN_x.hi = crypto_uintN_x.hi ^ crypto_uintN_y.hi; crypto_uintN_x.lo = crypto_uintN_y.lo ^ crypto_uintN_z.lo"); #else crypto_uintN_x >>= crypto_uintN_s ^ crypto_uintN_signed_optblocker; #endif return crypto_uintN_bottombit_mask(crypto_uintN_x); } __attribute__((unused)) static inline crypto_uintN crypto_uintN_bitinrangepublicpos_01(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_s) { #if amd64 8: readasm("amd64; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_x unsigned>>= crypto_uintN_s"); 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_x unsigned>>= crypto_uintN_s"); 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x unsigned>>= crypto_uintN_s"); 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_s; crypto_uintN_x unsigned>>= crypto_uintN_s"); #elif arm64 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = (uint8) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = (uint16) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); #elif arm32 8: readasm("arm32; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_s = crypto_uintN_s & 7; crypto_uintN_x = (uint8) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 16: readasm("arm32; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_s = crypto_uintN_s & 15; crypto_uintN_x = (uint16) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 32: readasm("arm32; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_s = crypto_uintN_s & 31; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 64: readasm("arm32; int64 crypto_uintN_x crypto_uintN_s; crypto_uintN_s.lo = crypto_uintN_s.lo & 63; crypto_uintN_x.lo = crypto_uintN_x.lo unsigned>> crypto_uintN_s.lo; crypto_uintN_s.hi = 32 - crypto_uintN_s.lo; crypto_uintN_x.lo = crypto_uintN_x.lo | (crypto_uintN_x.hi << crypto_uintN_s.hi); crypto_uintN_s.hi = crypto_uintN_s.lo - 32; crypto_uintN_x.lo = crypto_uintN_x.lo | (crypto_uintN_x.hi unsigned>> crypto_uintN_s.hi); crypto_uintN_x.hi = crypto_uintN_x.hi unsigned>> crypto_uintN_s.lo"); #elif sparc32 8: readasm("sparc32; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_s = crypto_uintN_s & 7; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 16: readasm("sparc32; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_s = crypto_uintN_s & 15; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 32: readasm("sparc32; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 64: crypto_uintN crypto_uintN_y, crypto_uintN_z; 64: readasm("sparc32; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_z crypto_uintN_s; crypto_uintN_s.hi = ~crypto_uintN_s.lo; crypto_uintN_z.hi = crypto_uintN_s.lo << 26; crypto_uintN_z.lo = crypto_uintN_x.hi << 1; crypto_uintN_y.lo = crypto_uintN_x.lo unsigned>> crypto_uintN_s.lo; crypto_uintN_z.lo = crypto_uintN_z.lo << crypto_uintN_s.hi; crypto_uintN_y.hi = crypto_uintN_x.hi unsigned>> crypto_uintN_s.lo; crypto_uintN_z.hi = crypto_uintN_z.hi signed>> 31; crypto_uintN_y.lo = crypto_uintN_y.lo | crypto_uintN_z.lo; crypto_uintN_z.lo = crypto_uintN_y.lo ^ crypto_uintN_y.hi; crypto_uintN_x.hi = crypto_uintN_z.hi & crypto_uintN_y.hi; crypto_uintN_z.lo = crypto_uintN_z.hi & crypto_uintN_z.lo; crypto_uintN_x.hi = crypto_uintN_x.hi ^ crypto_uintN_y.hi; crypto_uintN_x.lo = crypto_uintN_y.lo ^ crypto_uintN_z.lo"); #else crypto_uintN_x >>= crypto_uintN_s ^ crypto_uintN_signed_optblocker; #endif return crypto_uintN_bottombit_01(crypto_uintN_x); } __attribute__((unused)) static inline crypto_uintN crypto_uintN_shlmod(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_s) { #if amd64 8: crypto_uintN_s &= 7; 8: readasm("amd64; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_x <<= crypto_uintN_s"); 16: crypto_uintN_s &= 15; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_x <<= crypto_uintN_s"); 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x <<= crypto_uintN_s"); 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_s; crypto_uintN_x <<= crypto_uintN_s"); #elif arm64 8: crypto_uintN_s &= 7; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = (uint8) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x << crypto_uintN_s"); 16: crypto_uintN_s &= 15; 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = (uint16) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x << crypto_uintN_s"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x << crypto_uintN_s"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x << crypto_uintN_s"); #elif arm32 8: crypto_uintN_s &= 7; 8: readasm("arm32; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x << crypto_uintN_s; crypto_uintN_x = (uint8) crypto_uintN_x"); 16: crypto_uintN_s &= 15; 16: readasm("arm32; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x << crypto_uintN_s; crypto_uintN_x = (uint16) crypto_uintN_x"); 32: crypto_uintN_s &= 31; 32: readasm("arm32; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x << crypto_uintN_s"); 64: readasm("arm32; int64 crypto_uintN_x crypto_uintN_s; crypto_uintN_s.lo = crypto_uintN_s.lo & 63; crypto_uintN_x.hi = crypto_uintN_x.hi << crypto_uintN_s.lo; crypto_uintN_s.hi = crypto_uintN_s.lo - 32; crypto_uintN_x.hi = crypto_uintN_x.hi | (crypto_uintN_x.lo << crypto_uintN_s.hi); crypto_uintN_s.hi = 32 - crypto_uintN_s.lo; crypto_uintN_x.hi = crypto_uintN_x.hi | (crypto_uintN_x.lo unsigned>> crypto_uintN_s.hi); crypto_uintN_x.lo = crypto_uintN_x.lo << crypto_uintN_s.lo"); #elif sparc32 8: crypto_uintN_s &= 7; 8: readasm("sparc32; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x << crypto_uintN_s; crypto_uintN_x = (uint8) crypto_uintN_x"); 16: crypto_uintN_s &= 15; 16: readasm("sparc32; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x << crypto_uintN_s; crypto_uintN_x = (uint16) crypto_uintN_x"); 32: readasm("sparc32; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x << crypto_uintN_s"); 64: crypto_uintN crypto_uintN_y, crypto_uintN_z; 64: readasm("sparc32; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_z crypto_uintN_s; crypto_uintN_s.hi = ~crypto_uintN_s.lo; crypto_uintN_z.hi = crypto_uintN_s.lo << 26; crypto_uintN_z.lo = crypto_uintN_x.lo unsigned>> 1; crypto_uintN_y.lo = crypto_uintN_x.lo << crypto_uintN_s.lo; crypto_uintN_z.lo = crypto_uintN_z.lo unsigned>> crypto_uintN_s.hi; crypto_uintN_y.hi = crypto_uintN_x.hi << crypto_uintN_s.lo; crypto_uintN_z.hi = crypto_uintN_z.hi signed>> 31; crypto_uintN_y.hi = crypto_uintN_y.hi | crypto_uintN_z.lo; crypto_uintN_z.lo = crypto_uintN_y.lo ^ crypto_uintN_y.hi; crypto_uintN_x.lo = crypto_uintN_z.hi & crypto_uintN_y.lo; crypto_uintN_z.lo = crypto_uintN_z.hi & crypto_uintN_z.lo; crypto_uintN_x.lo = crypto_uintN_x.lo ^ crypto_uintN_y.lo; crypto_uintN_x.hi = crypto_uintN_y.hi ^ crypto_uintN_z.lo"); #else int crypto_uintN_k, crypto_uintN_l; for (crypto_uintN_l = 0,crypto_uintN_k = 1;crypto_uintN_k < N;++crypto_uintN_l,crypto_uintN_k *= 2) crypto_uintN_x ^= (crypto_uintN_x ^ (crypto_uintN_x << crypto_uintN_k)) & crypto_uintN_bitinrangepublicpos_mask(crypto_uintN_s,crypto_uintN_l); #endif return crypto_uintN_x; } __attribute__((unused)) static inline crypto_uintN crypto_uintN_shrmod(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_s) { #if amd64 8: crypto_uintN_s &= 7; 8: readasm("amd64; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_x unsigned>>= crypto_uintN_s"); 16: crypto_uintN_s &= 15; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_x unsigned>>= crypto_uintN_s"); 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x unsigned>>= crypto_uintN_s"); 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_s; crypto_uintN_x unsigned>>= crypto_uintN_s"); #elif arm64 8: crypto_uintN_s &= 7; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = (uint8) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 16: crypto_uintN_s &= 15; 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = (uint16) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); #elif arm32 8: crypto_uintN_s &= 7; 8: readasm("arm32; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = (uint8) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 16: crypto_uintN_s &= 15; 16: readasm("arm32; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = (uint16) crypto_uintN_x; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 32: crypto_uintN_s &= 31; 32: readasm("arm32; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 64: readasm("arm32; int64 crypto_uintN_x crypto_uintN_s; crypto_uintN_s.lo = crypto_uintN_s.lo & 63; crypto_uintN_x.lo = crypto_uintN_x.lo unsigned>> crypto_uintN_s.lo; crypto_uintN_s.hi = 32 - crypto_uintN_s.lo; crypto_uintN_x.lo = crypto_uintN_x.lo | (crypto_uintN_x.hi << crypto_uintN_s.hi); crypto_uintN_s.hi = crypto_uintN_s.lo - 32; crypto_uintN_x.lo = crypto_uintN_x.lo | (crypto_uintN_x.hi unsigned>> crypto_uintN_s.hi); crypto_uintN_x.hi = crypto_uintN_x.hi unsigned>> crypto_uintN_s.lo"); #elif sparc32 8: crypto_uintN_s &= 7; 8: readasm("sparc32; int8 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 16: crypto_uintN_s &= 15; 16: readasm("sparc32; int16 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 32: readasm("sparc32; int32 crypto_uintN_x crypto_uintN_s; crypto_uintN_x = crypto_uintN_x unsigned>> crypto_uintN_s"); 64: crypto_uintN crypto_uintN_y, crypto_uintN_z; 64: readasm("sparc32; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_z crypto_uintN_s; crypto_uintN_s.hi = ~crypto_uintN_s.lo; crypto_uintN_z.hi = crypto_uintN_s.lo << 26; crypto_uintN_z.lo = crypto_uintN_x.hi << 1; crypto_uintN_y.lo = crypto_uintN_x.lo unsigned>> crypto_uintN_s.lo; crypto_uintN_z.lo = crypto_uintN_z.lo << crypto_uintN_s.hi; crypto_uintN_y.hi = crypto_uintN_x.hi unsigned>> crypto_uintN_s.lo; crypto_uintN_z.hi = crypto_uintN_z.hi signed>> 31; crypto_uintN_y.lo = crypto_uintN_y.lo | crypto_uintN_z.lo; crypto_uintN_z.lo = crypto_uintN_y.lo ^ crypto_uintN_y.hi; crypto_uintN_x.hi = crypto_uintN_z.hi & crypto_uintN_y.hi; crypto_uintN_z.lo = crypto_uintN_z.hi & crypto_uintN_z.lo; crypto_uintN_x.hi = crypto_uintN_x.hi ^ crypto_uintN_y.hi; crypto_uintN_x.lo = crypto_uintN_y.lo ^ crypto_uintN_z.lo"); #else int crypto_uintN_k, crypto_uintN_l; for (crypto_uintN_l = 0,crypto_uintN_k = 1;crypto_uintN_k < N;++crypto_uintN_l,crypto_uintN_k *= 2) crypto_uintN_x ^= (crypto_uintN_x ^ (crypto_uintN_x >> crypto_uintN_k)) & crypto_uintN_bitinrangepublicpos_mask(crypto_uintN_s,crypto_uintN_l); #endif return crypto_uintN_x; } __attribute__((unused)) static inline crypto_uintN crypto_uintN_bitmod_mask(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_s) { crypto_uintN_x = crypto_uintN_shrmod(crypto_uintN_x,crypto_uintN_s); return crypto_uintN_bottombit_mask(crypto_uintN_x); } __attribute__((unused)) static inline crypto_uintN crypto_uintN_bitmod_01(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_s) { crypto_uintN_x = crypto_uintN_shrmod(crypto_uintN_x,crypto_uintN_s); return crypto_uintN_bottombit_01(crypto_uintN_x); } __attribute__((unused)) static inline crypto_uintN crypto_uintN_nonzero_mask(crypto_uintN crypto_uintN_x) { #if amd64 8: crypto_uintN crypto_uintN_z; 8: int32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_q32,crypto_uintN_z32; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_q32 crypto_uintN_z32; crypto_uintN_z32 = 0; crypto_uintN_q32 = -1; crypto_uintN_x32 & (int8) crypto_uintN_x32; crypto_uintN_z32 = crypto_uintN_q32 if !="); 8: crypto_uintN_z = crypto_uintN_z32; 16: crypto_uintN crypto_uintN_q,crypto_uintN_z; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_q crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x & crypto_uintN_x; crypto_uintN_z = crypto_uintN_q if !="); 32: crypto_uintN crypto_uintN_q,crypto_uintN_z; 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_q crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x & crypto_uintN_x; crypto_uintN_z = crypto_uintN_q if !="); 64: crypto_uintN crypto_uintN_q,crypto_uintN_z; 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_q crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x & crypto_uintN_x; crypto_uintN_z = crypto_uintN_q if !="); return crypto_uintN_z; #elif arm64 crypto_uintN crypto_uintN_z; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_z; crypto_uintN_x & 255; crypto_uintN_z = -1 if != else 0"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_z; crypto_uintN_x & 65535; crypto_uintN_z = -1 if != else 0"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_z; crypto_uintN_x - 0; crypto_uintN_z = -1 if != else 0"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_z; crypto_uintN_x - 0; crypto_uintN_z = -1 if != else 0"); return crypto_uintN_z; #elif arm32 8: readasm("arm32; int8 crypto_uintN_x; crypto_uintN_x = (uint8) crypto_uintN_x; crypto_uintN_x - 0; crypto_uintN_x = -1 if !="); 16: readasm("arm32; int16 crypto_uintN_x; crypto_uintN_x = (uint16) crypto_uintN_x; crypto_uintN_x - 0; crypto_uintN_x = -1 if !="); 32: readasm("arm32; int32 crypto_uintN_x; crypto_uintN_x - 0; crypto_uintN_x = -1 if !="); 64: readasm("arm32; int64 crypto_uintN_x; flags, crypto_uintN_x.lo = crypto_uintN_x.lo | crypto_uintN_x.hi; crypto_uintN_x.lo = -1 if !=; crypto_uintN_x.hi = crypto_uintN_x.lo"); return crypto_uintN_x; #elif sparc32 crypto_uintN crypto_uintN_z; 8: readasm("sparc32; int8 crypto_uintN_x crypto_uintN_z; crypto_uintN_x = (uint8) crypto_uintN_x; 0 - crypto_uintN_x; crypto_uintN_z = -carry"); 16: readasm("sparc32; int16 crypto_uintN_x crypto_uintN_z; crypto_uintN_x = (uint16) crypto_uintN_x; 0 - crypto_uintN_x; crypto_uintN_z = -carry"); 32: readasm("sparc32; int32 crypto_uintN_x crypto_uintN_z; 0 - crypto_uintN_x; crypto_uintN_z = -carry"); 64: readasm("sparc32; int64 crypto_uintN_x crypto_uintN_z; crypto_uintN_z.lo = crypto_uintN_x.lo | crypto_uintN_x.hi; 0 - crypto_uintN_z.lo; crypto_uintN_z.lo = -carry; crypto_uintN_z.hi = crypto_uintN_z.lo"); return crypto_uintN_z; #else crypto_uintN_x |= -crypto_uintN_x; return crypto_uintN_signed_negative_mask(crypto_uintN_x); #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_nonzero_01(crypto_uintN crypto_uintN_x) { #if amd64 8: crypto_uintN crypto_uintN_z; 8: int32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_q32,crypto_uintN_z32; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_q32 crypto_uintN_z32; crypto_uintN_z32 = 0; crypto_uintN_q32 = 1; crypto_uintN_x32 & (int8) crypto_uintN_x32; crypto_uintN_z32 = crypto_uintN_q32 if !="); 8: crypto_uintN_z = crypto_uintN_z32; 16: crypto_uintN crypto_uintN_q,crypto_uintN_z; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_q crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x & crypto_uintN_x; crypto_uintN_z = crypto_uintN_q if !="); 32: crypto_uintN crypto_uintN_q,crypto_uintN_z; 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_q crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x & crypto_uintN_x; crypto_uintN_z = crypto_uintN_q if !="); 64: crypto_uintN crypto_uintN_q,crypto_uintN_z; 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_q crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x & crypto_uintN_x; crypto_uintN_z = crypto_uintN_q if !="); return crypto_uintN_z; #elif arm64 crypto_uintN crypto_uintN_z; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_z; crypto_uintN_x & 255; crypto_uintN_z = 1 if != else 0"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_z; crypto_uintN_x & 65535; crypto_uintN_z = 1 if != else 0"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_z; crypto_uintN_x - 0; crypto_uintN_z = 1 if != else 0"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_z; crypto_uintN_x - 0; crypto_uintN_z = 1 if != else 0"); return crypto_uintN_z; #elif arm32 8: readasm("arm32; int8 crypto_uintN_x; crypto_uintN_x = (uint8) crypto_uintN_x; crypto_uintN_x - 0; crypto_uintN_x = 1 if !="); 16: readasm("arm32; int16 crypto_uintN_x; crypto_uintN_x = (uint16) crypto_uintN_x; crypto_uintN_x - 0; crypto_uintN_x = 1 if !="); 32: readasm("arm32; int32 crypto_uintN_x; crypto_uintN_x - 0; crypto_uintN_x = 1 if !="); 64: readasm("arm32; int64 crypto_uintN_x; flags, crypto_uintN_x.lo = crypto_uintN_x.lo | crypto_uintN_x.hi; crypto_uintN_x.lo = 1 if !=; crypto_uintN_x.hi = 0"); return crypto_uintN_x; #elif sparc32 crypto_uintN crypto_uintN_z; 8: readasm("sparc32; int8 crypto_uintN_x crypto_uintN_z; crypto_uintN_x = (uint8) crypto_uintN_x; 0 - crypto_uintN_x; crypto_uintN_z = carry"); 16: readasm("sparc32; int16 crypto_uintN_x crypto_uintN_z; crypto_uintN_x = (uint16) crypto_uintN_x; 0 - crypto_uintN_x; crypto_uintN_z = carry"); 32: readasm("sparc32; int32 crypto_uintN_x crypto_uintN_z; 0 - crypto_uintN_x; crypto_uintN_z = carry"); 64: readasm("sparc32; int64 crypto_uintN_x crypto_uintN_z; crypto_uintN_z.lo = crypto_uintN_x.lo | crypto_uintN_x.hi; 0 - crypto_uintN_z.lo; crypto_uintN_z.lo = carry; crypto_uintN_z.hi = 0"); return crypto_uintN_z; #else crypto_uintN_x |= -crypto_uintN_x; return crypto_uintN_topbit_01(crypto_uintN_x); #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_zero_mask(crypto_uintN crypto_uintN_x) { #if amd64 8: crypto_uintN crypto_uintN_z; 8: int32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_q32,crypto_uintN_z32; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_q32 crypto_uintN_z32; crypto_uintN_z32 = 0; crypto_uintN_q32 = -1; crypto_uintN_x32 & (int8) crypto_uintN_x32; crypto_uintN_z32 = crypto_uintN_q32 if ="); 8: crypto_uintN_z = crypto_uintN_z32; 16: crypto_uintN crypto_uintN_q,crypto_uintN_z; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_q crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x & crypto_uintN_x; crypto_uintN_z = crypto_uintN_q if ="); 32: crypto_uintN crypto_uintN_q,crypto_uintN_z; 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_q crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x & crypto_uintN_x; crypto_uintN_z = crypto_uintN_q if ="); 64: crypto_uintN crypto_uintN_q,crypto_uintN_z; 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_q crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x & crypto_uintN_x; crypto_uintN_z = crypto_uintN_q if ="); return crypto_uintN_z; #elif arm64 crypto_uintN crypto_uintN_z; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_z; crypto_uintN_x & 255; crypto_uintN_z = -1 if = else 0"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_z; crypto_uintN_x & 65535; crypto_uintN_z = -1 if = else 0"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_z; crypto_uintN_x - 0; crypto_uintN_z = -1 if = else 0"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_z; crypto_uintN_x - 0; crypto_uintN_z = -1 if = else 0"); return crypto_uintN_z; #elif sparc32 crypto_uintN crypto_uintN_z; 8: readasm("sparc32; int8 crypto_uintN_x crypto_uintN_z; crypto_uintN_x = (uint8) crypto_uintN_x; 0 - crypto_uintN_x; crypto_uintN_z = carry - 1"); 16: readasm("sparc32; int16 crypto_uintN_x crypto_uintN_z; crypto_uintN_x = (uint16) crypto_uintN_x; 0 - crypto_uintN_x; crypto_uintN_z = carry - 1"); 32: readasm("sparc32; int32 crypto_uintN_x crypto_uintN_z; 0 - crypto_uintN_x; crypto_uintN_z = carry - 1"); 64: readasm("sparc32; int64 crypto_uintN_x crypto_uintN_z; crypto_uintN_z.lo = crypto_uintN_x.lo | crypto_uintN_x.hi; 0 - crypto_uintN_z.lo; crypto_uintN_z.lo = carry - 1; crypto_uintN_z.hi = crypto_uintN_z.lo"); return crypto_uintN_z; #else return ~crypto_uintN_nonzero_mask(crypto_uintN_x); #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_zero_01(crypto_uintN crypto_uintN_x) { #if amd64 8: crypto_uintN crypto_uintN_z; 8: int32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_q32,crypto_uintN_z32; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_q32 crypto_uintN_z32; crypto_uintN_z32 = 0; crypto_uintN_q32 = 1; crypto_uintN_x32 & (int8) crypto_uintN_x32; crypto_uintN_z32 = crypto_uintN_q32 if ="); 8: crypto_uintN_z = crypto_uintN_z32; 16: crypto_uintN crypto_uintN_q,crypto_uintN_z; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_q crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x & crypto_uintN_x; crypto_uintN_z = crypto_uintN_q if ="); 32: crypto_uintN crypto_uintN_q,crypto_uintN_z; 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_q crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x & crypto_uintN_x; crypto_uintN_z = crypto_uintN_q if ="); 64: crypto_uintN crypto_uintN_q,crypto_uintN_z; 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_q crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x & crypto_uintN_x; crypto_uintN_z = crypto_uintN_q if ="); return crypto_uintN_z; #elif arm64 crypto_uintN crypto_uintN_z; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_z; crypto_uintN_x & 255; crypto_uintN_z = 1 if = else 0"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_z; crypto_uintN_x & 65535; crypto_uintN_z = 1 if = else 0"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_z; crypto_uintN_x - 0; crypto_uintN_z = 1 if = else 0"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_z; crypto_uintN_x - 0; crypto_uintN_z = 1 if = else 0"); return crypto_uintN_z; #elif sparc32 crypto_uintN crypto_uintN_z; 8: readasm("sparc32; int8 crypto_uintN_x crypto_uintN_z; crypto_uintN_x = (uint8) crypto_uintN_x; 0 - crypto_uintN_x; crypto_uintN_z = 1 - carry"); 16: readasm("sparc32; int16 crypto_uintN_x crypto_uintN_z; crypto_uintN_x = (uint16) crypto_uintN_x; 0 - crypto_uintN_x; crypto_uintN_z = 1 - carry"); 32: readasm("sparc32; int32 crypto_uintN_x crypto_uintN_z; 0 - crypto_uintN_x; crypto_uintN_z = 1 - carry"); 64: readasm("sparc32; int64 crypto_uintN_x crypto_uintN_z; crypto_uintN_z.lo = crypto_uintN_x.lo | crypto_uintN_x.hi; 0 - crypto_uintN_z.lo; crypto_uintN_z.lo = 1 - carry; crypto_uintN_z.hi = 0"); return crypto_uintN_z; #else return 1-crypto_uintN_nonzero_01(crypto_uintN_x); #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_unequal_mask(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_y) { #if amd64 8: crypto_uintN crypto_uintN_z; 8: int32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_y32 = crypto_uintN_y,crypto_uintN_q32,crypto_uintN_z32; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_q32 crypto_uintN_y32 crypto_uintN_z32; crypto_uintN_z32 = 0; crypto_uintN_q32 = -1; crypto_uintN_x32 - (int8) crypto_uintN_y32; crypto_uintN_z32 = crypto_uintN_q32 if !="); 8: crypto_uintN_z = crypto_uintN_z32; 16: crypto_uintN crypto_uintN_q,crypto_uintN_z; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if !="); 32: crypto_uintN crypto_uintN_q,crypto_uintN_z; 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if !="); 64: crypto_uintN crypto_uintN_q,crypto_uintN_z; 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if !="); return crypto_uintN_z; #elif arm64 crypto_uintN crypto_uintN_z; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint8) crypto_uintN_x; crypto_uintN_z - (uint8) crypto_uintN_y; crypto_uintN_z = -1 if != else 0"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint16) crypto_uintN_x; crypto_uintN_z - (uint16) crypto_uintN_y; crypto_uintN_z = -1 if != else 0"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = -1 if != else 0"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = -1 if != else 0"); return crypto_uintN_z; #else return crypto_uintN_nonzero_mask(crypto_uintN_x ^ crypto_uintN_y); #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_unequal_01(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_y) { #if amd64 8: crypto_uintN crypto_uintN_z; 8: int32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_y32 = crypto_uintN_y,crypto_uintN_q32,crypto_uintN_z32; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_q32 crypto_uintN_y32 crypto_uintN_z32; crypto_uintN_z32 = 0; crypto_uintN_q32 = 1; crypto_uintN_x32 - (int8) crypto_uintN_y32; crypto_uintN_z32 = crypto_uintN_q32 if !="); 8: crypto_uintN_z = crypto_uintN_z32; 16: crypto_uintN crypto_uintN_q,crypto_uintN_z; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if !="); 32: crypto_uintN crypto_uintN_q,crypto_uintN_z; 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if !="); 64: crypto_uintN crypto_uintN_q,crypto_uintN_z; 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if !="); return crypto_uintN_z; #elif arm64 crypto_uintN crypto_uintN_z; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint8) crypto_uintN_x; crypto_uintN_z - (uint8) crypto_uintN_y; crypto_uintN_z = 1 if != else 0"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint16) crypto_uintN_x; crypto_uintN_z - (uint16) crypto_uintN_y; crypto_uintN_z = 1 if != else 0"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = 1 if != else 0"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = 1 if != else 0"); return crypto_uintN_z; #else return crypto_uintN_nonzero_01(crypto_uintN_x ^ crypto_uintN_y); #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_equal_mask(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_y) { #if amd64 8: crypto_uintN crypto_uintN_z; 8: int32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_y32 = crypto_uintN_y,crypto_uintN_q32,crypto_uintN_z32; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_q32 crypto_uintN_y32 crypto_uintN_z32; crypto_uintN_z32 = 0; crypto_uintN_q32 = -1; crypto_uintN_x32 - (int8) crypto_uintN_y32; crypto_uintN_z32 = crypto_uintN_q32 if ="); 8: crypto_uintN_z = crypto_uintN_z32; 16: crypto_uintN crypto_uintN_q,crypto_uintN_z; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if ="); 32: crypto_uintN crypto_uintN_q,crypto_uintN_z; 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if ="); 64: crypto_uintN crypto_uintN_q,crypto_uintN_z; 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if ="); return crypto_uintN_z; #elif arm64 crypto_uintN crypto_uintN_z; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint8) crypto_uintN_x; crypto_uintN_z - (uint8) crypto_uintN_y; crypto_uintN_z = -1 if = else 0"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint16) crypto_uintN_x; crypto_uintN_z - (uint16) crypto_uintN_y; crypto_uintN_z = -1 if = else 0"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = -1 if = else 0"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = -1 if = else 0"); return crypto_uintN_z; #else return crypto_uintN_zero_mask(crypto_uintN_x ^ crypto_uintN_y); #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_equal_01(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_y) { #if amd64 8: crypto_uintN crypto_uintN_z; 8: int32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_y32 = crypto_uintN_y,crypto_uintN_q32,crypto_uintN_z32; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_q32 crypto_uintN_y32 crypto_uintN_z32; crypto_uintN_z32 = 0; crypto_uintN_q32 = 1; crypto_uintN_x32 - (int8) crypto_uintN_y32; crypto_uintN_z32 = crypto_uintN_q32 if ="); 8: crypto_uintN_z = crypto_uintN_z32; 16: crypto_uintN crypto_uintN_q,crypto_uintN_z; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if ="); 32: crypto_uintN crypto_uintN_q,crypto_uintN_z; 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if ="); 64: crypto_uintN crypto_uintN_q,crypto_uintN_z; 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if ="); return crypto_uintN_z; #elif arm64 crypto_uintN crypto_uintN_z; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint8) crypto_uintN_x; crypto_uintN_z - (uint8) crypto_uintN_y; crypto_uintN_z = 1 if = else 0"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint16) crypto_uintN_x; crypto_uintN_z - (uint16) crypto_uintN_y; crypto_uintN_z = 1 if = else 0"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = 1 if = else 0"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = 1 if = else 0"); return crypto_uintN_z; #else return crypto_uintN_zero_01(crypto_uintN_x ^ crypto_uintN_y); #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_min(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_y) { #if amd64 8: uint32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_y32 = crypto_uintN_y; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_y32; crypto_uintN_x32 - (int8) crypto_uintN_y32; crypto_uintN_x32 = crypto_uintN_y32 if unsigned>"); 8: crypto_uintN_x = crypto_uintN_x32; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_x - crypto_uintN_y; crypto_uintN_x = crypto_uintN_y if unsigned>"); 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_x - crypto_uintN_y; crypto_uintN_x = crypto_uintN_y if unsigned>"); 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_x - crypto_uintN_y; crypto_uintN_x = crypto_uintN_y if unsigned>"); return crypto_uintN_x; #elif arm64 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_x = (uint8) crypto_uintN_x; crypto_uintN_x - (uint8) crypto_uintN_y; crypto_uintN_x = crypto_uintN_x if unsigned< else crypto_uintN_y"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_x = (uint16) crypto_uintN_x; crypto_uintN_x - (uint16) crypto_uintN_y; crypto_uintN_x = crypto_uintN_x if unsigned< else crypto_uintN_y"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_x - crypto_uintN_y; crypto_uintN_x = crypto_uintN_x if unsigned< else crypto_uintN_y"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_x - crypto_uintN_y; crypto_uintN_x = crypto_uintN_x if unsigned< else crypto_uintN_y"); return crypto_uintN_x; #else crypto_uintN crypto_uintN_r = crypto_uintN_y ^ crypto_uintN_x; crypto_uintN crypto_uintN_z = crypto_uintN_y - crypto_uintN_x; crypto_uintN_z ^= crypto_uintN_r & (crypto_uintN_z ^ crypto_uintN_y ^ (((crypto_uintN) 1) << (N-1))); crypto_uintN_z = crypto_uintN_signed_negative_mask(crypto_uintN_z); crypto_uintN_z &= crypto_uintN_r; return crypto_uintN_x ^ crypto_uintN_z; #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_max(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_y) { #if amd64 8: uint32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_y32 = crypto_uintN_y; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_y32; crypto_uintN_x32 - (int8) crypto_uintN_y32; crypto_uintN_x32 = crypto_uintN_y32 if unsigned<"); 8: crypto_uintN_x = crypto_uintN_x32; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_x - crypto_uintN_y; crypto_uintN_x = crypto_uintN_y if unsigned<"); 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_x - crypto_uintN_y; crypto_uintN_x = crypto_uintN_y if unsigned<"); 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_x - crypto_uintN_y; crypto_uintN_x = crypto_uintN_y if unsigned<"); return crypto_uintN_x; #elif arm64 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_x = (uint8) crypto_uintN_x; crypto_uintN_x - (uint8) crypto_uintN_y; crypto_uintN_x = crypto_uintN_y if unsigned< else crypto_uintN_x"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_x = (uint16) crypto_uintN_x; crypto_uintN_x - (uint16) crypto_uintN_y; crypto_uintN_x = crypto_uintN_y if unsigned< else crypto_uintN_x"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_x - crypto_uintN_y; crypto_uintN_x = crypto_uintN_y if unsigned< else crypto_uintN_x"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_x - crypto_uintN_y; crypto_uintN_x = crypto_uintN_y if unsigned< else crypto_uintN_x"); return crypto_uintN_x; #else crypto_uintN crypto_uintN_r = crypto_uintN_y ^ crypto_uintN_x; crypto_uintN crypto_uintN_z = crypto_uintN_y - crypto_uintN_x; crypto_uintN_z ^= crypto_uintN_r & (crypto_uintN_z ^ crypto_uintN_y ^ (((crypto_uintN) 1) << (N-1))); crypto_uintN_z = crypto_uintN_signed_negative_mask(crypto_uintN_z); crypto_uintN_z &= crypto_uintN_r; return crypto_uintN_y ^ crypto_uintN_z; #endif } __attribute__((unused)) static inline void crypto_uintN_minmax(crypto_uintN *crypto_uintN_p,crypto_uintN *crypto_uintN_q) { crypto_uintN crypto_uintN_x = *crypto_uintN_p; crypto_uintN crypto_uintN_y = *crypto_uintN_q; #if amd64 8: uint32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_y32 = crypto_uintN_y,crypto_uintN_z32; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_y32 crypto_uintN_z32; crypto_uintN_x32 - (int8) crypto_uintN_y32; crypto_uintN_z32 = crypto_uintN_x32; crypto_uintN_x32 = crypto_uintN_y32 if unsigned>; crypto_uintN_y32 = crypto_uintN_z32 if unsigned>"); 8: crypto_uintN_x = crypto_uintN_x32; crypto_uintN_y = crypto_uintN_y32; 16: crypto_uintN crypto_uintN_z; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_x; crypto_uintN_x = crypto_uintN_y if unsigned>; crypto_uintN_y = crypto_uintN_z if unsigned>"); 32: crypto_uintN crypto_uintN_z; 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_x; crypto_uintN_x = crypto_uintN_y if unsigned>; crypto_uintN_y = crypto_uintN_z if unsigned>"); 64: crypto_uintN crypto_uintN_z; 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_x; crypto_uintN_x = crypto_uintN_y if unsigned>; crypto_uintN_y = crypto_uintN_z if unsigned>"); *crypto_uintN_p = crypto_uintN_x; *crypto_uintN_q = crypto_uintN_y; #elif arm64 crypto_uintN crypto_uintN_r, crypto_uintN_s; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y crypto_uintN_r crypto_uintN_s; crypto_uintN_x = (uint8) crypto_uintN_x; crypto_uintN_x - (uint8) crypto_uintN_y; crypto_uintN_r = crypto_uintN_x if unsigned< else crypto_uintN_y; crypto_uintN_s = crypto_uintN_y if unsigned< else crypto_uintN_x"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y crypto_uintN_r crypto_uintN_s; crypto_uintN_x = (uint16) crypto_uintN_x; crypto_uintN_x - (uint16) crypto_uintN_y; crypto_uintN_r = crypto_uintN_x if unsigned< else crypto_uintN_y; crypto_uintN_s = crypto_uintN_y if unsigned< else crypto_uintN_x"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y crypto_uintN_r crypto_uintN_s; crypto_uintN_x - crypto_uintN_y; crypto_uintN_r = crypto_uintN_x if unsigned< else crypto_uintN_y; crypto_uintN_s = crypto_uintN_y if unsigned< else crypto_uintN_x"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_r crypto_uintN_s; crypto_uintN_x - crypto_uintN_y; crypto_uintN_r = crypto_uintN_x if unsigned< else crypto_uintN_y; crypto_uintN_s = crypto_uintN_y if unsigned< else crypto_uintN_x"); *crypto_uintN_p = crypto_uintN_r; *crypto_uintN_q = crypto_uintN_s; #else crypto_uintN crypto_uintN_r = crypto_uintN_y ^ crypto_uintN_x; crypto_uintN crypto_uintN_z = crypto_uintN_y - crypto_uintN_x; crypto_uintN_z ^= crypto_uintN_r & (crypto_uintN_z ^ crypto_uintN_y ^ (((crypto_uintN) 1) << (N-1))); crypto_uintN_z = crypto_uintN_signed_negative_mask(crypto_uintN_z); crypto_uintN_z &= crypto_uintN_r; crypto_uintN_x ^= crypto_uintN_z; crypto_uintN_y ^= crypto_uintN_z; *crypto_uintN_p = crypto_uintN_x; *crypto_uintN_q = crypto_uintN_y; #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_smaller_mask(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_y) { #if amd64 8: crypto_uintN crypto_uintN_z; 8: int32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_y32 = crypto_uintN_y,crypto_uintN_q32,crypto_uintN_z32; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_q32 crypto_uintN_y32 crypto_uintN_z32; crypto_uintN_z32 = 0; crypto_uintN_q32 = -1; crypto_uintN_x32 - (int8) crypto_uintN_y32; crypto_uintN_z32 = crypto_uintN_q32 if unsigned<"); 8: crypto_uintN_z = crypto_uintN_z32; 16: crypto_uintN crypto_uintN_q,crypto_uintN_z; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if unsigned<"); 32: crypto_uintN crypto_uintN_q,crypto_uintN_z; 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if unsigned<"); 64: crypto_uintN crypto_uintN_q,crypto_uintN_z; 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if unsigned<"); return crypto_uintN_z; #elif arm64 crypto_uintN crypto_uintN_z; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint8) crypto_uintN_x; crypto_uintN_z - (uint8) crypto_uintN_y; crypto_uintN_z = -1 if unsigned< else 0"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint16) crypto_uintN_x; crypto_uintN_z - (uint16) crypto_uintN_y; crypto_uintN_z = -1 if unsigned< else 0"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = -1 if unsigned< else 0"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = -1 if unsigned< else 0"); return crypto_uintN_z; #else crypto_uintN crypto_uintN_r = crypto_uintN_x ^ crypto_uintN_y; crypto_uintN crypto_uintN_z = crypto_uintN_x - crypto_uintN_y; crypto_uintN_z ^= crypto_uintN_r & (crypto_uintN_z ^ crypto_uintN_x ^ (((crypto_uintN) 1) << (N-1))); return crypto_uintN_signed_negative_mask(crypto_uintN_z); #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_smaller_01(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_y) { #if amd64 8: crypto_uintN crypto_uintN_z; 8: int32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_y32 = crypto_uintN_y,crypto_uintN_q32,crypto_uintN_z32; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_q32 crypto_uintN_y32 crypto_uintN_z32; crypto_uintN_z32 = 0; crypto_uintN_q32 = 1; crypto_uintN_x32 - (int8) crypto_uintN_y32; crypto_uintN_z32 = crypto_uintN_q32 if unsigned<"); 8: crypto_uintN_z = crypto_uintN_z32; 16: crypto_uintN crypto_uintN_q,crypto_uintN_z; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if unsigned<"); 32: crypto_uintN crypto_uintN_q,crypto_uintN_z; 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if unsigned<"); 64: crypto_uintN crypto_uintN_q,crypto_uintN_z; 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if unsigned<"); return crypto_uintN_z; #elif arm64 crypto_uintN crypto_uintN_z; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint8) crypto_uintN_x; crypto_uintN_z - (uint8) crypto_uintN_y; crypto_uintN_z = 1 if unsigned< else 0"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint16) crypto_uintN_x; crypto_uintN_z - (uint16) crypto_uintN_y; crypto_uintN_z = 1 if unsigned< else 0"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = 1 if unsigned< else 0"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = 1 if unsigned< else 0"); return crypto_uintN_z; #else crypto_uintN crypto_uintN_r = crypto_uintN_x ^ crypto_uintN_y; crypto_uintN crypto_uintN_z = crypto_uintN_x - crypto_uintN_y; crypto_uintN_z ^= crypto_uintN_r & (crypto_uintN_z ^ crypto_uintN_x ^ (((crypto_uintN) 1) << (N-1))); return crypto_uintN_topbit_01(crypto_uintN_z); #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_leq_mask(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_y) { #if amd64 8: crypto_uintN crypto_uintN_z; 8: int32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_y32 = crypto_uintN_y,crypto_uintN_q32,crypto_uintN_z32; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_q32 crypto_uintN_y32 crypto_uintN_z32; crypto_uintN_z32 = 0; crypto_uintN_q32 = -1; crypto_uintN_x32 - (int8) crypto_uintN_y32; crypto_uintN_z32 = crypto_uintN_q32 if unsigned<="); 8: crypto_uintN_z = crypto_uintN_z32; 16: crypto_uintN crypto_uintN_q,crypto_uintN_z; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if unsigned<="); 32: crypto_uintN crypto_uintN_q,crypto_uintN_z; 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if unsigned<="); 64: crypto_uintN crypto_uintN_q,crypto_uintN_z; 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = -1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if unsigned<="); return crypto_uintN_z; #elif arm64 crypto_uintN crypto_uintN_z; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint8) crypto_uintN_x; crypto_uintN_z - (uint8) crypto_uintN_y; crypto_uintN_z = -1 if unsigned<= else 0"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint16) crypto_uintN_x; crypto_uintN_z - (uint16) crypto_uintN_y; crypto_uintN_z = -1 if unsigned<= else 0"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = -1 if unsigned<= else 0"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = -1 if unsigned<= else 0"); return crypto_uintN_z; #else return ~crypto_uintN_smaller_mask(crypto_uintN_y,crypto_uintN_x); #endif } __attribute__((unused)) static inline crypto_uintN crypto_uintN_leq_01(crypto_uintN crypto_uintN_x,crypto_uintN crypto_uintN_y) { #if amd64 8: crypto_uintN crypto_uintN_z; 8: int32_t crypto_uintN_x32 = crypto_uintN_x,crypto_uintN_y32 = crypto_uintN_y,crypto_uintN_q32,crypto_uintN_z32; 8: readasm("amd64; int32 crypto_uintN_x32 crypto_uintN_q32 crypto_uintN_y32 crypto_uintN_z32; crypto_uintN_z32 = 0; crypto_uintN_q32 = 1; crypto_uintN_x32 - (int8) crypto_uintN_y32; crypto_uintN_z32 = crypto_uintN_q32 if unsigned<="); 8: crypto_uintN_z = crypto_uintN_z32; 16: crypto_uintN crypto_uintN_q,crypto_uintN_z; 16: readasm("amd64; int16 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if unsigned<="); 32: crypto_uintN crypto_uintN_q,crypto_uintN_z; 32: readasm("amd64; int32 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if unsigned<="); 64: crypto_uintN crypto_uintN_q,crypto_uintN_z; 64: readasm("amd64; int64 crypto_uintN_x crypto_uintN_q crypto_uintN_y crypto_uintN_z; crypto_uintN_z = 0; crypto_uintN_q = 1; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = crypto_uintN_q if unsigned<="); return crypto_uintN_z; #elif arm64 crypto_uintN crypto_uintN_z; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint8) crypto_uintN_x; crypto_uintN_z - (uint8) crypto_uintN_y; crypto_uintN_z = 1 if unsigned<= else 0"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_z = (uint16) crypto_uintN_x; crypto_uintN_z - (uint16) crypto_uintN_y; crypto_uintN_z = 1 if unsigned<= else 0"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = 1 if unsigned<= else 0"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y crypto_uintN_z; crypto_uintN_x - crypto_uintN_y; crypto_uintN_z = 1 if unsigned<= else 0"); return crypto_uintN_z; #else return 1-crypto_uintN_smaller_01(crypto_uintN_y,crypto_uintN_x); #endif } __attribute__((unused)) static inline int crypto_uintN_ones_num(crypto_uintN crypto_uintN_x) { crypto_uintN crypto_uintN_y = crypto_uintN_x; 8: const crypto_uintN C0 = 0x55; 16: const crypto_uintN C0 = 0x5555; 32: const crypto_uintN C0 = 0x55555555; 64: const crypto_uintN C0 = 0x5555555555555555; 8: const crypto_uintN C1 = 0x33; 16: const crypto_uintN C1 = 0x3333; 32: const crypto_uintN C1 = 0x33333333; 64: const crypto_uintN C1 = 0x3333333333333333; 8: const crypto_uintN C2 = 0x0f; 16: const crypto_uintN C2 = 0x0f0f; 32: const crypto_uintN C2 = 0x0f0f0f0f; 64: const crypto_uintN C2 = 0x0f0f0f0f0f0f0f0f; crypto_uintN_y -= ((crypto_uintN_y >> 1) & C0); crypto_uintN_y = (crypto_uintN_y & C1) + ((crypto_uintN_y >> 2) & C1); crypto_uintN_y = (crypto_uintN_y + (crypto_uintN_y >> 4)) & C2; 16: crypto_uintN_y = (crypto_uintN_y + (crypto_uintN_y >> 8)) & 0xff; 32: crypto_uintN_y += crypto_uintN_y >> 8; 32: crypto_uintN_y = (crypto_uintN_y + (crypto_uintN_y >> 16)) & 0xff; 64: crypto_uintN_y += crypto_uintN_y >> 8; 64: crypto_uintN_y += crypto_uintN_y >> 16; 64: crypto_uintN_y = (crypto_uintN_y + (crypto_uintN_y >> 32)) & 0xff; return crypto_uintN_y; } __attribute__((unused)) static inline int crypto_uintN_bottomzeros_num(crypto_uintN crypto_uintN_x) { #if amd64 8: int32_t fallback = N; 8: int32_t crypto_uintN_x32 = crypto_uintN_x; 8: readasm("amd64; int32 crypto_uintN_x32 fallback; crypto_uintN_x32 = numbottomzeros_tricky crypto_uintN_x32; crypto_uintN_x32 = fallback if ="); 8: crypto_uintN_x = crypto_uintN_x32; 16: crypto_uintN fallback = N; 16: readasm("amd64; int16 crypto_uintN_x fallback; crypto_uintN_x = numbottomzeros_tricky crypto_uintN_x; crypto_uintN_x = fallback if ="); 32: crypto_uintN fallback = N; 32: readasm("amd64; int32 crypto_uintN_x fallback; crypto_uintN_x = numbottomzeros_tricky crypto_uintN_x; crypto_uintN_x = fallback if ="); 64: crypto_uintN fallback = N; 64: readasm("amd64; int64 crypto_uintN_x fallback; crypto_uintN_x = numbottomzeros_tricky crypto_uintN_x; crypto_uintN_x = fallback if ="); return crypto_uintN_x; #elif arm64 int64_t crypto_uintN_y; 8: readasm("arm64; int8 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x | -256; crypto_uintN_y = bitrev32 crypto_uintN_y; crypto_uintN_y = numbottomzeros crypto_uintN_y"); 16: readasm("arm64; int16 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = crypto_uintN_x | -65536; crypto_uintN_y = bitrev32 crypto_uintN_y; crypto_uintN_y = numbottomzeros crypto_uintN_y"); 32: readasm("arm64; int32 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = bitrev32 crypto_uintN_x; crypto_uintN_y = numbottomzeros crypto_uintN_y"); 64: readasm("arm64; int64 crypto_uintN_x crypto_uintN_y; crypto_uintN_y = bitrev64 crypto_uintN_x; crypto_uintN_y = numbottomzeros crypto_uintN_y"); return crypto_uintN_y; #else crypto_uintN crypto_uintN_y = crypto_uintN_x ^ (crypto_uintN_x-1); crypto_uintN_y = ((crypto_uintN_signed) crypto_uintN_y) >> 1; crypto_uintN_y &= ~(crypto_uintN_x & (((crypto_uintN) 1) << (N-1))); return crypto_uintN_ones_num(crypto_uintN_y); #endif } #endif tinyssh-20250501/cryptoint/functions000066400000000000000000001322341500472222400174440ustar00rootroot00000000000000TYPE TYPE_load(const unsigned char *S) { TYPE Z = 0; int K; for (K = 0;K < N;K += 8) Z |= ((TYPE) (*S++)) << K; return Z; } TYPE TYPE_load_bigendian(const unsigned char *S) { TYPE Z = 0; int K; for (K = N - 8;K >= 0;K -= 8) Z |= ((TYPE) (*S++)) << K; return Z; } void TYPE_store(unsigned char *S,TYPE X) { int K; for (K = 0;K < N;K += 8) *S++ = X >> K; } void TYPE_store_bigendian(unsigned char *S,TYPE X) { int K; for (K = N - 8;K >= 0;K -= 8) *S++ = X >> K; } SIGNED SIGNED_negative_mask(SIGNED X) { #if amd64 8: readasm("amd64; int8 X; X signed>>= 7"); 16: readasm("amd64; int16 X; X signed>>= 15"); 32: readasm("amd64; int32 X; X signed>>= 31"); 64: readasm("amd64; int64 X; X signed>>= 63"); return X; #elif arm64 SIGNED Y; 8: readasm("arm64; int8 X Y; Y = -(1 & (X unsigned>> 7))"); 16: readasm("arm64; int16 X Y; Y = -(1 & (X unsigned>> 15))"); 32: readasm("arm64; int32 X Y; Y = X signed>> 31"); 64: readasm("arm64; int64 X Y; Y = X signed>> 63"); return Y; #elif arm32 SIGNED Y; 8: readasm("arm32; int8 X Y; Y = (int8) X; Y = Y signed>> 31"); 16: readasm("arm32; int16 X Y; Y = (int16) X; Y = Y signed>> 31"); 32: readasm("arm32; int32 X Y; Y = X signed>> 31"); 64: readasm("arm32; int64 X Y; Y.lo = X.hi signed>> 31; Y.hi = Y.lo"); return Y; #elif sparc32 SIGNED Y; 8: readasm("sparc32; int8 X Y; Y = X << 24; Y = Y signed>> 31"); 16: readasm("sparc32; int16 X Y; Y = X << 16; Y = Y signed>> 31"); 32: readasm("sparc32; int32 X Y; Y = X signed>> 31"); 64: readasm("sparc32; int64 X Y; Y.lo = X.hi signed>> 31; Y.hi = Y.lo"); return Y; #else X >>= N-6; X += SIGNED_optblocker; X >>= 5; return X; #endif } UNSIGNED UNSIGNED_topbit_01(UNSIGNED X) { #if amd64 8: readasm("amd64; int8 X; X unsigned>>= 7"); 16: readasm("amd64; int16 X; X unsigned>>= 15"); 32: readasm("amd64; int32 X; X unsigned>>= 31"); 64: readasm("amd64; int64 X; X unsigned>>= 63"); return X; #elif arm64 UNSIGNED Y; 8: readasm("arm64; int8 X Y; Y = 1 & (X unsigned>> 7)"); 16: readasm("arm64; int16 X Y; Y = 1 & (X unsigned>> 15)"); 32: readasm("arm64; int32 X Y; Y = X unsigned>> 31"); 64: readasm("arm64; int64 X Y; Y = X unsigned>> 63"); return Y; #elif arm32 SIGNED Y; 8: readasm("arm32; int8 X Y; Y = (uint8) X; Y = Y unsigned>> 7"); 16: readasm("arm32; int16 X Y; Y = (uint16) X; Y = Y unsigned>> 15"); 32: readasm("arm32; int32 X Y; Y = X unsigned>> 31"); 64: readasm("arm32; int64 X Y; Y.lo = X.hi unsigned>> 31; Y.hi = 0"); return Y; #elif sparc32 UNSIGNED Y; 8: readasm("sparc32; int8 X Y; Y = (uint8) X; Y = Y unsigned>> 7"); 16: readasm("sparc32; int16 X Y; Y = (uint16) X; Y = Y unsigned>> 15"); 32: readasm("sparc32; int32 X Y; Y = X unsigned>> 31"); 64: readasm("sparc32; int64 X Y; Y.lo = X.hi unsigned>> 31; Y.hi = 0"); return Y; #else X >>= N-6; X += SIGNED_optblocker; X >>= 5; return X; #endif } SIGNED: TYPE TYPE_negative_01(TYPE X) { return UNSIGNED_topbit_01(X); } SIGNED: TYPE TYPE_topbit_mask(TYPE X) { return SIGNED_negative_mask(X); } SIGNED: TYPE TYPE_topbit_01(TYPE X) { return UNSIGNED_topbit_01(X); } UNSIGNED: TYPE TYPE_topbit_mask(TYPE X) { return SIGNED_negative_mask(X); } SIGNED: TYPE TYPE_bottombit_mask(TYPE X) { #if amd64 8: readasm("amd64; int8 X; X &= 1"); 16: readasm("amd64; int16 X; X &= 1"); 32: readasm("amd64; int32 X; X &= 1"); 64: readasm("amd64; int64 X; X &= 1"); return -X; #elif arm64 TYPE Y; 8: readasm("arm64; int8 X Y; Y = -(1 & (X unsigned>> 0))"); 16: readasm("arm64; int16 X Y; Y = -(1 & (X unsigned>> 0))"); 32: readasm("arm64; int32 X Y; Y = -(1 & (X unsigned>> 0))"); 64: readasm("arm64; int64 X Y; Y = -(1 & (X unsigned>> 0))"); return Y; #elif arm32 TYPE Y; 8: readasm("arm32; int8 X Y; Y = X & 1; Y = -Y"); 16: readasm("arm32; int16 X Y; Y = X & 1; Y = -Y"); 32: readasm("arm32; int32 X Y; Y = X & 1; Y = -Y"); 64: readasm("arm32; int64 X Y; Y.lo = X.lo & 1; Y.lo = -Y.lo; Y.hi = Y.lo"); return Y; #elif sparc32 TYPE Y; 8: readasm("sparc32; int8 X Y; Y = X & 1; Y = -Y"); 16: readasm("sparc32; int16 X Y; Y = X & 1; Y = -Y"); 32: readasm("sparc32; int32 X Y; Y = X & 1; Y = -Y"); 64: readasm("sparc32; int64 X Y; Y.lo = X.lo & 1; Y.lo = -Y.lo; Y.hi = Y.lo"); return Y; #else X &= 1 + SIGNED_optblocker; return -X; #endif } UNSIGNED: TYPE TYPE_bottombit_mask(TYPE X) { #if amd64 8: readasm("amd64; int8 X; X &= 1"); 16: readasm("amd64; int16 X; X &= 1"); 32: readasm("amd64; int32 X; X &= 1"); 64: readasm("amd64; int64 X; X &= 1"); return -X; #elif arm64 TYPE Y; 8: readasm("arm64; int8 X Y; Y = -(1 & (X unsigned>> 0))"); 16: readasm("arm64; int16 X Y; Y = -(1 & (X unsigned>> 0))"); 32: readasm("arm64; int32 X Y; Y = -(1 & (X unsigned>> 0))"); 64: readasm("arm64; int64 X Y; Y = -(1 & (X unsigned>> 0))"); return Y; #elif arm32 TYPE Y; 8: readasm("arm32; int8 X Y; Y = X & 1; Y = -Y; Y = (uint8) Y"); 16: readasm("arm32; int16 X Y; Y = X & 1; Y = -Y; Y = (uint16) Y"); 32: readasm("arm32; int32 X Y; Y = X & 1; Y = -Y"); 64: readasm("arm32; int64 X Y; Y.lo = X.lo & 1; Y.lo = -Y.lo; Y.hi = Y.lo"); return Y; #elif sparc32 TYPE Y; 8: readasm("sparc32; int8 X Y; Y = X & 1; Y = -Y; Y = (uint8) Y"); 16: readasm("sparc32; int16 X Y; Y = X & 1; Y = -Y; Y = (uint16) Y"); 32: readasm("sparc32; int32 X Y; Y = X & 1; Y = -Y"); 64: readasm("sparc32; int64 X Y; Y.lo = X.lo & 1; Y.lo = -Y.lo; Y.hi = Y.lo"); return Y; #else X &= 1 + SIGNED_optblocker; return -X; #endif } TYPE TYPE_bottombit_01(TYPE X) { #if amd64 8: readasm("amd64; int8 X; X &= 1"); 16: readasm("amd64; int16 X; X &= 1"); 32: readasm("amd64; int32 X; X &= 1"); 64: readasm("amd64; int64 X; X &= 1"); return X; #elif arm64 TYPE Y; 8: readasm("arm64; int8 X Y; Y = 1 & (X unsigned>> 0)"); 16: readasm("arm64; int16 X Y; Y = 1 & (X unsigned>> 0)"); 32: readasm("arm64; int32 X Y; Y = 1 & (X unsigned>> 0)"); 64: readasm("arm64; int64 X Y; Y = 1 & (X unsigned>> 0)"); return Y; #elif arm32 TYPE Y; 8: readasm("arm32; int8 X Y; Y = X & 1"); 16: readasm("arm32; int16 X Y; Y = X & 1"); 32: readasm("arm32; int32 X Y; Y = X & 1"); 64: readasm("arm32; int64 X Y; Y.lo = X.lo & 1; Y.hi = 0"); return Y; #elif sparc32 TYPE Y; 8: readasm("sparc32; int8 X Y; Y = X & 1"); 16: readasm("sparc32; int16 X Y; Y = X & 1"); 32: readasm("sparc32; int32 X Y; Y = X & 1"); 64: readasm("sparc32; int64 X Y; Y.lo = X.lo & 1; Y.hi = 0"); return Y; #else X &= 1 + SIGNED_optblocker; return X; #endif } SIGNED: TYPE TYPE_bitinrangepublicpos_mask(TYPE X,TYPE S) { #if amd64 8: readasm("amd64; int8 X S; X signed>>= S"); 16: readasm("amd64; int16 X S; X signed>>= S"); 32: readasm("amd64; int32 X S; X signed>>= S"); 64: readasm("amd64; int64 X S; X signed>>= S"); #elif arm64 8: readasm("arm64; int8 X S; X = (int8) X; X = X signed>> S"); 16: readasm("arm64; int16 X S; X = (int16) X; X = X signed>> S"); 32: readasm("arm64; int32 X S; X = X signed>> S"); 64: readasm("arm64; int64 X S; X = X signed>> S"); #elif arm32 8: readasm("arm32; int8 X S; S = S & 7; X = (int8) X; X = X signed>> S"); 16: readasm("arm32; int16 X S; S = S & 15; X = (int16) X; X = X signed>> S"); 32: readasm("arm32; int32 X S; S = S & 31; X = X signed>> S"); 64: readasm("arm32; int64 X S; S.lo = S.lo & 63; X.lo = X.lo unsigned>> S.lo; S.hi = 32 - S.lo; X.lo = X.lo | (X.hi << S.hi); flags, S.hi = S.lo - 32; X.lo = X.lo | (X.hi signed>> S.hi) if unsigned>=; X.hi = X.hi signed>> S.lo"); #elif sparc32 8: readasm("sparc32; int8 X S; S = S & 7; X = X signed>> S"); 16: readasm("sparc32; int16 X S; S = S & 15; X = X signed>> S"); 32: readasm("sparc32; int32 X S; X = X signed>> S"); 64: TYPE Y, Z; 64: readasm("sparc32; int64 X Y Z S; S.hi = ~S.lo; Z.hi = S.lo << 26; Z.lo = X.hi << 1; Y.lo = X.lo unsigned>> S.lo; Z.lo = Z.lo << S.hi; Y.hi = X.hi signed>> S.lo; Z.hi = Z.hi signed>> 31; Y.lo = Y.lo | Z.lo; Z.lo = Y.lo ^ Y.hi; Z.lo = Z.hi & Z.lo; X.hi = Y.hi signed>> Z.hi; X.lo = Y.lo ^ Z.lo"); #else X >>= S ^ SIGNED_optblocker; #endif return TYPE_bottombit_mask(X); } SIGNED: TYPE TYPE_bitinrangepublicpos_01(TYPE X,TYPE S) { #if amd64 8: readasm("amd64; int8 X S; X signed>>= S"); 16: readasm("amd64; int16 X S; X signed>>= S"); 32: readasm("amd64; int32 X S; X signed>>= S"); 64: readasm("amd64; int64 X S; X signed>>= S"); #elif arm64 8: readasm("arm64; int8 X S; X = (int8) X; X = X signed>> S"); 16: readasm("arm64; int16 X S; X = (int16) X; X = X signed>> S"); 32: readasm("arm64; int32 X S; X = X signed>> S"); 64: readasm("arm64; int64 X S; X = X signed>> S"); #elif arm32 8: readasm("arm32; int8 X S; S = S & 7; X = (int8) X; X = X signed>> S"); 16: readasm("arm32; int16 X S; S = S & 15; X = (int16) X; X = X signed>> S"); 32: readasm("arm32; int32 X S; S = S & 31; X = X signed>> S"); 64: readasm("arm32; int64 X S; S.lo = S.lo & 63; X.lo = X.lo unsigned>> S.lo; S.hi = 32 - S.lo; X.lo = X.lo | (X.hi << S.hi); flags, S.hi = S.lo - 32; X.lo = X.lo | (X.hi signed>> S.hi) if unsigned>=; X.hi = X.hi signed>> S.lo"); #elif sparc32 8: readasm("sparc32; int8 X S; S = S & 7; X = X signed>> S"); 16: readasm("sparc32; int16 X S; S = S & 15; X = X signed>> S"); 32: readasm("sparc32; int32 X S; X = X signed>> S"); 64: TYPE Y, Z; 64: readasm("sparc32; int64 X Y Z S; S.hi = ~S.lo; Z.hi = S.lo << 26; Z.lo = X.hi << 1; Y.lo = X.lo unsigned>> S.lo; Z.lo = Z.lo << S.hi; Y.hi = X.hi signed>> S.lo; Z.hi = Z.hi signed>> 31; Y.lo = Y.lo | Z.lo; Z.lo = Y.lo ^ Y.hi; Z.lo = Z.hi & Z.lo; X.hi = Y.hi signed>> Z.hi; X.lo = Y.lo ^ Z.lo"); #else X >>= S ^ SIGNED_optblocker; #endif return TYPE_bottombit_01(X); } UNSIGNED: TYPE TYPE_bitinrangepublicpos_mask(TYPE X,TYPE S) { #if amd64 8: readasm("amd64; int8 X S; X unsigned>>= S"); 16: readasm("amd64; int16 X S; X unsigned>>= S"); 32: readasm("amd64; int32 X S; X unsigned>>= S"); 64: readasm("amd64; int64 X S; X unsigned>>= S"); #elif arm64 8: readasm("arm64; int8 X S; X = (uint8) X; X = X unsigned>> S"); 16: readasm("arm64; int16 X S; X = (uint16) X; X = X unsigned>> S"); 32: readasm("arm64; int32 X S; X = X unsigned>> S"); 64: readasm("arm64; int64 X S; X = X unsigned>> S"); #elif arm32 8: readasm("arm32; int8 X S; S = S & 7; X = (uint8) X; X = X unsigned>> S"); 16: readasm("arm32; int16 X S; S = S & 15; X = (uint16) X; X = X unsigned>> S"); 32: readasm("arm32; int32 X S; S = S & 31; X = X unsigned>> S"); 64: readasm("arm32; int64 X S; S.lo = S.lo & 63; X.lo = X.lo unsigned>> S.lo; S.hi = 32 - S.lo; X.lo = X.lo | (X.hi << S.hi); S.hi = S.lo - 32; X.lo = X.lo | (X.hi unsigned>> S.hi); X.hi = X.hi unsigned>> S.lo"); #elif sparc32 8: readasm("sparc32; int8 X S; S = S & 7; X = X unsigned>> S"); 16: readasm("sparc32; int16 X S; S = S & 15; X = X unsigned>> S"); 32: readasm("sparc32; int32 X S; X = X unsigned>> S"); 64: TYPE Y, Z; 64: readasm("sparc32; int64 X Y Z S; S.hi = ~S.lo; Z.hi = S.lo << 26; Z.lo = X.hi << 1; Y.lo = X.lo unsigned>> S.lo; Z.lo = Z.lo << S.hi; Y.hi = X.hi unsigned>> S.lo; Z.hi = Z.hi signed>> 31; Y.lo = Y.lo | Z.lo; Z.lo = Y.lo ^ Y.hi; X.hi = Z.hi & Y.hi; Z.lo = Z.hi & Z.lo; X.hi = X.hi ^ Y.hi; X.lo = Y.lo ^ Z.lo"); #else X >>= S ^ SIGNED_optblocker; #endif return TYPE_bottombit_mask(X); } UNSIGNED: TYPE TYPE_bitinrangepublicpos_01(TYPE X,TYPE S) { #if amd64 8: readasm("amd64; int8 X S; X unsigned>>= S"); 16: readasm("amd64; int16 X S; X unsigned>>= S"); 32: readasm("amd64; int32 X S; X unsigned>>= S"); 64: readasm("amd64; int64 X S; X unsigned>>= S"); #elif arm64 8: readasm("arm64; int8 X S; X = (uint8) X; X = X unsigned>> S"); 16: readasm("arm64; int16 X S; X = (uint16) X; X = X unsigned>> S"); 32: readasm("arm64; int32 X S; X = X unsigned>> S"); 64: readasm("arm64; int64 X S; X = X unsigned>> S"); #elif arm32 8: readasm("arm32; int8 X S; S = S & 7; X = (uint8) X; X = X unsigned>> S"); 16: readasm("arm32; int16 X S; S = S & 15; X = (uint16) X; X = X unsigned>> S"); 32: readasm("arm32; int32 X S; S = S & 31; X = X unsigned>> S"); 64: readasm("arm32; int64 X S; S.lo = S.lo & 63; X.lo = X.lo unsigned>> S.lo; S.hi = 32 - S.lo; X.lo = X.lo | (X.hi << S.hi); S.hi = S.lo - 32; X.lo = X.lo | (X.hi unsigned>> S.hi); X.hi = X.hi unsigned>> S.lo"); #elif sparc32 8: readasm("sparc32; int8 X S; S = S & 7; X = X unsigned>> S"); 16: readasm("sparc32; int16 X S; S = S & 15; X = X unsigned>> S"); 32: readasm("sparc32; int32 X S; X = X unsigned>> S"); 64: TYPE Y, Z; 64: readasm("sparc32; int64 X Y Z S; S.hi = ~S.lo; Z.hi = S.lo << 26; Z.lo = X.hi << 1; Y.lo = X.lo unsigned>> S.lo; Z.lo = Z.lo << S.hi; Y.hi = X.hi unsigned>> S.lo; Z.hi = Z.hi signed>> 31; Y.lo = Y.lo | Z.lo; Z.lo = Y.lo ^ Y.hi; X.hi = Z.hi & Y.hi; Z.lo = Z.hi & Z.lo; X.hi = X.hi ^ Y.hi; X.lo = Y.lo ^ Z.lo"); #else X >>= S ^ SIGNED_optblocker; #endif return TYPE_bottombit_01(X); } SIGNED: TYPE TYPE_shlmod(TYPE X,TYPE S) { #if amd64 8: S &= 7; 8: readasm("amd64; int8 X S; X <<= S"); 16: S &= 15; 16: readasm("amd64; int16 X S; X <<= S"); 32: readasm("amd64; int32 X S; X <<= S"); 64: readasm("amd64; int64 X S; X <<= S"); #elif arm64 8: S &= 7; 8: readasm("arm64; int8 X S; X = (uint8) X; X = X << S"); 16: S &= 15; 16: readasm("arm64; int16 X S; X = (uint16) X; X = X << S"); 32: readasm("arm64; int32 X S; X = X << S"); 64: readasm("arm64; int64 X S; X = X << S"); #elif arm32 8: S &= 7; 8: readasm("arm32; int8 X S; X = X << S; X = (int8) X"); 16: S &= 15; 16: readasm("arm32; int16 X S; X = X << S; X = (int16) X"); 32: S &= 31; 32: readasm("arm32; int32 X S; X = X << S"); 64: readasm("arm32; int64 X S; S.lo = S.lo & 63; X.hi = X.hi << S.lo; S.hi = S.lo - 32; X.hi = X.hi | (X.lo << S.hi); S.hi = 32 - S.lo; X.hi = X.hi | (X.lo unsigned>> S.hi); X.lo = X.lo << S.lo"); #elif sparc32 8: S &= 7; S += 24; 8: readasm("sparc32; int8 X S; X = X << S; X = X signed>> 24"); 16: S &= 15; S += 16; 16: readasm("sparc32; int16 X S; X = X << S; X = X signed>> 16"); 32: readasm("sparc32; int32 X S; X = X << S"); 64: TYPE Y, Z; 64: readasm("sparc32; int64 X Y Z S; S.hi = ~S.lo; Z.hi = S.lo << 26; Z.lo = X.lo unsigned>> 1; Y.lo = X.lo << S.lo; Z.lo = Z.lo unsigned>> S.hi; Y.hi = X.hi << S.lo; Z.hi = Z.hi signed>> 31; Y.hi = Y.hi | Z.lo; Z.lo = Y.lo ^ Y.hi; X.lo = Z.hi & Y.lo; Z.lo = Z.hi & Z.lo; X.lo = X.lo ^ Y.lo; X.hi = Y.hi ^ Z.lo"); #else int K, L; for (L = 0,K = 1;K < N;++L,K *= 2) X ^= (X ^ (X << K)) & TYPE_bitinrangepublicpos_mask(S,L); #endif return X; } UNSIGNED: TYPE TYPE_shlmod(TYPE X,TYPE S) { #if amd64 8: S &= 7; 8: readasm("amd64; int8 X S; X <<= S"); 16: S &= 15; 16: readasm("amd64; int16 X S; X <<= S"); 32: readasm("amd64; int32 X S; X <<= S"); 64: readasm("amd64; int64 X S; X <<= S"); #elif arm64 8: S &= 7; 8: readasm("arm64; int8 X S; X = (uint8) X; X = X << S"); 16: S &= 15; 16: readasm("arm64; int16 X S; X = (uint16) X; X = X << S"); 32: readasm("arm64; int32 X S; X = X << S"); 64: readasm("arm64; int64 X S; X = X << S"); #elif arm32 8: S &= 7; 8: readasm("arm32; int8 X S; X = X << S; X = (uint8) X"); 16: S &= 15; 16: readasm("arm32; int16 X S; X = X << S; X = (uint16) X"); 32: S &= 31; 32: readasm("arm32; int32 X S; X = X << S"); 64: readasm("arm32; int64 X S; S.lo = S.lo & 63; X.hi = X.hi << S.lo; S.hi = S.lo - 32; X.hi = X.hi | (X.lo << S.hi); S.hi = 32 - S.lo; X.hi = X.hi | (X.lo unsigned>> S.hi); X.lo = X.lo << S.lo"); #elif sparc32 8: S &= 7; 8: readasm("sparc32; int8 X S; X = X << S; X = (uint8) X"); 16: S &= 15; 16: readasm("sparc32; int16 X S; X = X << S; X = (uint16) X"); 32: readasm("sparc32; int32 X S; X = X << S"); 64: TYPE Y, Z; 64: readasm("sparc32; int64 X Y Z S; S.hi = ~S.lo; Z.hi = S.lo << 26; Z.lo = X.lo unsigned>> 1; Y.lo = X.lo << S.lo; Z.lo = Z.lo unsigned>> S.hi; Y.hi = X.hi << S.lo; Z.hi = Z.hi signed>> 31; Y.hi = Y.hi | Z.lo; Z.lo = Y.lo ^ Y.hi; X.lo = Z.hi & Y.lo; Z.lo = Z.hi & Z.lo; X.lo = X.lo ^ Y.lo; X.hi = Y.hi ^ Z.lo"); #else int K, L; for (L = 0,K = 1;K < N;++L,K *= 2) X ^= (X ^ (X << K)) & TYPE_bitinrangepublicpos_mask(S,L); #endif return X; } SIGNED: TYPE TYPE_shrmod(TYPE X,TYPE S) { #if amd64 8: S &= 7; 8: readasm("amd64; int8 X S; X signed>>= S"); 16: S &= 15; 16: readasm("amd64; int16 X S; X signed>>= S"); 32: readasm("amd64; int32 X S; X signed>>= S"); 64: readasm("amd64; int64 X S; X signed>>= S"); #elif arm64 8: S &= 7; 8: readasm("arm64; int8 X S; X = (int8) X; X = X signed>> S"); 16: S &= 15; 16: readasm("arm64; int16 X S; X = (int16) X; X = X signed>> S"); 32: readasm("arm64; int32 X S; X = X signed>> S"); 64: readasm("arm64; int64 X S; X = X signed>> S"); #elif arm32 8: S &= 7; 8: readasm("arm32; int8 X S; X = (int8) X; X = X signed>> S"); 16: S &= 15; 16: readasm("arm32; int16 X S; X = (int16) X; X = X signed>> S"); 32: S &= 31; 32: readasm("arm32; int32 X S; X = X signed>> S"); 64: readasm("arm32; int64 X S; S.lo = S.lo & 63; X.lo = X.lo unsigned>> S.lo; S.hi = 32 - S.lo; X.lo = X.lo | (X.hi << S.hi); flags, S.hi = S.lo - 32; X.lo = X.lo | (X.hi signed>> S.hi) if unsigned>=; X.hi = X.hi signed>> S.lo"); #elif sparc32 8: S &= 7; 8: readasm("sparc32; int8 X S; X = X signed>> S"); 16: S &= 15; 16: readasm("sparc32; int16 X S; X = X signed>> S"); 32: readasm("sparc32; int32 X S; X = X signed>> S"); 64: TYPE Y, Z; 64: readasm("sparc32; int64 X Y Z S; S.hi = ~S.lo; Z.hi = S.lo << 26; Z.lo = X.hi << 1; Y.lo = X.lo unsigned>> S.lo; Z.lo = Z.lo << S.hi; Y.hi = X.hi signed>> S.lo; Z.hi = Z.hi signed>> 31; Y.lo = Y.lo | Z.lo; Z.lo = Y.lo ^ Y.hi; Z.lo = Z.hi & Z.lo; X.hi = Y.hi signed>> Z.hi; X.lo = Y.lo ^ Z.lo"); #else int K, L; for (L = 0,K = 1;K < N;++L,K *= 2) X ^= (X ^ (X >> K)) & TYPE_bitinrangepublicpos_mask(S,L); #endif return X; } UNSIGNED: TYPE TYPE_shrmod(TYPE X,TYPE S) { #if amd64 8: S &= 7; 8: readasm("amd64; int8 X S; X unsigned>>= S"); 16: S &= 15; 16: readasm("amd64; int16 X S; X unsigned>>= S"); 32: readasm("amd64; int32 X S; X unsigned>>= S"); 64: readasm("amd64; int64 X S; X unsigned>>= S"); #elif arm64 8: S &= 7; 8: readasm("arm64; int8 X S; X = (uint8) X; X = X unsigned>> S"); 16: S &= 15; 16: readasm("arm64; int16 X S; X = (uint16) X; X = X unsigned>> S"); 32: readasm("arm64; int32 X S; X = X unsigned>> S"); 64: readasm("arm64; int64 X S; X = X unsigned>> S"); #elif arm32 8: S &= 7; 8: readasm("arm32; int8 X S; X = (uint8) X; X = X unsigned>> S"); 16: S &= 15; 16: readasm("arm32; int16 X S; X = (uint16) X; X = X unsigned>> S"); 32: S &= 31; 32: readasm("arm32; int32 X S; X = X unsigned>> S"); 64: readasm("arm32; int64 X S; S.lo = S.lo & 63; X.lo = X.lo unsigned>> S.lo; S.hi = 32 - S.lo; X.lo = X.lo | (X.hi << S.hi); S.hi = S.lo - 32; X.lo = X.lo | (X.hi unsigned>> S.hi); X.hi = X.hi unsigned>> S.lo"); #elif sparc32 8: S &= 7; 8: readasm("sparc32; int8 X S; X = X unsigned>> S"); 16: S &= 15; 16: readasm("sparc32; int16 X S; X = X unsigned>> S"); 32: readasm("sparc32; int32 X S; X = X unsigned>> S"); 64: TYPE Y, Z; 64: readasm("sparc32; int64 X Y Z S; S.hi = ~S.lo; Z.hi = S.lo << 26; Z.lo = X.hi << 1; Y.lo = X.lo unsigned>> S.lo; Z.lo = Z.lo << S.hi; Y.hi = X.hi unsigned>> S.lo; Z.hi = Z.hi signed>> 31; Y.lo = Y.lo | Z.lo; Z.lo = Y.lo ^ Y.hi; X.hi = Z.hi & Y.hi; Z.lo = Z.hi & Z.lo; X.hi = X.hi ^ Y.hi; X.lo = Y.lo ^ Z.lo"); #else int K, L; for (L = 0,K = 1;K < N;++L,K *= 2) X ^= (X ^ (X >> K)) & TYPE_bitinrangepublicpos_mask(S,L); #endif return X; } TYPE TYPE_bitmod_mask(TYPE X,TYPE S) { X = TYPE_shrmod(X,S); return TYPE_bottombit_mask(X); } TYPE TYPE_bitmod_01(TYPE X,TYPE S) { X = TYPE_shrmod(X,S); return TYPE_bottombit_01(X); } TYPE TYPE_nonzero_mask(TYPE X) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Z32; Z32 = 0; Q32 = -1; X32 & (int8) X32; Z32 = Q32 if !="); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Z; Z = 0; Q = -1; X & X; Z = Q if !="); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Z; Z = 0; Q = -1; X & X; Z = Q if !="); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Z; Z = 0; Q = -1; X & X; Z = Q if !="); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Z; X & 255; Z = -1 if != else 0"); 16: readasm("arm64; int16 X Z; X & 65535; Z = -1 if != else 0"); 32: readasm("arm64; int32 X Z; X - 0; Z = -1 if != else 0"); 64: readasm("arm64; int64 X Z; X - 0; Z = -1 if != else 0"); return Z; #elif arm32 8: readasm("arm32; int8 X; X = (uint8) X; X - 0; X = -1 if !="); 16: readasm("arm32; int16 X; X = (uint16) X; X - 0; X = -1 if !="); 32: readasm("arm32; int32 X; X - 0; X = -1 if !="); 64: readasm("arm32; int64 X; flags, X.lo = X.lo | X.hi; X.lo = -1 if !=; X.hi = X.lo"); return X; #elif sparc32 TYPE Z; 8: readasm("sparc32; int8 X Z; X = (uint8) X; 0 - X; Z = -carry"); 16: readasm("sparc32; int16 X Z; X = (uint16) X; 0 - X; Z = -carry"); 32: readasm("sparc32; int32 X Z; 0 - X; Z = -carry"); 64: readasm("sparc32; int64 X Z; Z.lo = X.lo | X.hi; 0 - Z.lo; Z.lo = -carry; Z.hi = Z.lo"); return Z; #else X |= -X; return SIGNED_negative_mask(X); #endif } TYPE TYPE_nonzero_01(TYPE X) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Z32; Z32 = 0; Q32 = 1; X32 & (int8) X32; Z32 = Q32 if !="); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Z; Z = 0; Q = 1; X & X; Z = Q if !="); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Z; Z = 0; Q = 1; X & X; Z = Q if !="); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Z; Z = 0; Q = 1; X & X; Z = Q if !="); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Z; X & 255; Z = 1 if != else 0"); 16: readasm("arm64; int16 X Z; X & 65535; Z = 1 if != else 0"); 32: readasm("arm64; int32 X Z; X - 0; Z = 1 if != else 0"); 64: readasm("arm64; int64 X Z; X - 0; Z = 1 if != else 0"); return Z; #elif arm32 8: readasm("arm32; int8 X; X = (uint8) X; X - 0; X = 1 if !="); 16: readasm("arm32; int16 X; X = (uint16) X; X - 0; X = 1 if !="); 32: readasm("arm32; int32 X; X - 0; X = 1 if !="); 64: readasm("arm32; int64 X; flags, X.lo = X.lo | X.hi; X.lo = 1 if !=; X.hi = 0"); return X; #elif sparc32 TYPE Z; 8: readasm("sparc32; int8 X Z; X = (uint8) X; 0 - X; Z = carry"); 16: readasm("sparc32; int16 X Z; X = (uint16) X; 0 - X; Z = carry"); 32: readasm("sparc32; int32 X Z; 0 - X; Z = carry"); 64: readasm("sparc32; int64 X Z; Z.lo = X.lo | X.hi; 0 - Z.lo; Z.lo = carry; Z.hi = 0"); return Z; #else X |= -X; return UNSIGNED_topbit_01(X); #endif } SIGNED: TYPE TYPE_positive_mask(TYPE X) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Z32; Z32 = 0; Q32 = -1; X32 & (int8) X32; Z32 = Q32 if signed>"); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Z; Z = 0; Q = -1; X & X; Z = Q if signed>"); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Z; Z = 0; Q = -1; X & X; Z = Q if signed>"); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Z; Z = 0; Q = -1; X & X; Z = Q if signed>"); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Z; Z = (int8) X; Z - 0; Z = -1 if signed> else 0"); 16: readasm("arm64; int16 X Z; Z = (int16) X; Z - 0; Z = -1 if signed> else 0"); 32: readasm("arm64; int32 X Z; X - 0; Z = -1 if signed> else 0"); 64: readasm("arm64; int64 X Z; X - 0; Z = -1 if signed> else 0"); return Z; #elif sparc32 TYPE Z; 8: readasm("sparc32; int8 X Z; Z = X << 24; Z = Z signed>> 31; Z = Z - X; Z = Z signed>> 31"); 16: readasm("sparc32; int16 X Z; Z = X << 16; Z = Z signed>> 31; Z = Z - X; Z = Z signed>> 31"); 32: readasm("sparc32; int32 X Z; Z = X signed>> 31; Z = Z - X; Z = Z signed>> 31"); 64: readasm("sparc32; int64 X Z; Z.lo = X.hi signed>> 31; carry, Z.hi = Z.lo - X.lo; Z.hi = Z.lo - X.hi - carry; Z.hi = Z.hi signed>> 31; Z.lo = Z.hi"); return Z; #else TYPE Z = -X; Z ^= X & Z; return TYPE_negative_mask(Z); #endif } SIGNED: TYPE TYPE_positive_01(TYPE X) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Z32; Z32 = 0; Q32 = 1; X32 & (int8) X32; Z32 = Q32 if signed>"); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Z; Z = 0; Q = 1; X & X; Z = Q if signed>"); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Z; Z = 0; Q = 1; X & X; Z = Q if signed>"); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Z; Z = 0; Q = 1; X & X; Z = Q if signed>"); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Z; Z = (int8) X; Z - 0; Z = 1 if signed> else 0"); 16: readasm("arm64; int16 X Z; Z = (int16) X; Z - 0; Z = 1 if signed> else 0"); 32: readasm("arm64; int32 X Z; X - 0; Z = 1 if signed> else 0"); 64: readasm("arm64; int64 X Z; X - 0; Z = 1 if signed> else 0"); return Z; #elif sparc32 TYPE Z; 8: readasm("sparc32; int8 X Z; Z = X << 24; Z = Z signed>> 31; Z = Z - X; Z = Z unsigned>> 31"); 16: readasm("sparc32; int16 X Z; Z = X << 16; Z = Z signed>> 31; Z = Z - X; Z = Z unsigned>> 31"); 32: readasm("sparc32; int32 X Z; Z = X signed>> 31; Z = Z - X; Z = Z unsigned>> 31"); 64: readasm("sparc32; int64 X Z; Z.hi = X.hi signed>> 31; carry, Z.lo = Z.hi - X.lo; Z.lo = Z.hi - X.hi - carry; Z.lo = Z.lo unsigned>> 31; Z.hi = 0"); return Z; #else TYPE Z = -X; Z ^= X & Z; return UNSIGNED_topbit_01(Z); #endif } TYPE TYPE_zero_mask(TYPE X) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Z32; Z32 = 0; Q32 = -1; X32 & (int8) X32; Z32 = Q32 if ="); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Z; Z = 0; Q = -1; X & X; Z = Q if ="); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Z; Z = 0; Q = -1; X & X; Z = Q if ="); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Z; Z = 0; Q = -1; X & X; Z = Q if ="); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Z; X & 255; Z = -1 if = else 0"); 16: readasm("arm64; int16 X Z; X & 65535; Z = -1 if = else 0"); 32: readasm("arm64; int32 X Z; X - 0; Z = -1 if = else 0"); 64: readasm("arm64; int64 X Z; X - 0; Z = -1 if = else 0"); return Z; #elif sparc32 TYPE Z; 8: readasm("sparc32; int8 X Z; X = (uint8) X; 0 - X; Z = carry - 1"); 16: readasm("sparc32; int16 X Z; X = (uint16) X; 0 - X; Z = carry - 1"); 32: readasm("sparc32; int32 X Z; 0 - X; Z = carry - 1"); 64: readasm("sparc32; int64 X Z; Z.lo = X.lo | X.hi; 0 - Z.lo; Z.lo = carry - 1; Z.hi = Z.lo"); return Z; #else return ~TYPE_nonzero_mask(X); #endif } TYPE TYPE_zero_01(TYPE X) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Z32; Z32 = 0; Q32 = 1; X32 & (int8) X32; Z32 = Q32 if ="); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Z; Z = 0; Q = 1; X & X; Z = Q if ="); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Z; Z = 0; Q = 1; X & X; Z = Q if ="); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Z; Z = 0; Q = 1; X & X; Z = Q if ="); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Z; X & 255; Z = 1 if = else 0"); 16: readasm("arm64; int16 X Z; X & 65535; Z = 1 if = else 0"); 32: readasm("arm64; int32 X Z; X - 0; Z = 1 if = else 0"); 64: readasm("arm64; int64 X Z; X - 0; Z = 1 if = else 0"); return Z; #elif sparc32 TYPE Z; 8: readasm("sparc32; int8 X Z; X = (uint8) X; 0 - X; Z = 1 - carry"); 16: readasm("sparc32; int16 X Z; X = (uint16) X; 0 - X; Z = 1 - carry"); 32: readasm("sparc32; int32 X Z; 0 - X; Z = 1 - carry"); 64: readasm("sparc32; int64 X Z; Z.lo = X.lo | X.hi; 0 - Z.lo; Z.lo = 1 - carry; Z.hi = 0"); return Z; #else return 1-TYPE_nonzero_01(X); #endif } TYPE TYPE_unequal_mask(TYPE X,TYPE Y) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Y32 = Y,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Y32 Z32; Z32 = 0; Q32 = -1; X32 - (int8) Y32; Z32 = Q32 if !="); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if !="); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if !="); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if !="); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Y Z; Z = (uint8) X; Z - (uint8) Y; Z = -1 if != else 0"); 16: readasm("arm64; int16 X Y Z; Z = (uint16) X; Z - (uint16) Y; Z = -1 if != else 0"); 32: readasm("arm64; int32 X Y Z; X - Y; Z = -1 if != else 0"); 64: readasm("arm64; int64 X Y Z; X - Y; Z = -1 if != else 0"); return Z; #else return TYPE_nonzero_mask(X ^ Y); #endif } TYPE TYPE_unequal_01(TYPE X,TYPE Y) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Y32 = Y,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Y32 Z32; Z32 = 0; Q32 = 1; X32 - (int8) Y32; Z32 = Q32 if !="); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if !="); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if !="); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if !="); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Y Z; Z = (uint8) X; Z - (uint8) Y; Z = 1 if != else 0"); 16: readasm("arm64; int16 X Y Z; Z = (uint16) X; Z - (uint16) Y; Z = 1 if != else 0"); 32: readasm("arm64; int32 X Y Z; X - Y; Z = 1 if != else 0"); 64: readasm("arm64; int64 X Y Z; X - Y; Z = 1 if != else 0"); return Z; #else return TYPE_nonzero_01(X ^ Y); #endif } TYPE TYPE_equal_mask(TYPE X,TYPE Y) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Y32 = Y,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Y32 Z32; Z32 = 0; Q32 = -1; X32 - (int8) Y32; Z32 = Q32 if ="); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if ="); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if ="); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if ="); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Y Z; Z = (uint8) X; Z - (uint8) Y; Z = -1 if = else 0"); 16: readasm("arm64; int16 X Y Z; Z = (uint16) X; Z - (uint16) Y; Z = -1 if = else 0"); 32: readasm("arm64; int32 X Y Z; X - Y; Z = -1 if = else 0"); 64: readasm("arm64; int64 X Y Z; X - Y; Z = -1 if = else 0"); return Z; #else return TYPE_zero_mask(X ^ Y); #endif } TYPE TYPE_equal_01(TYPE X,TYPE Y) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Y32 = Y,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Y32 Z32; Z32 = 0; Q32 = 1; X32 - (int8) Y32; Z32 = Q32 if ="); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if ="); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if ="); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if ="); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Y Z; Z = (uint8) X; Z - (uint8) Y; Z = 1 if = else 0"); 16: readasm("arm64; int16 X Y Z; Z = (uint16) X; Z - (uint16) Y; Z = 1 if = else 0"); 32: readasm("arm64; int32 X Y Z; X - Y; Z = 1 if = else 0"); 64: readasm("arm64; int64 X Y Z; X - Y; Z = 1 if = else 0"); return Z; #else return TYPE_zero_01(X ^ Y); #endif } SIGNED: TYPE TYPE_min(TYPE X,TYPE Y) { #if amd64 8: int32_t X32 = X,Y32 = Y; 8: readasm("amd64; int32 X32 Y32; X32 - (int8) Y32; X32 = Y32 if signed>"); 8: X = X32; 16: readasm("amd64; int16 X Y; X - Y; X = Y if signed>"); 32: readasm("amd64; int32 X Y; X - Y; X = Y if signed>"); 64: readasm("amd64; int64 X Y; X - Y; X = Y if signed>"); return X; #elif arm64 8: readasm("arm64; int8 X Y; X = (int8) X; X - (int8) Y; X = X if signed< else Y"); 16: readasm("arm64; int16 X Y; X = (int16) X; X - (int16) Y; X = X if signed< else Y"); 32: readasm("arm64; int32 X Y; X - Y; X = X if signed< else Y"); 64: readasm("arm64; int64 X Y; X - Y; X = X if signed< else Y"); return X; #else TYPE R = Y ^ X; TYPE Z = Y - X; Z ^= R & (Z ^ Y); Z = TYPE_negative_mask(Z); Z &= R; return X ^ Z; #endif } UNSIGNED: TYPE TYPE_min(TYPE X,TYPE Y) { #if amd64 8: uint32_t X32 = X,Y32 = Y; 8: readasm("amd64; int32 X32 Y32; X32 - (int8) Y32; X32 = Y32 if unsigned>"); 8: X = X32; 16: readasm("amd64; int16 X Y; X - Y; X = Y if unsigned>"); 32: readasm("amd64; int32 X Y; X - Y; X = Y if unsigned>"); 64: readasm("amd64; int64 X Y; X - Y; X = Y if unsigned>"); return X; #elif arm64 8: readasm("arm64; int8 X Y; X = (uint8) X; X - (uint8) Y; X = X if unsigned< else Y"); 16: readasm("arm64; int16 X Y; X = (uint16) X; X - (uint16) Y; X = X if unsigned< else Y"); 32: readasm("arm64; int32 X Y; X - Y; X = X if unsigned< else Y"); 64: readasm("arm64; int64 X Y; X - Y; X = X if unsigned< else Y"); return X; #else TYPE R = Y ^ X; TYPE Z = Y - X; Z ^= R & (Z ^ Y ^ (((TYPE) 1) << (N-1))); Z = SIGNED_negative_mask(Z); Z &= R; return X ^ Z; #endif } SIGNED: TYPE TYPE_max(TYPE X,TYPE Y) { #if amd64 8: int32_t X32 = X,Y32 = Y; 8: readasm("amd64; int32 X32 Y32; X32 - (int8) Y32; X32 = Y32 if signed<"); 8: X = X32; 16: readasm("amd64; int16 X Y; X - Y; X = Y if signed<"); 32: readasm("amd64; int32 X Y; X - Y; X = Y if signed<"); 64: readasm("amd64; int64 X Y; X - Y; X = Y if signed<"); return X; #elif arm64 8: readasm("arm64; int8 X Y; X = (int8) X; X - (int8) Y; X = Y if signed< else X"); 16: readasm("arm64; int16 X Y; X = (int16) X; X - (int16) Y; X = Y if signed< else X"); 32: readasm("arm64; int32 X Y; X - Y; X = Y if signed< else X"); 64: readasm("arm64; int64 X Y; X - Y; X = Y if signed< else X"); return X; #else TYPE R = Y ^ X; TYPE Z = Y - X; Z ^= R & (Z ^ Y); Z = TYPE_negative_mask(Z); Z &= R; return Y ^ Z; #endif } UNSIGNED: TYPE TYPE_max(TYPE X,TYPE Y) { #if amd64 8: uint32_t X32 = X,Y32 = Y; 8: readasm("amd64; int32 X32 Y32; X32 - (int8) Y32; X32 = Y32 if unsigned<"); 8: X = X32; 16: readasm("amd64; int16 X Y; X - Y; X = Y if unsigned<"); 32: readasm("amd64; int32 X Y; X - Y; X = Y if unsigned<"); 64: readasm("amd64; int64 X Y; X - Y; X = Y if unsigned<"); return X; #elif arm64 8: readasm("arm64; int8 X Y; X = (uint8) X; X - (uint8) Y; X = Y if unsigned< else X"); 16: readasm("arm64; int16 X Y; X = (uint16) X; X - (uint16) Y; X = Y if unsigned< else X"); 32: readasm("arm64; int32 X Y; X - Y; X = Y if unsigned< else X"); 64: readasm("arm64; int64 X Y; X - Y; X = Y if unsigned< else X"); return X; #else TYPE R = Y ^ X; TYPE Z = Y - X; Z ^= R & (Z ^ Y ^ (((TYPE) 1) << (N-1))); Z = SIGNED_negative_mask(Z); Z &= R; return Y ^ Z; #endif } SIGNED: void TYPE_minmax(TYPE *P,TYPE *Q) { TYPE X = *P; TYPE Y = *Q; #if amd64 8: int32_t X32 = X,Y32 = Y,Z32; 8: readasm("amd64; int32 X32 Y32 Z32; X32 - (int8) Y32; Z32 = X32; X32 = Y32 if signed>; Y32 = Z32 if signed>"); 8: X = X32; Y = Y32; 16: TYPE Z; 16: readasm("amd64; int16 X Y Z; X - Y; Z = X; X = Y if signed>; Y = Z if signed>"); 32: TYPE Z; 32: readasm("amd64; int32 X Y Z; X - Y; Z = X; X = Y if signed>; Y = Z if signed>"); 64: TYPE Z; 64: readasm("amd64; int64 X Y Z; X - Y; Z = X; X = Y if signed>; Y = Z if signed>"); *P = X; *Q = Y; #elif arm64 TYPE R, S; 8: readasm("arm64; int8 X Y R S; X = (int8) X; X - (int8) Y; R = X if signed< else Y; S = Y if signed< else X"); 16: readasm("arm64; int16 X Y R S; X = (int16) X; X - (int16) Y; R = X if signed< else Y; S = Y if signed< else X"); 32: readasm("arm64; int32 X Y R S; X - Y; R = X if signed< else Y; S = Y if signed< else X"); 64: readasm("arm64; int64 X Y R S; X - Y; R = X if signed< else Y; S = Y if signed< else X"); *P = R; *Q = S; #else TYPE R = Y ^ X; TYPE Z = Y - X; Z ^= R & (Z ^ Y); Z = TYPE_negative_mask(Z); Z &= R; X ^= Z; Y ^= Z; *P = X; *Q = Y; #endif } UNSIGNED: void TYPE_minmax(TYPE *P,TYPE *Q) { TYPE X = *P; TYPE Y = *Q; #if amd64 8: uint32_t X32 = X,Y32 = Y,Z32; 8: readasm("amd64; int32 X32 Y32 Z32; X32 - (int8) Y32; Z32 = X32; X32 = Y32 if unsigned>; Y32 = Z32 if unsigned>"); 8: X = X32; Y = Y32; 16: TYPE Z; 16: readasm("amd64; int16 X Y Z; X - Y; Z = X; X = Y if unsigned>; Y = Z if unsigned>"); 32: TYPE Z; 32: readasm("amd64; int32 X Y Z; X - Y; Z = X; X = Y if unsigned>; Y = Z if unsigned>"); 64: TYPE Z; 64: readasm("amd64; int64 X Y Z; X - Y; Z = X; X = Y if unsigned>; Y = Z if unsigned>"); *P = X; *Q = Y; #elif arm64 TYPE R, S; 8: readasm("arm64; int8 X Y R S; X = (uint8) X; X - (uint8) Y; R = X if unsigned< else Y; S = Y if unsigned< else X"); 16: readasm("arm64; int16 X Y R S; X = (uint16) X; X - (uint16) Y; R = X if unsigned< else Y; S = Y if unsigned< else X"); 32: readasm("arm64; int32 X Y R S; X - Y; R = X if unsigned< else Y; S = Y if unsigned< else X"); 64: readasm("arm64; int64 X Y R S; X - Y; R = X if unsigned< else Y; S = Y if unsigned< else X"); *P = R; *Q = S; #else TYPE R = Y ^ X; TYPE Z = Y - X; Z ^= R & (Z ^ Y ^ (((TYPE) 1) << (N-1))); Z = SIGNED_negative_mask(Z); Z &= R; X ^= Z; Y ^= Z; *P = X; *Q = Y; #endif } SIGNED: TYPE TYPE_smaller_mask(TYPE X,TYPE Y) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Y32 = Y,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Y32 Z32; Z32 = 0; Q32 = -1; X32 - (int8) Y32; Z32 = Q32 if signed<"); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if signed<"); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if signed<"); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if signed<"); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Y Z; Z = (int8) X; Z - (int8) Y; Z = -1 if signed< else 0"); 16: readasm("arm64; int16 X Y Z; Z = (int16) X; Z - (int16) Y; Z = -1 if signed< else 0"); 32: readasm("arm64; int32 X Y Z; X - Y; Z = -1 if signed< else 0"); 64: readasm("arm64; int64 X Y Z; X - Y; Z = -1 if signed< else 0"); return Z; #else TYPE R = X ^ Y; TYPE Z = X - Y; Z ^= R & (Z ^ X); return TYPE_negative_mask(Z); #endif } SIGNED: TYPE TYPE_smaller_01(TYPE X,TYPE Y) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Y32 = Y,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Y32 Z32; Z32 = 0; Q32 = 1; X32 - (int8) Y32; Z32 = Q32 if signed<"); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if signed<"); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if signed<"); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if signed<"); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Y Z; Z = (int8) X; Z - (int8) Y; Z = 1 if signed< else 0"); 16: readasm("arm64; int16 X Y Z; Z = (int16) X; Z - (int16) Y; Z = 1 if signed< else 0"); 32: readasm("arm64; int32 X Y Z; X - Y; Z = 1 if signed< else 0"); 64: readasm("arm64; int64 X Y Z; X - Y; Z = 1 if signed< else 0"); return Z; #else TYPE R = X ^ Y; TYPE Z = X - Y; Z ^= R & (Z ^ X); return UNSIGNED_topbit_01(Z); #endif } UNSIGNED: TYPE TYPE_smaller_mask(TYPE X,TYPE Y) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Y32 = Y,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Y32 Z32; Z32 = 0; Q32 = -1; X32 - (int8) Y32; Z32 = Q32 if unsigned<"); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if unsigned<"); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if unsigned<"); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if unsigned<"); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Y Z; Z = (uint8) X; Z - (uint8) Y; Z = -1 if unsigned< else 0"); 16: readasm("arm64; int16 X Y Z; Z = (uint16) X; Z - (uint16) Y; Z = -1 if unsigned< else 0"); 32: readasm("arm64; int32 X Y Z; X - Y; Z = -1 if unsigned< else 0"); 64: readasm("arm64; int64 X Y Z; X - Y; Z = -1 if unsigned< else 0"); return Z; #else TYPE R = X ^ Y; TYPE Z = X - Y; Z ^= R & (Z ^ X ^ (((TYPE) 1) << (N-1))); return SIGNED_negative_mask(Z); #endif } UNSIGNED: TYPE TYPE_smaller_01(TYPE X,TYPE Y) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Y32 = Y,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Y32 Z32; Z32 = 0; Q32 = 1; X32 - (int8) Y32; Z32 = Q32 if unsigned<"); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if unsigned<"); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if unsigned<"); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if unsigned<"); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Y Z; Z = (uint8) X; Z - (uint8) Y; Z = 1 if unsigned< else 0"); 16: readasm("arm64; int16 X Y Z; Z = (uint16) X; Z - (uint16) Y; Z = 1 if unsigned< else 0"); 32: readasm("arm64; int32 X Y Z; X - Y; Z = 1 if unsigned< else 0"); 64: readasm("arm64; int64 X Y Z; X - Y; Z = 1 if unsigned< else 0"); return Z; #else TYPE R = X ^ Y; TYPE Z = X - Y; Z ^= R & (Z ^ X ^ (((TYPE) 1) << (N-1))); return UNSIGNED_topbit_01(Z); #endif } SIGNED: TYPE TYPE_leq_mask(TYPE X,TYPE Y) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Y32 = Y,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Y32 Z32; Z32 = 0; Q32 = -1; X32 - (int8) Y32; Z32 = Q32 if signed<="); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if signed<="); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if signed<="); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if signed<="); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Y Z; Z = (int8) X; Z - (int8) Y; Z = -1 if signed<= else 0"); 16: readasm("arm64; int16 X Y Z; Z = (int16) X; Z - (int16) Y; Z = -1 if signed<= else 0"); 32: readasm("arm64; int32 X Y Z; X - Y; Z = -1 if signed<= else 0"); 64: readasm("arm64; int64 X Y Z; X - Y; Z = -1 if signed<= else 0"); return Z; #else return ~TYPE_smaller_mask(Y,X); #endif } SIGNED: TYPE TYPE_leq_01(TYPE X,TYPE Y) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Y32 = Y,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Y32 Z32; Z32 = 0; Q32 = 1; X32 - (int8) Y32; Z32 = Q32 if signed<="); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if signed<="); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if signed<="); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if signed<="); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Y Z; Z = (int8) X; Z - (int8) Y; Z = 1 if signed<= else 0"); 16: readasm("arm64; int16 X Y Z; Z = (int16) X; Z - (int16) Y; Z = 1 if signed<= else 0"); 32: readasm("arm64; int32 X Y Z; X - Y; Z = 1 if signed<= else 0"); 64: readasm("arm64; int64 X Y Z; X - Y; Z = 1 if signed<= else 0"); return Z; #else return 1-TYPE_smaller_01(Y,X); #endif } UNSIGNED: TYPE TYPE_leq_mask(TYPE X,TYPE Y) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Y32 = Y,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Y32 Z32; Z32 = 0; Q32 = -1; X32 - (int8) Y32; Z32 = Q32 if unsigned<="); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if unsigned<="); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if unsigned<="); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Y Z; Z = 0; Q = -1; X - Y; Z = Q if unsigned<="); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Y Z; Z = (uint8) X; Z - (uint8) Y; Z = -1 if unsigned<= else 0"); 16: readasm("arm64; int16 X Y Z; Z = (uint16) X; Z - (uint16) Y; Z = -1 if unsigned<= else 0"); 32: readasm("arm64; int32 X Y Z; X - Y; Z = -1 if unsigned<= else 0"); 64: readasm("arm64; int64 X Y Z; X - Y; Z = -1 if unsigned<= else 0"); return Z; #else return ~TYPE_smaller_mask(Y,X); #endif } UNSIGNED: TYPE TYPE_leq_01(TYPE X,TYPE Y) { #if amd64 8: TYPE Z; 8: int32_t X32 = X,Y32 = Y,Q32,Z32; 8: readasm("amd64; int32 X32 Q32 Y32 Z32; Z32 = 0; Q32 = 1; X32 - (int8) Y32; Z32 = Q32 if unsigned<="); 8: Z = Z32; 16: TYPE Q,Z; 16: readasm("amd64; int16 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if unsigned<="); 32: TYPE Q,Z; 32: readasm("amd64; int32 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if unsigned<="); 64: TYPE Q,Z; 64: readasm("amd64; int64 X Q Y Z; Z = 0; Q = 1; X - Y; Z = Q if unsigned<="); return Z; #elif arm64 TYPE Z; 8: readasm("arm64; int8 X Y Z; Z = (uint8) X; Z - (uint8) Y; Z = 1 if unsigned<= else 0"); 16: readasm("arm64; int16 X Y Z; Z = (uint16) X; Z - (uint16) Y; Z = 1 if unsigned<= else 0"); 32: readasm("arm64; int32 X Y Z; X - Y; Z = 1 if unsigned<= else 0"); 64: readasm("arm64; int64 X Y Z; X - Y; Z = 1 if unsigned<= else 0"); return Z; #else return 1-TYPE_smaller_01(Y,X); #endif } int TYPE_ones_num(TYPE X) { UNSIGNED Y = X; 8: const TYPE C0 = 0x55; 16: const TYPE C0 = 0x5555; 32: const TYPE C0 = 0x55555555; 64: const TYPE C0 = 0x5555555555555555; 8: const TYPE C1 = 0x33; 16: const TYPE C1 = 0x3333; 32: const TYPE C1 = 0x33333333; 64: const TYPE C1 = 0x3333333333333333; 8: const TYPE C2 = 0x0f; 16: const TYPE C2 = 0x0f0f; 32: const TYPE C2 = 0x0f0f0f0f; 64: const TYPE C2 = 0x0f0f0f0f0f0f0f0f; Y -= ((Y >> 1) & C0); Y = (Y & C1) + ((Y >> 2) & C1); Y = (Y + (Y >> 4)) & C2; 16: Y = (Y + (Y >> 8)) & 0xff; 32: Y += Y >> 8; 32: Y = (Y + (Y >> 16)) & 0xff; 64: Y += Y >> 8; 64: Y += Y >> 16; 64: Y = (Y + (Y >> 32)) & 0xff; return Y; } int TYPE_bottomzeros_num(TYPE X) { #if amd64 8: int32_t fallback = N; 8: int32_t X32 = X; 8: readasm("amd64; int32 X32 fallback; X32 = numbottomzeros_tricky X32; X32 = fallback if ="); 8: X = X32; 16: TYPE fallback = N; 16: readasm("amd64; int16 X fallback; X = numbottomzeros_tricky X; X = fallback if ="); 32: TYPE fallback = N; 32: readasm("amd64; int32 X fallback; X = numbottomzeros_tricky X; X = fallback if ="); 64: TYPE fallback = N; 64: readasm("amd64; int64 X fallback; X = numbottomzeros_tricky X; X = fallback if ="); return X; #elif arm64 int64_t Y; 8: readasm("arm64; int8 X Y; Y = X | -256; Y = bitrev32 Y; Y = numbottomzeros Y"); 16: readasm("arm64; int16 X Y; Y = X | -65536; Y = bitrev32 Y; Y = numbottomzeros Y"); 32: readasm("arm64; int32 X Y; Y = bitrev32 X; Y = numbottomzeros Y"); 64: readasm("arm64; int64 X Y; Y = bitrev64 X; Y = numbottomzeros Y"); return Y; #else TYPE Y = X ^ (X-1); Y = ((SIGNED) Y) >> 1; Y &= ~(X & (((TYPE) 1) << (N-1))); return TYPE_ones_num(Y); #endif } tinyssh-20250501/cryptoint/int16_optblocker.c000066400000000000000000000002251500472222400210340ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #include "crypto_int16.h" volatile crypto_int16 crypto_int16_optblocker = 0; tinyssh-20250501/cryptoint/int32_optblocker.c000066400000000000000000000002251500472222400210320ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #include "crypto_int32.h" volatile crypto_int32 crypto_int32_optblocker = 0; tinyssh-20250501/cryptoint/int64_optblocker.c000066400000000000000000000002251500472222400210370ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #include "crypto_int64.h" volatile crypto_int64 crypto_int64_optblocker = 0; tinyssh-20250501/cryptoint/int8_optblocker.c000066400000000000000000000002221500472222400207520ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #include "crypto_int8.h" volatile crypto_int8 crypto_int8_optblocker = 0; tinyssh-20250501/cryptoint/intN_optblocker.c000066400000000000000000000002221500472222400210000ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #include "crypto_intN.h" volatile crypto_intN crypto_intN_optblocker = 0; tinyssh-20250501/cryptoint/namespace000066400000000000000000000000101500472222400173520ustar00rootroot00000000000000tinyssh tinyssh-20250501/cryptoint/readasm.py000077500000000000000000001265731500472222400175130ustar00rootroot00000000000000#!/usr/bin/env python3 import re import sys machinedesc = {} # note for qhasm users: # the machine descriptions here have, e.g., # int8 meaning where the C ABI stores an int8, # such as a 64-bit integer register on amd64 # ===== amd64 machinedesc['amd64'] = r''' int8 r:var/r=int8: int16 r:var/r=int16: int32 r:var/r=int32: int64 r:var/r=int64: int8 r s:var/r=int8:var/s=int8: int16 r s:var/r=int16:var/s=int16: int32 r s:var/r=int32:var/s=int32: int64 r s:var/r=int64:var/s=int64: int8 r s t:var/r=int8:var/s=int8:var/t=int8: int16 r s t:var/r=int16:var/s=int16:var/t=int16: int32 r s t:var/r=int32:var/s=int32:var/t=int32: int64 r s t:var/r=int64:var/s=int64:var/t=int64: int8 r s t u:var/r=int8:var/s=int8:var/t=int8:var/u=int8: int16 r s t u:var/r=int16:var/s=int16:var/t=int16:var/u=int16: int32 r s t u:var/r=int32:var/s=int32:var/t=int32:var/u=int32: int64 r s t u:var/r=int64:var/s=int64:var/t=int64:var/u=int64: r = 0:>r=int8:asm/xorb >r,>r:>?cc: r = 0:>r=int16:asm/xorw >r,>r:>?cc: r = 0:>r=int32:asm/xorl >r,>r:>?cc: r = 0:>r=int64:asm/xorq >r,>r:>?cc: r = n:>r=int8:#n:asm/movb $#n,>r: r = n:>r=int16:#n:asm/movw $#n,>r: r = n:>r=int32:#n:asm/movl $#n,>r: r = n:>r=int64:#n:asm/movq $#n,>r: r = -n:>r=int8:#n:asm/movb $-#n,>r: r = -n:>r=int16:#n:asm/movw $-#n,>r: r = -n:>r=int32:#n:asm/movl $-#n,>r: r = -n:>r=int64:#n:asm/movq $-#n,>r: r signed>>= n:+r=int8:#n:asm/sarb $#n,+r:>?cc: r signed>>= n:+r=int16:#n:asm/sarw $#n,+r:>?cc: r signed>>= n:+r=int32:#n:asm/sarl $#n,+r:>?cc: r signed>>= n:+r=int64:#n:asm/sarq $#n,+r:>?cc: r signed>>= s:+r=int8:?cc: r signed>>= s:+r=int16:?cc: r signed>>= s:+r=int32:?cc: r signed>>= s:+r=int64:?cc: r unsigned>>= n:+r=int8:#n:asm/shrb $#n,+r:>?cc: r unsigned>>= n:+r=int16:#n:asm/shrw $#n,+r:>?cc: r unsigned>>= n:+r=int32:#n:asm/shrl $#n,+r:>?cc: r unsigned>>= n:+r=int64:#n:asm/shrq $#n,+r:>?cc: r unsigned>>= s:+r=int8:?cc: r unsigned>>= s:+r=int16:?cc: r unsigned>>= s:+r=int32:?cc: r unsigned>>= s:+r=int64:?cc: r <<= n:+r=int8:#n:asm/shlb $#n,+r:>?cc: r <<= n:+r=int16:#n:asm/shlw $#n,+r:>?cc: r <<= n:+r=int32:#n:asm/shll $#n,+r:>?cc: r <<= n:+r=int64:#n:asm/shlq $#n,+r:>?cc: r <<= s:+r=int8:?cc: r <<= s:+r=int16:?cc: r <<= s:+r=int32:?cc: r <<= s:+r=int64:?cc: r &= n:+r=int8:#n:asm/andb $#n,+r:>?cc: r &= n:+r=int16:#n:asm/andw $#n,+r:>?cc: r &= n:+r=int32:#n:asm/andl $#n,+r:>?cc: r &= n:+r=int64:#n:asm/andq $#n,+r:>?cc: r & (int8) s:?cc: r & s:?cc: r & s:?cc: r & s:?cc: r - (int8) s:?cc: r - s:?cc: r - s:?cc: r - s:?cc: r = s:>r=int16:r: r = s:>r=int32:r: r = s:>r=int64:r: r = s if signed<:+r=int16::+r=int16::+r=int32::+r=int64::+r=int16::+r=int32::+r=int64:r=int16:?cc:asm/bsfw r: r = numbottomzeros_tricky s:>r=int32:?cc:asm/bsfl r: r = numbottomzeros_tricky s:>r=int64:?cc:asm/bsfq r: ''' # ===== arm64 machinedesc['arm64'] = r''' int8 r:var/r=int8: int16 r:var/r=int16: int32 r:var/r=int32: int64 r:var/r=int64: int8 r s:var/r=int8:var/s=int8: int16 r s:var/r=int16:var/s=int16: int32 r s:var/r=int32:var/s=int32: int64 r s:var/r=int64:var/s=int64: int8 r s t:var/r=int8:var/s=int8:var/t=int8: int16 r s t:var/r=int16:var/s=int16:var/t=int16: int32 r s t:var/r=int32:var/s=int32:var/t=int32: int64 r s t:var/r=int64:var/s=int64:var/t=int64: int8 r s t u:var/r=int8:var/s=int8:var/t=int8:var/u=int8: int16 r s t u:var/r=int16:var/s=int16:var/t=int16:var/u=int16: int32 r s t u:var/r=int32:var/s=int32:var/t=int32:var/u=int32: int64 r s t u:var/r=int64:var/s=int64:var/t=int64:var/u=int64: r = s signed>> n:>r=int32:r,> n:>r=int64:r,> n:>r=int32:r,> n:>r=int64:r,> t:>r=int8:r,> t:>r=int16:r,> t:>r=int32:r,> t:>r=int64:r,> t:>r=int8:r,> t:>r=int16:r,> t:>r=int32:r,> t:>r=int64:r,r=int8:r,r=int16:r,r=int32:r,r=int64:r,r=int8:r,r=int16:r,r=int8:r,r=int16:r,r=int8:r,r=int8:r,r=int16:r,r=int16:r,r=int8:r,r=int16:r,?cc: r & n:?cc: r - n:?cc: r - n:?cc: r - n:?cc: r - n:?cc: r - s:?cc: r - s:?cc: r - s:?cc: r - s:?cc: r - (int8) s:?cc: r - (uint8) s:?cc: r - (int16) s:?cc: r - (uint16) s:?cc: r = -1 if != else 0:>r=int8:r,ne: r = -1 if != else 0:>r=int16:r,ne: r = -1 if != else 0:>r=int32:r,ne: r = -1 if != else 0:>r=int64:r,ne: r = -1 if = else 0:>r=int8:r,eq: r = -1 if = else 0:>r=int16:r,eq: r = -1 if = else 0:>r=int32:r,eq: r = -1 if = else 0:>r=int64:r,eq: r = -1 if signed< else 0:>r=int8:r,lt: r = -1 if signed< else 0:>r=int16:r,lt: r = -1 if signed< else 0:>r=int32:r,lt: r = -1 if signed< else 0:>r=int64:r,lt: r = -1 if signed> else 0:>r=int8:r,gt: r = -1 if signed> else 0:>r=int16:r,gt: r = -1 if signed> else 0:>r=int32:r,gt: r = -1 if signed> else 0:>r=int64:r,gt: r = -1 if signed<= else 0:>r=int8:r,le: r = -1 if signed<= else 0:>r=int16:r,le: r = -1 if signed<= else 0:>r=int32:r,le: r = -1 if signed<= else 0:>r=int64:r,le: r = -1 if unsigned< else 0:>r=int8:r,lo: r = -1 if unsigned< else 0:>r=int16:r,lo: r = -1 if unsigned< else 0:>r=int32:r,lo: r = -1 if unsigned< else 0:>r=int64:r,lo: r = -1 if unsigned<= else 0:>r=int8:r,ls: r = -1 if unsigned<= else 0:>r=int16:r,ls: r = -1 if unsigned<= else 0:>r=int32:r,ls: r = -1 if unsigned<= else 0:>r=int64:r,ls: r = 1 if != else 0:>r=int8:r,ne: r = 1 if != else 0:>r=int16:r,ne: r = 1 if != else 0:>r=int32:r,ne: r = 1 if != else 0:>r=int64:r,ne: r = 1 if = else 0:>r=int8:r,eq: r = 1 if = else 0:>r=int16:r,eq: r = 1 if = else 0:>r=int32:r,eq: r = 1 if = else 0:>r=int64:r,eq: r = 1 if signed< else 0:>r=int8:r,lt: r = 1 if signed< else 0:>r=int16:r,lt: r = 1 if signed< else 0:>r=int32:r,lt: r = 1 if signed< else 0:>r=int64:r,lt: r = 1 if signed> else 0:>r=int8:r,gt: r = 1 if signed> else 0:>r=int16:r,gt: r = 1 if signed> else 0:>r=int32:r,gt: r = 1 if signed> else 0:>r=int64:r,gt: r = 1 if signed<= else 0:>r=int8:r,le: r = 1 if signed<= else 0:>r=int16:r,le: r = 1 if signed<= else 0:>r=int32:r,le: r = 1 if signed<= else 0:>r=int64:r,le: r = 1 if unsigned< else 0:>r=int8:r,lo: r = 1 if unsigned< else 0:>r=int16:r,lo: r = 1 if unsigned< else 0:>r=int32:r,lo: r = 1 if unsigned< else 0:>r=int64:r,lo: r = 1 if unsigned<= else 0:>r=int8:r,ls: r = 1 if unsigned<= else 0:>r=int16:r,ls: r = 1 if unsigned<= else 0:>r=int32:r,ls: r = 1 if unsigned<= else 0:>r=int64:r,ls: r = s if signed< else t:>r=int8:r,r=int16:r,r=int32:r,r=int64:r,r=int8:r,r=int16:r,r=int32:r,r=int64:r,r=int8:r,r=int16:r,r=int32:r,r=int64:r,r=int8:r,r=int16:r,r=int32:r,r=int64:r,> n)):>r=int8:r,> n)):>r=int16:r,> n)):>r=int32:r,> n)):>r=int64:r,> n):>r=int8:r,> n):>r=int16:r,> n):>r=int32:r,> n):>r=int64:r,?cc: r - n:?cc: r - n:?cc: r = n if !=:>r=int8:#n:r,###n: r = n if !=:>r=int16:#n:r,###n: r = n if !=:>r=int32:#n:r,###n: r.lo = n if !=:>r=int64:#n:r%L,###n: r.hi = n if !=:>r=int64:#n:r%H,###n: r = -n if !=:>r=int8:#n:r,##-#n: r = -n if !=:>r=int16:#n:r,##-#n: r = -n if !=:>r=int32:#n:r,##-#n: r.lo = -n if !=:>r=int64:#n:r%L,##-#n: r.hi = -n if !=:>r=int64:#n:r%H,##-#n: r = (int8) s:>r=int8:r,r=int8:r,r=int16:r,r=int16:r,r=int64:#n:asm/mov >r%H,###n: r.hi = n:>r=int64:#n:asm/mov >r%H,###n: r.lo = s.lo:>r=int64:r%L,r=int64:r%L,r=int64:r%H,r=int64:r%H,r=int8:r,r=int16:r,r=int32:r,r=int64:r%L,r=int64:r%L,r=int64:r%H,r=int64:r%H,r=int8:r,r=int16:r,r=int32:r,r=int64:r%L,r=int64:r%L,r=int64:r%H,r=int64:r%H,r=int8:r,?cc: flags, r = s - n:>r=int16:r,?cc: flags, r = s - n:>r=int32:r,?cc: flags, r.lo = s.lo - n:>r=int64:r%L,?cc: flags, r.lo = s.hi - n:>r=int64:r%L,?cc: flags, r.hi = s.lo - n:>r=int64:r%H,?cc: flags, r.hi = s.hi - n:>r=int64:r%H,?cc: r = n - s:>r=int8:r,r=int16:r,r=int32:r,r=int64:r%L,r=int64:r%L,r=int64:r%H,r=int64:r%H,r=int8:r,r=int16:r,r=int32:r,r=int64:r%L,r=int64:r%L,r=int64:r%H,r=int64:r%H,r=int8:r,r=int16:r,r=int32:r,r=int64:r%L,r=int64:r%L,r=int64:r%H,r=int64:r%H,> n:>r=int8:r,> n:>r=int16:r,> n:>r=int32:r,> n:>r=int64:r%L,> n:>r=int64:r%L,> n:>r=int64:r%H,> n:>r=int64:r%H,> n:>r=int8:r,> n:>r=int16:r,> n:>r=int32:r,> n:>r=int64:r%L,> n:>r=int64:r%L,> n:>r=int64:r%H,> n:>r=int64:r%H,r=int8:r,?cc: flags, r = s | t:>r=int16:r,?cc: flags, r = s | t:>r=int32:r,?cc: flags, r.lo = s.lo | t.lo:>r=int64:r%L,?cc: flags, r.lo = s.lo | t.hi:>r=int64:r%L,?cc: flags, r.lo = s.hi | t.lo:>r=int64:r%L,?cc: flags, r.lo = s.hi | t.hi:>r=int64:r%L,?cc: flags, r.hi = s.lo | t.lo:>r=int64:r%H,?cc: flags, r.hi = s.lo | t.hi:>r=int64:r%H,?cc: flags, r.hi = s.hi | t.lo:>r=int64:r%H,?cc: flags, r.hi = s.hi | t.hi:>r=int64:r%H,?cc: r = s << t:>r=int8:r,r=int16:r,r=int32:r,r=int64:r%L,r=int64:r%L,r=int64:r%L,r=int64:r%L,r=int64:r%H,r=int64:r%H,r=int64:r%H,r=int64:r%H,> t:>r=int8:r,> t:>r=int16:r,> t:>r=int32:r,> t.lo:>r=int64:r%L,> t.hi:>r=int64:r%L,> t.lo:>r=int64:r%L,> t.hi:>r=int64:r%L,> t.lo:>r=int64:r%H,> t.hi:>r=int64:r%H,> t.lo:>r=int64:r%H,> t.hi:>r=int64:r%H,> t:>r=int8:r,> t:>r=int16:r,> t:>r=int32:r,> t.lo:>r=int64:r%L,> t.hi:>r=int64:r%L,> t.lo:>r=int64:r%L,> t.hi:>r=int64:r%L,> t.lo:>r=int64:r%H,> t.hi:>r=int64:r%H,> t.lo:>r=int64:r%H,> t.hi:>r=int64:r%H,r=int64:r%L,r=int64:r%L,r=int64:r%L,r=int64:r%L,r=int64:r%L,r=int64:r%L,r=int64:r%L,r=int64:r%L,r=int64:r%H,r=int64:r%H,r=int64:r%H,r=int64:r%H,r=int64:r%H,r=int64:r%H,r=int64:r%H,r=int64:r%H,> u.lo) if unsigned>=:>r=int64:r%L,> u.hi) if unsigned>=:>r=int64:r%L,> u.lo) if unsigned>=:>r=int64:r%L,> u.hi) if unsigned>=:>r=int64:r%L,> u.lo) if unsigned>=:>r=int64:r%L,> u.hi) if unsigned>=:>r=int64:r%L,> u.lo) if unsigned>=:>r=int64:r%L,> u.hi) if unsigned>=:>r=int64:r%L,> u.lo) if unsigned>=:>r=int64:r%H,> u.hi) if unsigned>=:>r=int64:r%H,> u.lo) if unsigned>=:>r=int64:r%H,> u.hi) if unsigned>=:>r=int64:r%H,> u.lo) if unsigned>=:>r=int64:r%H,> u.hi) if unsigned>=:>r=int64:r%H,> u.lo) if unsigned>=:>r=int64:r%H,> u.hi) if unsigned>=:>r=int64:r%H,> u.lo):>r=int64:r%L,> u.hi):>r=int64:r%L,> u.lo):>r=int64:r%L,> u.hi):>r=int64:r%L,> u.lo):>r=int64:r%L,> u.hi):>r=int64:r%L,> u.lo):>r=int64:r%L,> u.hi):>r=int64:r%L,> u.lo):>r=int64:r%H,> u.hi):>r=int64:r%H,> u.lo):>r=int64:r%H,> u.hi):>r=int64:r%H,> u.lo):>r=int64:r%H,> u.hi):>r=int64:r%H,> u.lo):>r=int64:r%H,> u.hi):>r=int64:r%H,r=int8:asm/addx %%g0,0,>r: r = carry:>r=int16:asm/addx %%g0,0,>r: r = carry:>r=int32:asm/addx %%g0,0,>r: r.lo = carry:>r=int64:asm/addx %%g0,0,>r%L: r.hi = carry:>r=int64:asm/addx %%g0,0,>r%H: r = carry - n:>r=int8:#n:asm/addx %%g0,-#n,>r: r = carry - n:>r=int16:#n:asm/addx %%g0,-#n,>r: r = carry - n:>r=int32:#n:asm/addx %%g0,-#n,>r: r.lo = carry - n:>r=int64:#n:asm/addx %%g0,-#n,>r%L: r.hi = carry - n:>r=int64:#n:asm/addx %%g0,-#n,>r%H: r = -carry:>r=int8:asm/subx %%g0,0,>r: r = -carry:>r=int16:asm/subx %%g0,0,>r: r = -carry:>r=int32:asm/subx %%g0,0,>r: r.lo = -carry:>r=int64:asm/subx %%g0,0,>r%L: r.hi = -carry:>r=int64:asm/subx %%g0,0,>r%H: r = n - carry:>r=int8:#n:asm/subx %%g0,-#n,>r: r = n - carry:>r=int16:#n:asm/subx %%g0,-#n,>r: r = n - carry:>r=int32:#n:asm/subx %%g0,-#n,>r: r.lo = n - carry:>r=int64:#n:asm/subx %%g0,-#n,>r%L: r.hi = n - carry:>r=int64:#n:asm/subx %%g0,-#n,>r%H: r = s - t:>r=int8:r: r = s - t:>r=int16:r: r = s - t:>r=int32:r: carry, r.lo = s.lo - t.lo:>r=int64:r%L:>?cc: carry, r.lo = s.lo - t.hi:>r=int64:r%L:>?cc: carry, r.lo = s.hi - t.lo:>r=int64:r%L:>?cc: carry, r.lo = s.hi - t.hi:>r=int64:r%L:>?cc: carry, r.hi = s.lo - t.lo:>r=int64:r%H:>?cc: carry, r.hi = s.lo - t.hi:>r=int64:r%H:>?cc: carry, r.hi = s.hi - t.lo:>r=int64:r%H:>?cc: carry, r.hi = s.hi - t.hi:>r=int64:r%H:>?cc: r.lo = s.lo - t.lo - carry:>r=int64:r%L: r.lo = s.lo - t.hi - carry:>r=int64:r%L: r.lo = s.hi - t.lo - carry:>r=int64:r%L: r.lo = s.hi - t.hi - carry:>r=int64:r%L: r.hi = s.lo - t.lo - carry:>r=int64:r%H: r.hi = s.lo - t.hi - carry:>r=int64:r%H: r.hi = s.hi - t.lo - carry:>r=int64:r%H: r.hi = s.hi - t.hi - carry:>r=int64:r%H: 0 - r:?cc: 0 - r:?cc: 0 - r:?cc: 0 - r.lo:?cc: 0 - r.hi:?cc: r - 0:?cc: r - 0:?cc: r - 0:?cc: r.lo - 0:?cc: r.hi - 0:?cc: r.lo = n:>r=int64:#n:asm/mov #n,>r%H: r.hi = n:>r=int64:#n:asm/mov #n,>r%H: r.lo = s.lo:>r=int64:r%L: r.lo = s.hi:>r=int64:r%L: r.hi = s.lo:>r=int64:r%H: r.hi = s.hi:>r=int64:r%H: r = -s:>r=int8:r: r = -s:>r=int16:r: r = -s:>r=int32:r: r.lo = -s.lo:>r=int64:r%L: r.lo = -s.hi:>r=int64:r%L: r.hi = -s.lo:>r=int64:r%H: r.hi = -s.hi:>r=int64:r%H: r = ~s:>r=int8:r: r = ~s:>r=int16:r: r = ~s:>r=int32:r: r.lo = ~s.lo:>r=int64:r%L: r.lo = ~s.hi:>r=int64:r%L: r.hi = ~s.lo:>r=int64:r%H: r.hi = ~s.hi:>r=int64:r%H: r = s + n:>r=int8:r: r = s + n:>r=int16:r: r = s + n:>r=int32:r: r.lo = s.lo + n:>r=int64:r%L: r.lo = s.hi + n:>r=int64:r%L: r.hi = s.lo + n:>r=int64:r%H: r.hi = s.hi + n:>r=int64:r%H: r = s & n:>r=int8:r: r = s & n:>r=int16:r: r = s & n:>r=int32:r: r.lo = s.lo & n:>r=int64:r%L: r.lo = s.hi & n:>r=int64:r%L: r.hi = s.lo & n:>r=int64:r%H: r.hi = s.hi & n:>r=int64:r%H: r = s << n:>r=int8:r: r = s << n:>r=int16:r: r = s << n:>r=int32:r: r.lo = s.lo << n:>r=int64:r%L: r.lo = s.hi << n:>r=int64:r%L: r.hi = s.lo << n:>r=int64:r%H: r.hi = s.hi << n:>r=int64:r%H: r = s signed>> n:>r=int8:r: r = s signed>> n:>r=int16:r: r = s signed>> n:>r=int32:r: r.lo = s.lo signed>> n:>r=int64:r%L: r.lo = s.hi signed>> n:>r=int64:r%L: r.hi = s.lo signed>> n:>r=int64:r%H: r.hi = s.hi signed>> n:>r=int64:r%H: r = s unsigned>> n:>r=int8:r: r = s unsigned>> n:>r=int16:r: r = s unsigned>> n:>r=int32:r: r.lo = s.lo unsigned>> n:>r=int64:r%L: r.lo = s.hi unsigned>> n:>r=int64:r%L: r.hi = s.lo unsigned>> n:>r=int64:r%H: r.hi = s.hi unsigned>> n:>r=int64:r%H: r = s ^ t:>r=int8:r: r = s ^ t:>r=int16:r: r = s ^ t:>r=int32:r: r.lo = s.lo ^ t.lo:>r=int64:r%L: r.lo = s.lo ^ t.hi:>r=int64:r%L: r.lo = s.hi ^ t.lo:>r=int64:r%L: r.lo = s.hi ^ t.hi:>r=int64:r%L: r.hi = s.lo ^ t.lo:>r=int64:r%H: r.hi = s.lo ^ t.hi:>r=int64:r%H: r.hi = s.hi ^ t.lo:>r=int64:r%H: r.hi = s.hi ^ t.hi:>r=int64:r%H: r = s & t:>r=int8:r: r = s & t:>r=int16:r: r = s & t:>r=int32:r: r.lo = s.lo & t.lo:>r=int64:r%L: r.lo = s.lo & t.hi:>r=int64:r%L: r.lo = s.hi & t.lo:>r=int64:r%L: r.lo = s.hi & t.hi:>r=int64:r%L: r.hi = s.lo & t.lo:>r=int64:r%H: r.hi = s.lo & t.hi:>r=int64:r%H: r.hi = s.hi & t.lo:>r=int64:r%H: r.hi = s.hi & t.hi:>r=int64:r%H: r = s | t:>r=int8:r: r = s | t:>r=int16:r: r = s | t:>r=int32:r: r.lo = s.lo | t.lo:>r=int64:r%L: r.lo = s.lo | t.hi:>r=int64:r%L: r.lo = s.hi | t.lo:>r=int64:r%L: r.lo = s.hi | t.hi:>r=int64:r%L: r.hi = s.lo | t.lo:>r=int64:r%H: r.hi = s.lo | t.hi:>r=int64:r%H: r.hi = s.hi | t.lo:>r=int64:r%H: r.hi = s.hi | t.hi:>r=int64:r%H: r = s << t:>r=int8:r: r = s << t:>r=int16:r: r = s << t:>r=int32:r: r.lo = s.lo << t.lo:>r=int64:r%L: r.lo = s.lo << t.hi:>r=int64:r%L: r.lo = s.hi << t.lo:>r=int64:r%L: r.lo = s.hi << t.hi:>r=int64:r%L: r.hi = s.lo << t.lo:>r=int64:r%H: r.hi = s.lo << t.hi:>r=int64:r%H: r.hi = s.hi << t.lo:>r=int64:r%H: r.hi = s.hi << t.hi:>r=int64:r%H: r = s signed>> t:>r=int8:r: r = s signed>> t:>r=int16:r: r = s signed>> t:>r=int32:r: r.lo = s.lo signed>> t.lo:>r=int64:r%L: r.lo = s.lo signed>> t.hi:>r=int64:r%L: r.lo = s.hi signed>> t.lo:>r=int64:r%L: r.lo = s.hi signed>> t.hi:>r=int64:r%L: r.hi = s.lo signed>> t.lo:>r=int64:r%H: r.hi = s.lo signed>> t.hi:>r=int64:r%H: r.hi = s.hi signed>> t.lo:>r=int64:r%H: r.hi = s.hi signed>> t.hi:>r=int64:r%H: r = s unsigned>> t:>r=int8:r: r = s unsigned>> t:>r=int16:r: r = s unsigned>> t:>r=int32:r: r.lo = s.lo unsigned>> t.lo:>r=int64:r%L: r.lo = s.lo unsigned>> t.hi:>r=int64:r%L: r.lo = s.hi unsigned>> t.lo:>r=int64:r%L: r.lo = s.hi unsigned>> t.hi:>r=int64:r%L: r.hi = s.lo unsigned>> t.lo:>r=int64:r%H: r.hi = s.lo unsigned>> t.hi:>r=int64:r%H: r.hi = s.hi unsigned>> t.lo:>r=int64:r%H: r.hi = s.hi unsigned>> t.hi:>r=int64:r%H: r = s & n:>r=int8:r: r = s & n:>r=int16:r: r = s & n:>r=int32:r: r.lo = s.lo & n:>r=int64:r%L: r.lo = s.hi & n:>r=int64:r%L: r.hi = s.lo & n:>r=int64:r%H: r.hi = s.hi & n:>r=int64:r%H: r = (uint8) s:>r=int8:r: r = (uint16) s:>r=int16:r:asm/srl r: ''' # ===== general processing def isvarname(line): return re.fullmatch(r'\w+',line) def tokens(line): return re.findall(r'\w+|[^\w\s]',line) def process(script): todo = [] machine = None vartype = {} ccinit = False inputvars = [] outputvars = [] earlyclobber = set() rcxvars = set() for line in script.split(';'): line = tokens(line.strip()) if machine is None: assert len(line) == 1 machine = line[0] assert machine in machinedesc continue foundinsn = False for insndesc in machinedesc[machine].splitlines(): insndesc = insndesc.split(':') if len(insndesc) == 0: continue insnvars = [] insnvartype = {} insnvarpos = {} insnvar2line = {} insnmakevars = [] insnasm = [] insnread = [] insnwrite = [] for x in insndesc[1:]: if x == '': continue if x[0] == '#': assert len(x) == 2 insnvars += [x[1]] insnvartype[x[1]] = '#' continue if x[0] in ('<','+','>'): if x[1:] == '?cc': if x[0] != '<': insnwrite += ['?cc'] if x[0] != '>': insnread += ['?cc'] continue if x[0] != '<': insnwrite += [x[1]] if x[0] != '>': insnread += [x[1]] insnvars += [x[1]] assert x[2] == '=' insnvartype[x[1]] = x[3:].split('#')[0] if len(x[3:].split('#')) > 1: insnvarpos[x[1]] = int(x[3:].split('#')[1]) continue if x.startswith('var/'): insnvars += [x[4]] assert x[5] == '=' insnvartype[x[4]] = x[6:] insnmakevars += [x[4]] continue if x.startswith('asm/'): insnasm += [x[4:]] continue raise Exception(x) insn = tokens(insndesc[0]) insnpos = 0 linepos = 0 while True: if insnpos == len(insn) and linepos == len(line): foundinsn = True if insnpos == len(insn) or linepos == len(line): break x = insn[insnpos] y = line[linepos] if x in insnvars: if y in vartype: if vartype[y] != insnvartype[x]: break # line and insn both have variables, but different types if x in insnvar2line: if insnvar2line[x] != y: break # insn variable already assigned to something different in line else: insnvar2line[x] = y else: if not isvarname(y): break # not an acceptable variable name insnvar2line[x] = y else: if y in vartype: break # XXX: but maybe sometimes want to allow variable in line to match literal in insn if y != x: break # non-matching literals insnpos += 1 linepos += 1 if foundinsn: break if not foundinsn: print(line) assert foundinsn insnvar2line['?cc'] = '?cc' for v in insnmakevars: w = insnvar2line[v] vartype[w] = insnvartype[v] for v in insnvar2line: if v == '?cc': continue if insnvartype[v] == '#': continue w = insnvar2line[v] if w not in vartype: raise Exception(f'undefined variable {w} from {v} in {line}') for v in insnread: w = insnvar2line[v] if v in insnvarpos: assert insnvarpos[v] == 4 assert machine == 'amd64' rcxvars.add(w) if w not in outputvars: if w not in inputvars: inputvars += [w] for z in outputvars: earlyclobber.add(z) for v in insnwrite: w = insnvar2line[v] if w not in outputvars: outputvars += [w] for asm in insnasm: todo += [(asm,insnvar2line)] need8 = set() todo2 = [] for asm,insnvar2line in todo: todo2 += [('asm',)] while len(asm) > 0: if asm[0] in ('<','+','>'): if asm[2:].startswith('%8'): todo2 += [('var8',insnvar2line[asm[1]])] need8.add(insnvar2line[asm[1]]) asm = asm[4:] elif asm[2:].startswith('%L'): todo2 += [('var0',insnvar2line[asm[1]])] asm = asm[4:] elif asm[2:].startswith('%H'): todo2 += [('var1',insnvar2line[asm[1]])] asm = asm[4:] else: todo2 += [('var',insnvar2line[asm[1]])] asm = asm[2:] elif asm[0] == '#': if asm[1:].startswith('#'): todo2 += [('str',asm[1])] asm = asm[2:] else: todo2 += [('str',insnvar2line[asm[1]])] asm = asm[2:] else: todo2 += [('str',asm[0])] asm = asm[1:] varnextpos = 0 var2name = {} outputs = [] for w in outputvars: if w == '?cc': continue if machine == 'arm64' and vartype[w] != 'int64': # XXX: abstract this var2name[w] = f'%w{varnextpos}' else: var2name[w] = f'%{varnextpos}' varnextpos += 1 regtype = 'r' if w in need8: regtype = 'q' if w in rcxvars: regtype = 'c' if w in earlyclobber: regtype = '&'+regtype if w in inputvars: outputs += [f'"+{regtype}"({w})'] else: outputs += [f'"={regtype}"({w})'] inputs = [] for w in inputvars: if w in outputvars: continue assert w != '?cc' if machine == 'arm64' and vartype[w] != 'int64': # XXX: abstract this var2name[w] = f'%w{varnextpos}' else: var2name[w] = f'%{varnextpos}' varnextpos += 1 regtype = 'r' if w in need8: regtype = 'q' if w in rcxvars: regtype = 'c' inputs += [f'"{regtype}"({w})'] clobbers = [] for w in outputvars: if w != '?cc': continue clobbers += ['"cc"'] lohalf64 = '%Q' if machine == 'arm32' else '%L' hihalf64 = '%R' if machine == 'arm32' else '%H' result = '' for T in todo2: if T[0] == 'asm': if result != '': result += '\\n ' elif T[0] == 'var8': result += var2name[T[1]].replace('%','%b') elif T[0] == 'var0': result += var2name[T[1]].replace('%',lohalf64) elif T[0] == 'var1': result += var2name[T[1]].replace('%',hihalf64) elif T[0] == 'var': result += var2name[T[1]] else: assert T[0] == 'str' result += T[1] outputs = ', '.join(outputs) if len(outputs) > 0: outputs += ' ' inputs = ', '.join(inputs) if len(inputs) > 0: inputs += ' ' clobbers = ', '.join(clobbers) result = f'__asm__ ("{result}" : {outputs}: {inputs}: {clobbers})' return result def substitute(program): result = '' for line in program.splitlines(): m = re.fullmatch(r'(.*)\breadasm\("([^"]*)"\)(.*)',line) if m: result += m.group(1)+process(m.group(2))+m.group(3)+'\n' else: result += line+'\n' return result def test(): print(process('amd64; int64 X; X signed>>= 63')) print(process('arm64; int8 X; int8 Y; X = (int8) X; Y = (int8) Y; X - Y; X = Y if signed< else X')) print(process('arm64; int8 X; int8 Y; int8 Z; Z = (uint8) X; Z - (uint8) Y; Z = -1 if unsigned<= else 0')) print(process('arm64; int64 X; int64 Y; int64 R; int64 S; X - Y; R = X if unsigned< else Y; S = Y if unsigned< else X')) if __name__ == '__main__': test() tinyssh-20250501/cryptoint/specialize.py000077500000000000000000000054431500472222400202170ustar00rootroot00000000000000#!/usr/bin/env python3 import os import readasm with open('namespace') as f: projectnamespace = f.readline().strip() with open('crypto_intN.h') as f: intN = f.read() with open('crypto_uintN.h') as f: uintN = f.read() for bits in 8,16,32,64: for ui in 'int','uint': TYPE = f'crypto_{ui}{bits}' with open(f'{TYPE}.h','w') as f: contents = intN if ui == 'int' else uintN contents = contents.replace('N',str(bits)) contents = contents.replace('namespace',projectnamespace) contents = readasm.substitute(contents) contents = contents.replace('amd64','defined(__GNUC__) && defined(__x86_64__)') contents = contents.replace('arm64','defined(__GNUC__) && defined(__aarch64__)') contents = contents.replace('arm32','defined(__GNUC__) && defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__thumb__)') contents = contents.replace('sparc32','defined(__GNUC__) && defined(__sparc_v8__)') newcontents = '' for line in contents.splitlines(): if ':' in line: condbits = line.split(':')[0].strip() if condbits.isnumeric(): if int(condbits) != bits: continue line = ':'.join(line.split(':')[1:]) newcontents += line+'\n' contents = newcontents tounroll = f' int {TYPE}_k;\n for ({TYPE}_k = 0;{TYPE}_k < {bits};{TYPE}_k += 8)\n {TYPE}_z |= (({TYPE}) (*{TYPE}_s++)) << {TYPE}_k;' unrolled = '\n'.join(f' {TYPE}_z |= (({TYPE}) (*{TYPE}_s++)) << {k};' for k in range(0,bits,8)) contents = contents.replace(tounroll,unrolled) tounroll = f' int {TYPE}_k;\n for ({TYPE}_k = {bits} - 8;{TYPE}_k >= 0;{TYPE}_k -= 8)\n {TYPE}_z |= (({TYPE}) (*{TYPE}_s++)) << {TYPE}_k;' unrolled = '\n'.join(f' {TYPE}_z |= (({TYPE}) (*{TYPE}_s++)) << {k};' for k in reversed(range(0,bits,8))) contents = contents.replace(tounroll,unrolled) tounroll = f' int {TYPE}_k;\n for ({TYPE}_k = 0;{TYPE}_k < {bits};{TYPE}_k += 8)\n *{TYPE}_s++ = {TYPE}_x >> {TYPE}_k;' unrolled = '\n'.join(f' *{TYPE}_s++ = {TYPE}_x >> {k};' for k in range(0,bits,8)) contents = contents.replace(tounroll,unrolled) tounroll = f' int {TYPE}_k;\n for ({TYPE}_k = {bits} - 8;{TYPE}_k >= 0;{TYPE}_k -= 8)\n *{TYPE}_s++ = {TYPE}_x >> {TYPE}_k;' unrolled = '\n'.join(f' *{TYPE}_s++ = {TYPE}_x >> {k};' for k in reversed(range(0,bits,8))) contents = contents.replace(tounroll,unrolled) f.write(contents) for intc in sorted(os.listdir('.')): if not intc.endswith('.c'): continue if not (intc.startswith('int') or intc.startswith('uint')): continue targetintc = intc.replace('N',str(bits)) with open(intc) as f: contents = f.read() with open(targetintc,'w') as f: f.write(contents.replace('N',str(bits))) tinyssh-20250501/cryptoint/uint16_optblocker.c000066400000000000000000000002461500472222400212240ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #include "crypto_uint16.h" volatile crypto_uint16_signed crypto_uint16_signed_optblocker = 0; tinyssh-20250501/cryptoint/uint32_optblocker.c000066400000000000000000000002461500472222400212220ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #include "crypto_uint32.h" volatile crypto_uint32_signed crypto_uint32_signed_optblocker = 0; tinyssh-20250501/cryptoint/uint64_optblocker.c000066400000000000000000000002461500472222400212270ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #include "crypto_uint64.h" volatile crypto_uint64_signed crypto_uint64_signed_optblocker = 0; tinyssh-20250501/cryptoint/uint8_optblocker.c000066400000000000000000000002431500472222400211420ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #include "crypto_uint8.h" volatile crypto_uint8_signed crypto_uint8_signed_optblocker = 0; tinyssh-20250501/cryptoint/uintN_optblocker.c000066400000000000000000000002431500472222400211700ustar00rootroot00000000000000/* auto-generated: cd cryptoint; ./autogen */ /* cryptoint 20250414 */ #include "crypto_uintN.h" volatile crypto_uintN_signed crypto_uintN_signed_optblocker = 0; tinyssh-20250501/cryptoint/version000066400000000000000000000000231500472222400171070ustar00rootroot00000000000000cryptoint 20250414 tinyssh-20250501/die.c000066400000000000000000000010321500472222400143520ustar00rootroot00000000000000#include "global.h" #include "log.h" #include "die.h" void die_usage(const char *x) { log_u1(x); global_die(100); } void die_fatal_(const char *fn, unsigned long long line, const char *trouble, const char *d, const char *f) { if (d) { if (f) log_9_(1, 0, fn, line, trouble, " ", d, "/", f, 0, 0, 0, 0); else log_9_(1, 0, fn, line, trouble, " ", d, 0, 0, 0, 0, 0, 0); } else { log_9_(1, 0, fn, line, trouble, 0, 0, 0, 0, 0, 0, 0, 0); } global_die(111); } tinyssh-20250501/die.h000066400000000000000000000004301500472222400143600ustar00rootroot00000000000000#ifndef DIE_H____ #define DIE_H____ extern void die_usage(const char *); extern void die_fatal_(const char *, unsigned long long, const char *, const char *, const char *); #define die_fatal(a, b, cc) die_fatal_(__FILE__, __LINE__, (a), (b), (cc)) #endif tinyssh-20250501/dropuidgid.c000066400000000000000000000016541500472222400157550ustar00rootroot00000000000000/* 20140420 Jan Mojzis Public domain. */ #include #include #include #include "e.h" #include "dropuidgid.h" /* The 'dropuidgid' function is used to drop root privileges. If the process has appropriate permittions, the 'dropuidgid' function sets user ID and group ID of calling process to uid and gid. The 'dropuidgid' function also initialize supplementary group IDs. */ int dropuidgid(const char *name, uid_t uid, gid_t gid) { /* we can change group only as the root */ if (geteuid() == 0) { if (setgid(gid) == -1) return 0; if (getgid() != gid) { errno = EPERM; return 0; } if (name) { if (initgroups(name, gid) == -1) return 0; } } if (geteuid() != uid) { if (setuid(uid) == -1) return 0; if (getuid() != uid) { errno = EPERM; return 0; } } return 1; } tinyssh-20250501/dropuidgid.h000066400000000000000000000002051500472222400157510ustar00rootroot00000000000000#ifndef DROPUIDGID_H____ #define DROPUIDGID_H____ #include extern int dropuidgid(const char *, uid_t, gid_t); #endif tinyssh-20250501/e.c000066400000000000000000000076451500472222400140550ustar00rootroot00000000000000/* taken from nacl-20110221, from curvecp/e.c - reformated using clang-format */ #include "e.h" #define X(e, s) \ if (i == e) return s; const char *e_str(int i) { X(0, "no error") X(EINTR, "interrupted system call") X(ENOMEM, "out of memory") X(ENOENT, "file does not exist") X(ETXTBSY, "text busy") X(EIO, "input/output error") X(EEXIST, "file already exists") X(ETIMEDOUT, "timed out") X(EINPROGRESS, "operation in progress") X(EAGAIN, "temporary failure") X(EWOULDBLOCK, "input/output would block") X(EPIPE, "broken pipe") X(EPERM, "permission denied") X(EACCES, "access denied") X(ENODEV, "device not configured") X(EPROTO, "protocol error") X(EISDIR, "is a directory") X(ESRCH, "no such process") X(E2BIG, "argument list too long") X(ENOEXEC, "exec format error") X(EBADF, "file descriptor not open") X(ECHILD, "no child processes") X(EDEADLK, "operation would cause deadlock") X(EFAULT, "bad address") X(ENOTBLK, "not a block device") X(EBUSY, "device busy") X(EXDEV, "cross-device link") X(ENODEV, "device does not support operation") X(ENOTDIR, "not a directory") X(EINVAL, "invalid argument") X(ENFILE, "system cannot open more files") X(EMFILE, "process cannot open more files") X(ENOTTY, "not a tty") X(EFBIG, "file too big") X(ENOSPC, "out of disk space") X(ESPIPE, "unseekable descriptor") X(EROFS, "read-only file system") X(EMLINK, "too many links") X(EDOM, "input out of range") X(ERANGE, "output out of range") X(EALREADY, "operation already in progress") X(ENOTSOCK, "not a socket") X(EDESTADDRREQ, "destination address required") X(EMSGSIZE, "message too long") X(EPROTOTYPE, "incorrect protocol type") X(ENOPROTOOPT, "protocol not available") X(EPROTONOSUPPORT, "protocol not supported") X(ESOCKTNOSUPPORT, "socket type not supported") X(EOPNOTSUPP, "operation not supported") X(EPFNOSUPPORT, "protocol family not supported") X(EAFNOSUPPORT, "address family not supported") X(EADDRINUSE, "address already used") X(EADDRNOTAVAIL, "address not available") X(ENETDOWN, "network down") X(ENETUNREACH, "network unreachable") X(ENETRESET, "network reset") X(ECONNABORTED, "connection aborted") X(ECONNRESET, "connection reset") X(ENOBUFS, "out of buffer space") X(EISCONN, "already connected") X(ENOTCONN, "not connected") X(ESHUTDOWN, "socket shut down") X(ETOOMANYREFS, "too many references") X(ECONNREFUSED, "connection refused") X(ELOOP, "symbolic link loop") X(ENAMETOOLONG, "file name too long") X(EHOSTDOWN, "host down") X(EHOSTUNREACH, "host unreachable") X(ENOTEMPTY, "directory not empty") X(EPROCLIM, "too many processes") X(EUSERS, "too many users") X(EDQUOT, "disk quota exceeded") X(ESTALE, "stale NFS file handle") X(EREMOTE, "too many levels of remote in path") X(EBADRPC, "RPC structure is bad") X(ERPCMISMATCH, "RPC version mismatch") X(EPROGUNAVAIL, "RPC program unavailable") X(EPROGMISMATCH, "program version mismatch") X(EPROCUNAVAIL, "bad procedure for program") X(ENOLCK, "no locks available") X(ENOSYS, "system call not available") X(EFTYPE, "bad file type") X(EAUTH, "authentication error") X(ENEEDAUTH, "not authenticated") X(ENOSTR, "not a stream device") X(ETIME, "timer expired") X(ENOSR, "out of stream resources") X(ENOMSG, "no message of desired type") X(EBADMSG, "bad message type") X(EIDRM, "identifier removed") X(ENONET, "machine not on network") X(EREMOTE, "object not local") X(ENOLINK, "link severed") X(EADV, "advertise error") X(ESRMNT, "srmount error") X(ECOMM, "communication error") X(EMULTIHOP, "multihop attempted") X(EREMCHG, "remote address changed") return "unknown error"; } tinyssh-20250501/e.h000066400000000000000000000155061500472222400140550ustar00rootroot00000000000000#ifndef E_H #define E_H #include extern const char *e_str(int); #ifndef EPERM #define EPERM (-5001) #endif #ifndef ENOENT #define ENOENT (-5002) #endif #ifndef ESRCH #define ESRCH (-5003) #endif #ifndef EINTR #define EINTR (-5004) #endif #ifndef EIO #define EIO (-5005) #endif #ifndef ENXIO #define ENXIO (-5006) #endif #ifndef E2BIG #define E2BIG (-5007) #endif #ifndef ENOEXEC #define ENOEXEC (-5008) #endif #ifndef EBADF #define EBADF (-5009) #endif #ifndef ECHILD #define ECHILD (-5010) #endif #ifndef EAGAIN #define EAGAIN (-5011) #endif #ifndef EWOULDBLOCK #define EWOULDBLOCK (-7011) #endif #ifndef ENOMEM #define ENOMEM (-5012) #endif #ifndef EACCES #define EACCES (-5013) #endif #ifndef EFAULT #define EFAULT (-5014) #endif #ifndef ENOTBLK #define ENOTBLK (-5015) #endif #ifndef EBUSY #define EBUSY (-5016) #endif #ifndef EEXIST #define EEXIST (-5017) #endif #ifndef EXDEV #define EXDEV (-5018) #endif #ifndef ENODEV #define ENODEV (-5019) #endif #ifndef ENOTDIR #define ENOTDIR (-5020) #endif #ifndef EISDIR #define EISDIR (-5021) #endif #ifndef EINVAL #define EINVAL (-5022) #endif #ifndef ENFILE #define ENFILE (-5023) #endif #ifndef EMFILE #define EMFILE (-5024) #endif #ifndef ENOTTY #define ENOTTY (-5025) #endif #ifndef ETXTBSY #define ETXTBSY (-5026) #endif #ifndef EFBIG #define EFBIG (-5027) #endif #ifndef ENOSPC #define ENOSPC (-5028) #endif #ifndef ESPIPE #define ESPIPE (-5029) #endif #ifndef EROFS #define EROFS (-5030) #endif #ifndef EMLINK #define EMLINK (-5031) #endif #ifndef EPIPE #define EPIPE (-5032) #endif #ifndef EDOM #define EDOM (-5033) #endif #ifndef ERANGE #define ERANGE (-5034) #endif #ifndef EDEADLK #define EDEADLK (-5035) #endif #ifndef EDEADLOCK #define EDEADLOCK (-7035) #endif #ifndef ENAMETOOLONG #define ENAMETOOLONG (-5036) #endif #ifndef ENOLCK #define ENOLCK (-5037) #endif #ifndef ENOSYS #define ENOSYS (-5038) #endif #ifndef ENOTEMPTY #define ENOTEMPTY (-5039) #endif #ifndef ELOOP #define ELOOP (-5040) #endif #ifndef ENOMSG #define ENOMSG (-5042) #endif #ifndef EIDRM #define EIDRM (-5043) #endif #ifndef ECHRNG #define ECHRNG (-5044) #endif #ifndef EL2NSYNC #define EL2NSYNC (-5045) #endif #ifndef EL3HLT #define EL3HLT (-5046) #endif #ifndef EL3RST #define EL3RST (-5047) #endif #ifndef ELNRNG #define ELNRNG (-5048) #endif #ifndef EUNATCH #define EUNATCH (-5049) #endif #ifndef ENOCSI #define ENOCSI (-5050) #endif #ifndef EL2HLT #define EL2HLT (-5051) #endif #ifndef EBADE #define EBADE (-5052) #endif #ifndef EBADR #define EBADR (-5053) #endif #ifndef EXFULL #define EXFULL (-5054) #endif #ifndef ENOANO #define ENOANO (-5055) #endif #ifndef EBADRQC #define EBADRQC (-5056) #endif #ifndef EBADSLT #define EBADSLT (-5057) #endif #ifndef EBFONT #define EBFONT (-5059) #endif #ifndef ENOSTR #define ENOSTR (-5060) #endif #ifndef ENODATA #define ENODATA (-5061) #endif #ifndef ETIME #define ETIME (-5062) #endif #ifndef ENOSR #define ENOSR (-5063) #endif #ifndef ENONET #define ENONET (-5064) #endif #ifndef ENOPKG #define ENOPKG (-5065) #endif #ifndef EREMOTE #define EREMOTE (-5066) #endif #ifndef ENOLINK #define ENOLINK (-5067) #endif #ifndef EADV #define EADV (-5068) #endif #ifndef ESRMNT #define ESRMNT (-5069) #endif #ifndef ECOMM #define ECOMM (-5070) #endif #ifndef EPROTO #define EPROTO (-5071) #endif #ifndef EMULTIHOP #define EMULTIHOP (-5072) #endif #ifndef EDOTDOT #define EDOTDOT (-5073) #endif #ifndef EBADMSG #define EBADMSG (-5074) #endif #ifndef EOVERFLOW #define EOVERFLOW (-5075) #endif #ifndef ENOTUNIQ #define ENOTUNIQ (-5076) #endif #ifndef EBADFD #define EBADFD (-5077) #endif #ifndef EREMCHG #define EREMCHG (-5078) #endif #ifndef ELIBACC #define ELIBACC (-5079) #endif #ifndef ELIBBAD #define ELIBBAD (-5080) #endif #ifndef ELIBSCN #define ELIBSCN (-5081) #endif #ifndef ELIBMAX #define ELIBMAX (-5082) #endif #ifndef ELIBEXEC #define ELIBEXEC (-5083) #endif #ifndef EILSEQ #define EILSEQ (-5084) #endif #ifndef ERESTART #define ERESTART (-5085) #endif #ifndef ESTRPIPE #define ESTRPIPE (-5086) #endif #ifndef EUSERS #define EUSERS (-5087) #endif #ifndef ENOTSOCK #define ENOTSOCK (-5088) #endif #ifndef EDESTADDRREQ #define EDESTADDRREQ (-5089) #endif #ifndef EMSGSIZE #define EMSGSIZE (-5090) #endif #ifndef EPROTOTYPE #define EPROTOTYPE (-5091) #endif #ifndef ENOPROTOOPT #define ENOPROTOOPT (-5092) #endif #ifndef EPROTONOSUPPORT #define EPROTONOSUPPORT (-5093) #endif #ifndef ESOCKTNOSUPPORT #define ESOCKTNOSUPPORT (-5094) #endif #ifndef EOPNOTSUPP #define EOPNOTSUPP (-5095) #endif #ifndef EPFNOSUPPORT #define EPFNOSUPPORT (-5096) #endif #ifndef EAFNOSUPPORT #define EAFNOSUPPORT (-5097) #endif #ifndef EADDRINUSE #define EADDRINUSE (-5098) #endif #ifndef EADDRNOTAVAIL #define EADDRNOTAVAIL (-5099) #endif #ifndef ENETDOWN #define ENETDOWN (-5100) #endif #ifndef ENETUNREACH #define ENETUNREACH (-5101) #endif #ifndef ENETRESET #define ENETRESET (-5102) #endif #ifndef ECONNABORTED #define ECONNABORTED (-5103) #endif #ifndef ECONNRESET #define ECONNRESET (-5104) #endif #ifndef ENOBUFS #define ENOBUFS (-5105) #endif #ifndef EISCONN #define EISCONN (-5106) #endif #ifndef ENOTCONN #define ENOTCONN (-5107) #endif #ifndef ESHUTDOWN #define ESHUTDOWN (-5108) #endif #ifndef ETOOMANYREFS #define ETOOMANYREFS (-5109) #endif #ifndef ETIMEDOUT #define ETIMEDOUT (-5110) #endif #ifndef ECONNREFUSED #define ECONNREFUSED (-5111) #endif #ifndef EHOSTDOWN #define EHOSTDOWN (-5112) #endif #ifndef EHOSTUNREACH #define EHOSTUNREACH (-5113) #endif #ifndef EALREADY #define EALREADY (-5114) #endif #ifndef EINPROGRESS #define EINPROGRESS (-5115) #endif #ifndef ESTALE #define ESTALE (-5116) #endif #ifndef EUCLEAN #define EUCLEAN (-5117) #endif #ifndef ENOTNAM #define ENOTNAM (-5118) #endif #ifndef ENAVAIL #define ENAVAIL (-5119) #endif #ifndef EISNAM #define EISNAM (-5120) #endif #ifndef EREMOTEIO #define EREMOTEIO (-5121) #endif #ifndef EDQUOT #define EDQUOT (-5122) #endif #ifndef ENOMEDIUM #define ENOMEDIUM (-5123) #endif #ifndef EMEDIUMTYPE #define EMEDIUMTYPE (-5124) #endif #ifndef ECANCELED #define ECANCELED (-5125) #endif #ifndef ENOKEY #define ENOKEY (-5126) #endif #ifndef EKEYEXPIRED #define EKEYEXPIRED (-5127) #endif #ifndef EKEYREVOKED #define EKEYREVOKED (-5128) #endif #ifndef EKEYREJECTED #define EKEYREJECTED (-5129) #endif #ifndef EOWNERDEAD #define EOWNERDEAD (-5130) #endif #ifndef ENOTRECOVERABLE #define ENOTRECOVERABLE (-5131) #endif #ifndef ERFKILL #define ERFKILL (-5132) #endif #ifndef EPROCLIM #define EPROCLIM (-6067) #endif #ifndef EBADRPC #define EBADRPC (-6072) #endif #ifndef ERPCMISMATCH #define ERPCMISMATCH (-6073) #endif #ifndef EPROGUNAVAIL #define EPROGUNAVAIL (-6074) #endif #ifndef EPROGMISMATCH #define EPROGMISMATCH (-6075) #endif #ifndef EPROCUNAVAIL #define EPROCUNAVAIL (-6076) #endif #ifndef EFTYPE #define EFTYPE (-6079) #endif #ifndef EAUTH #define EAUTH (-6080) #endif #ifndef ENEEDAUTH #define ENEEDAUTH (-6081) #endif #ifndef ENOATTR #define ENOATTR (-6087) #endif #ifndef ENOTCAPABLE #define ENOTCAPABLE (-6093) #endif #endif tinyssh-20250501/env.c000066400000000000000000000006761500472222400144160ustar00rootroot00000000000000#include "str.h" #include "env.h" /* The 'env_get(name)' function returns the value of the first environment variable whose name is 'name', or 0 if there is no such variable. */ char *env_get(const char *name) { long long len, i; if (!name) return 0; len = str_len(name); for (i = 0; environ[i]; ++i) if (str_start(environ[i], name) && (environ[i][len] == '=')) return environ[i] + len + 1; return 0; } tinyssh-20250501/env.h000066400000000000000000000004161500472222400144130ustar00rootroot00000000000000#ifndef ENV_H____ #define ENV_H____ /* The environment 'environ', is a 0-terminated array of 0-terminated strings, called environment variables. Each environment variable is of the form name=value. */ extern char **environ; extern char *env_get(const char *); #endif tinyssh-20250501/fe.c000066400000000000000000000100421500472222400142040ustar00rootroot00000000000000/* 20140918 20241211 - reformated using clang-format Jan Mojzis Public domain. */ #include "fe.h" /* o = 0 */ void fe_0(fe o) { long long i; for (i = 0; i < 8; ++i) o[i] = 0; } /* o = 1 */ void fe_1(fe o) { fe_0(o); o[0] = 1; } /* o = x */ void fe_copy(fe o, const fe x) { long long i; for (i = 0; i < 8; ++i) o[i] = x[i]; } /* if (b) swap(f, g) */ void fe_cswap(fe f, fe g, crypto_uint32 b) { long long i; fe t; b = -b; for (i = 0; i < 8; ++i) t[i] = b & (f[i] ^ g[i]); for (i = 0; i < 8; ++i) f[i] ^= t[i]; for (i = 0; i < 8; ++i) g[i] ^= t[i]; fe_0(t); } /* if (b) f = g */ void fe_cmov(fe f, const fe g, crypto_uint32 b) { long long i; fe t; b = -b; for (i = 0; i < 8; ++i) t[i] = b & (f[i] ^ g[i]); for (i = 0; i < 8; ++i) f[i] ^= t[i]; fe_0(t); } /* o = a * b */ /* Implementation note: fe_mul_() is unrolled version of: void fe_mul_(fel o, const fe a, const fe b) { crypto_uint64 u; long long i, j; for (i = 0; i < 16; ++i) o[i] = 0; for (i = 0; i < 8; ++i) for (j = 0; j < 8; ++j) { u = (crypto_uint64)a[i] * (crypto_uint64)b[j]; o[i + j ] += u & 0xffffffff; o[i + j + 1] += u >> 32; } } */ /* clang-format off */ #define M(i, j) u = (crypto_uint64)a[i] * (crypto_uint64)b[j]; \ o[i + j ] += u & 0xffffffff; \ o[i + j + 1] += u >> 32 void fe_mul_(fel o, const fe a, const fe b) { crypto_uint64 u; long long i; for (i = 0; i < 16; ++i) o[i] = 0; M(0, 0); M(0, 1); M(0, 2); M(0, 3); M(0, 4); M(0, 5); M(0, 6); M(0, 7); M(1, 0); M(1, 1); M(1, 2); M(1, 3); M(1, 4); M(1, 5); M(1, 6); M(1, 7); M(2, 0); M(2, 1); M(2, 2); M(2, 3); M(2, 4); M(2, 5); M(2, 6); M(2, 7); M(3, 0); M(3, 1); M(3, 2); M(3, 3); M(3, 4); M(3, 5); M(3, 6); M(3, 7); M(4, 0); M(4, 1); M(4, 2); M(4, 3); M(4, 4); M(4, 5); M(4, 6); M(4, 7); M(5, 0); M(5, 1); M(5, 2); M(5, 3); M(5, 4); M(5, 5); M(5, 6); M(5, 7); M(6, 0); M(6, 1); M(6, 2); M(6, 3); M(6, 4); M(6, 5); M(6, 6); M(6, 7); M(7, 0); M(7, 1); M(7, 2); M(7, 3); M(7, 4); M(7, 5); M(7, 6); M(7, 7); } /* clang-format on */ /* o = x ^ 2 */ /* Implementation note: fe_sq_() is unrolled version of: void fe_sq_(fel o, const fe a) { crypto_uint64 u; long long i, j; for (i = 0; i < 16; ++i) o[i] = 0; for (i = 0; i < 8; ++i) for (j = i + 1; j < 8; ++j) { u = (crypto_uint64)a[i] * (crypto_uint64)a[j]; o[i + j ] += 2 * (u & 0xffffffff); o[i + j + 1] += 2 * (u >> 32); } for (i = 0; i < 8; ++i) { u = (crypto_uint64)a[i] * (crypto_uint64)a[i]; o[2 * i ] += (u & 0xffffffff); o[2 * i + 1] += (u >> 32); } } */ /* clang-format off */ #define M2(i, j) u = (crypto_uint64)a[i] * (crypto_uint64)a[j]; \ o[i + j ] += 2 * (u & 0xffffffff); \ o[i + j + 1] += 2 * (u >> 32) #define SQ(i) u = (crypto_uint64)a[i] * (crypto_uint64)a[i]; \ o[2 * i ] += (u & 0xffffffff); \ o[2 * i + 1] += (u >> 32) void fe_sq_(fel o, const fe a) { crypto_uint64 u; long long i; for (i = 0; i < 16; ++i) o[i] = 0; M2(0, 1); M2(0, 2); M2(0, 3); M2(0, 4); M2(0, 5); M2(0, 6); M2(0, 7); M2(1, 2); M2(1, 3); M2(1, 4); M2(1, 5); M2(1, 6); M2(1, 7); M2(2, 3); M2(2, 4); M2(2, 5); M2(2, 6); M2(2, 7); M2(3, 4); M2(3, 5); M2(3, 6); M2(3, 7); M2(4, 5); M2(4, 6); M2(4, 7); M2(5, 6); M2(5, 7); M2(6, 7); SQ(0); SQ(1); SQ(2); SQ(3); SQ(4); SQ(5); SQ(6); SQ(7); } /* clang-format on */ /* if (p < r) r -= p */ void fe_reducesmall(fe r, const fe p, const crypto_uint64 carry) { crypto_uint64 pb = 0, b; long long i; fe t; for (i = 0; i < 8; ++i) { pb += (crypto_uint64) p[i]; b = (crypto_uint64) r[i] - pb; b = crypto_uint64_topbit_01(b); t[i] = (crypto_uint64) r[i] - pb + (b << 32); pb = b; } b = carry - pb; b = crypto_uint64_topbit_01(b); b -= 1; for (i = 0; i < 8; ++i) r[i] ^= b & (r[i] ^ t[i]); fe_0(t); } tinyssh-20250501/fe.h000066400000000000000000000007371500472222400142230ustar00rootroot00000000000000#ifndef FE_H____ #define FE_H____ #include "crypto_uint32.h" #include "crypto_uint64.h" typedef crypto_uint32 fe[8]; typedef crypto_uint64 fel[16]; extern void fe_0(fe); extern void fe_1(fe); extern void fe_copy(fe, const fe); extern void fe_cswap(fe, fe, crypto_uint32); extern void fe_cmov(fe, const fe, crypto_uint32); extern void fe_mul_(fel, const fe, const fe); extern void fe_sq_(fel, const fe); extern void fe_reducesmall(fe, const fe, const crypto_uint64); #endif tinyssh-20250501/fe25519.c000066400000000000000000000141601500472222400146170ustar00rootroot00000000000000#include "crypto_verify_32.h" #include "cleanup.h" #include "fe.h" #include "fe25519.h" /* p = 2^255 - 19 */ static const fe p = {0xffffffed, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7fffffff}; /* p3 = 3 * p */ static const crypto_uint64 p3[8] = { 0x2ffffffc7ULL, 0x2fffffffdULL, 0x2fffffffdULL, 0x2fffffffdULL, 0x2fffffffdULL, 0x2fffffffdULL, 0x2fffffffdULL, 0x17ffffffdULL}; /* reduction modulo p: 16 limbs -> 8 limbs */ static void fe25519_reducebig(fe o, fel t) { crypto_uint64 u = 0; long long i; for (i = 0; i < 7; ++i) { u += t[i] + 38ULL * t[i + 8]; t[i] = u & 0xffffffff; u >>= 32; } u += t[i] + 38ULL * t[i + 8]; t[i] = u & 0x7fffffff; u >>= 31; u *= 19ULL; for (i = 0; i < 8; ++i) { u += t[i]; o[i] = u & 0xffffffff; u >>= 32; } } /* o = (a * b) % p */ void fe25519_mul(fe o, const fe a, const fe b) { fel t; fe_mul_(t, a, b); fe25519_reducebig(o, t); cleanup(t); } /* o = (a ^ 2) % p */ void fe25519_sq(fe o, const fe a) { fel t; fe_sq_(t, a); fe25519_reducebig(o, t); cleanup(t); } /* o = (121666 * f) % p; */ void fe25519_mul121666(fe o, const fe f) { crypto_uint64 u = 0; long long i; for (i = 0; i < 7; ++i) { u += (crypto_uint64) 121666 * (crypto_uint64) f[i]; o[i] = u & 0xffffffff; u >>= 32; } u += (crypto_uint64) 121666 * (crypto_uint64) f[i]; o[i] = u & 0x7fffffff; u >>= 31; u *= 19ULL; for (i = 0; i < 8; ++i) { u += o[i]; o[i] = u & 0xffffffff; u >>= 32; } } /* o = (x + y) % p */ void fe25519_add(fe o, const fe x, const fe y) { crypto_uint64 u = 0; long long i; for (i = 0; i < 7; ++i) { u += (crypto_uint64) x[i] + (crypto_uint64) y[i]; o[i] = u & 0xffffffff; u >>= 32; } u += (crypto_uint64) x[i] + (crypto_uint64) y[i]; o[i] = u & 0x7fffffff; u >>= 31; u *= 19ULL; for (i = 0; i < 8; ++i) { u += o[i]; o[i] = u & 0xffffffff; u >>= 32; } } /* o = (x - y) % p */ void fe25519_sub(fe o, const fe x, const fe y) { crypto_uint64 u = 0; long long i; for (i = 0; i < 7; ++i) { u += p3[i] - (crypto_uint64) y[i] + (crypto_uint64) x[i]; o[i] = u & 0xffffffff; u >>= 32; } u += p3[i] - (crypto_uint64) y[i] + (crypto_uint64) x[i]; o[i] = u & 0x7fffffff; u >>= 31; u *= 19ULL; for (i = 0; i < 8; ++i) { u += o[i]; o[i] = u & 0xffffffff; u >>= 32; } } /* o = -x % p */ void fe25519_neg(fe o, const fe x) { fe t; fe_0(t); fe25519_sub(o, t, x); } /* o = (1 / z) % p ... using Fermat's Little Theorem */ void fe25519_inv(fe o, const fe z) { fe t0, t1, t2, t3; long long i; fe25519_sq(t0, z); for (i = 1; i < 1; ++i) fe25519_sq(t0, t0); fe25519_sq(t1, t0); for (i = 1; i < 2; ++i) fe25519_sq(t1, t1); fe25519_mul(t1, z, t1); fe25519_mul(t0, t0, t1); fe25519_sq(t2, t0); for (i = 1; i < 1; ++i) fe25519_sq(t2, t2); fe25519_mul(t1, t1, t2); fe25519_sq(t2, t1); for (i = 1; i < 5; ++i) fe25519_sq(t2, t2); fe25519_mul(t1, t2, t1); fe25519_sq(t2, t1); for (i = 1; i < 10; ++i) fe25519_sq(t2, t2); fe25519_mul(t2, t2, t1); fe25519_sq(t3, t2); for (i = 1; i < 20; ++i) fe25519_sq(t3, t3); fe25519_mul(t2, t3, t2); fe25519_sq(t2, t2); for (i = 1; i < 10; ++i) fe25519_sq(t2, t2); fe25519_mul(t1, t2, t1); fe25519_sq(t2, t1); for (i = 1; i < 50; ++i) fe25519_sq(t2, t2); fe25519_mul(t2, t2, t1); fe25519_sq(t3, t2); for (i = 1; i < 100; ++i) fe25519_sq(t3, t3); fe25519_mul(t2, t3, t2); fe25519_sq(t2, t2); for (i = 1; i < 50; ++i) fe25519_sq(t2, t2); fe25519_mul(t1, t2, t1); fe25519_sq(t1, t1); for (i = 1; i < 5; ++i) fe25519_sq(t1, t1); fe25519_mul(o, t1, t0); cleanup(t0); cleanup(t1); cleanup(t2); cleanup(t3); } void fe25519_pow22523(fe out, const fe z) { fe t0, t1, t2; long long i; fe25519_sq(t0, z); for (i = 1; i < 1; ++i) fe25519_sq(t0, t0); fe25519_sq(t1, t0); for (i = 1; i < 2; ++i) fe25519_sq(t1, t1); fe25519_mul(t1, z, t1); fe25519_mul(t0, t0, t1); fe25519_sq(t0, t0); for (i = 1; i < 1; ++i) fe25519_sq(t0, t0); fe25519_mul(t0, t1, t0); fe25519_sq(t1, t0); for (i = 1; i < 5; ++i) fe25519_sq(t1, t1); fe25519_mul(t0, t1, t0); fe25519_sq(t1, t0); for (i = 1; i < 10; ++i) fe25519_sq(t1, t1); fe25519_mul(t1, t1, t0); fe25519_sq(t2, t1); for (i = 1; i < 20; ++i) fe25519_sq(t2, t2); fe25519_mul(t1, t2, t1); fe25519_sq(t1, t1); for (i = 1; i < 10; ++i) fe25519_sq(t1, t1); fe25519_mul(t0, t1, t0); fe25519_sq(t1, t0); for (i = 1; i < 50; ++i) fe25519_sq(t1, t1); fe25519_mul(t1, t1, t0); fe25519_sq(t2, t1); for (i = 1; i < 100; ++i) fe25519_sq(t2, t2); fe25519_mul(t1, t2, t1); fe25519_sq(t1, t1); for (i = 1; i < 50; ++i) fe25519_sq(t1, t1); fe25519_mul(t0, t1, t0); fe25519_sq(t0, t0); for (i = 1; i < 2; ++i) fe25519_sq(t0, t0); fe25519_mul(out, t0, z); cleanup(t0); cleanup(t1); cleanup(t2); } /* converts field-element into byte-array */ void fe25519_tobytes(unsigned char *out, const fe in) { long long i; fe x; fe_copy(x, in); fe_reducesmall(x, p, 0); for (i = 0; i < 8; ++i) crypto_uint32_store(out + 4 * i, x[i]); cleanup(x); } /* converts byte-array into field-element */ void fe25519_frombytes(fe out, const unsigned char *in) { long long i; for (i = 0; i < 8; ++i) out[i] = crypto_uint32_load(in + 4 * i); out[7] &= 0x7fffffff; } /* if (f == 0) return 0; else return -1; */ static const unsigned char zero[32] = {0}; int fe25519_isnonzero(const fe f) { unsigned char s[32]; int r; fe25519_tobytes(s, f); r = crypto_verify_32(s, zero); cleanup(s); return r; } /* if (f >= 0) return 0; else return -1; */ int fe25519_isnegative(const fe f) { unsigned char s[32]; int r; fe25519_tobytes(s, f); r = s[0] & 1; cleanup(s); return r; } tinyssh-20250501/fe25519.h000066400000000000000000000011531500472222400146220ustar00rootroot00000000000000#ifndef FE25519_H____ #define FE25519_H____ #include "fe.h" extern void fe25519_mul(fe, const fe, const fe); extern void fe25519_sq(fe, const fe); extern void fe25519_add(fe, const fe, const fe); extern void fe25519_mul121666(fe, const fe); extern void fe25519_sub(fe, const fe, const fe); extern void fe25519_neg(fe, const fe); extern void fe25519_inv(fe, const fe); extern void fe25519_pow22523(fe, const fe); extern void fe25519_tobytes(unsigned char *, const fe); extern void fe25519_frombytes(fe, const unsigned char *); extern int fe25519_isnonzero(const fe); extern int fe25519_isnegative(const fe); #endif tinyssh-20250501/ge25519.c000066400000000000000000000132771500472222400146300ustar00rootroot00000000000000#include "fe25519.h" #include "cleanup.h" #include "ge25519.h" /* D = -121665/121666 */ static fe D = {0x135978a3, 0x75eb4dca, 0x4141d8ab, 0x00700a4d, 0x7779e898, 0x8cc74079, 0x2b6ffe73, 0x52036cee}; /* D2 = 2 * -121665/121666 */ static fe D2 = {0x26b2f159, 0xebd69b94, 0x8283b156, 0x00e0149a, 0xeef3d130, 0x198e80f2, 0x56dffce7, 0x2406d9dc}; static fe sqrtm1 = { 0x4a0ea0b0, 0xc4ee1b27, 0xad2fe478, 0x2f431806, 0x3dfbd7a7, 0x2b4d0099, 0x4fc1df0b, 0x2b832480, }; static void neutral(ge25519 p) { fe_0(p[0]); fe_1(p[1]); fe_1(p[2]); fe_0(p[3]); } /* p = q */ static void copy(ge25519 p, ge25519 q) { fe_copy(p[0], q[0]); fe_copy(p[1], q[1]); fe_copy(p[2], q[2]); fe_copy(p[3], q[3]); } /* if (b) p = q; */ static void cmov(ge25519 p, ge25519 q, crypto_uint32 b) { fe_cmov(p[0], q[0], b); fe_cmov(p[1], q[1], b); fe_cmov(p[2], q[2], b); fe_cmov(p[3], q[3], b); } void ge25519_add(ge25519 o, ge25519 p, ge25519 q) { fe a, b, c, d, t, e, f, g, h; fe25519_sub(a, p[1], p[0]); fe25519_sub(t, q[1], q[0]); fe25519_mul(a, a, t); fe25519_add(b, p[0], p[1]); fe25519_add(t, q[0], q[1]); fe25519_mul(b, b, t); fe25519_mul(c, p[3], q[3]); fe25519_mul(c, c, D2); fe25519_mul(d, p[2], q[2]); fe25519_add(d, d, d); fe25519_sub(e, b, a); fe25519_sub(f, d, c); fe25519_add(g, d, c); fe25519_add(h, b, a); fe25519_mul(o[0], e, f); fe25519_mul(o[1], h, g); fe25519_mul(o[2], g, f); fe25519_mul(o[3], e, h); cleanup(a); cleanup(b); cleanup(c); cleanup(d); cleanup(t); cleanup(e); cleanup(f); cleanup(g); cleanup(h); } /* https://hyperelliptic.org/EFD/g1p/auto-code/twisted/extended/doubling/dbl-2008-hwcd.op3 */ static void dbl(ge25519 o, ge25519 p) { fe a, b, c, d, e, f, g, h; fe25519_sq(a, p[0]); /* A = X1^2 */ fe25519_sq(b, p[1]); /* B = Y1^2 */ fe25519_sq(c, p[2]); /* t0 = Z1^2 */ fe25519_add(c, c, c); /* C = 2*t0 */ fe25519_neg(d, a); /* D = a*A */ fe25519_add(e, p[0], p[1]); /* t1 = X1+Y1 */ fe25519_sq(e, e); /* t2 = t1^2 */ fe25519_sub(e, e, a); /* t3 = t2-A */ fe25519_sub(e, e, b); /* E = t3-B */ fe25519_add(g, d, b); /* G = D+B */ fe25519_sub(f, g, c); /* F = G-C */ fe25519_sub(h, d, b); /* H = D-B */ fe25519_mul(o[0], e, f); /* X3 = E*F */ fe25519_mul(o[1], g, h); /* Y3 = G*H */ fe25519_mul(o[2], f, g); /* Z3 = F*G */ fe25519_mul(o[3], e, h); /* T3 = E*H */ cleanup(a); cleanup(b); cleanup(c); cleanup(d); cleanup(e); cleanup(f); cleanup(g); cleanup(h); } void ge25519_tobytes(unsigned char *s, ge25519 h) { fe x, y, z; fe25519_inv(z, h[2]); fe25519_mul(x, h[0], z); fe25519_mul(y, h[1], z); fe25519_tobytes(s, y); s[31] ^= fe25519_isnegative(x) << 7; cleanup(x); cleanup(y); cleanup(z); } int ge25519_frombytes_negate_vartime(ge25519 h, const unsigned char *s) { fe u, v, v3, vxx, check; int ret = -1; fe25519_frombytes(h[1], s); fe_1(h[2]); fe25519_sq(u, h[1]); fe25519_mul(v, u, D); fe25519_sub(u, u, h[2]); /* u = y^2-1 */ fe25519_add(v, v, h[2]); /* v = dy^2+1 */ fe25519_sq(v3, v); fe25519_mul(v3, v3, v); /* v3 = v^3 */ fe25519_sq(h[0], v3); fe25519_mul(h[0], h[0], v); fe25519_mul(h[0], h[0], u); /* x = uv^7 */ fe25519_pow22523(h[0], h[0]); /* x = (uv^7)^((q-5)/8) */ fe25519_mul(h[0], h[0], v3); fe25519_mul(h[0], h[0], u); /* x = uv^3(uv^7)^((q-5)/8) */ fe25519_sq(vxx, h[0]); fe25519_mul(vxx, vxx, v); fe25519_sub(check, vxx, u); /* vx^2-u */ if (fe25519_isnonzero(check)) { fe25519_add(check, vxx, u); /* vx^2+u */ if (fe25519_isnonzero(check)) { goto cleanup; } fe25519_mul(h[0], h[0], sqrtm1); } if (fe25519_isnegative(h[0]) == (s[31] >> 7)) fe25519_neg(h[0], h[0]); fe25519_mul(h[3], h[0], h[1]); ret = 0; cleanup: cleanup(u); cleanup(v); cleanup(v3); cleanup(vxx); cleanup(check); return ret; } /* if (a == b) return 1; else return 0; */ static unsigned char equal(unsigned char a, unsigned char b) { unsigned char x = a ^ b; crypto_uint32 y = x; y -= 1; y >>= 31; return y; } /* point multiplication using windowed method */ void ge25519_scalarmult(ge25519 o, ge25519 q, const unsigned char *a) { long long i, j; ge25519 t[16], p, sp = {0}; unsigned char e[64]; for (i = 0; i < 32; ++i) { e[2 * i + 0] = (a[i] >> 0) & 0x0f; e[2 * i + 1] = (a[i] >> 4) & 0x0f; } neutral(p); /* precompute points */ copy(t[0], p); copy(t[1], q); for (i = 2; i < 16; ++i) { if ((i & 1) == 0) dbl(t[i], t[i / 2]); else ge25519_add(t[i], t[i - 1], q); } for (i = 63; i >= 0; --i) { for (j = 0; j < 4; ++j) dbl(p, p); for (j = 0; j < 16; ++j) cmov(sp, t[j], equal(e[i], j)); ge25519_add(p, p, sp); } copy(o, p); cleanup(p); cleanup(t); cleanup(sp); cleanup(e); } static ge25519 baseq = { {0x8f25d51a, 0xc9562d60, 0x9525a7b2, 0x692cc760, 0xfdd6dc5c, 0xc0a4e231, 0xcd6e53fe, 0x216936d3}, {0x66666658, 0x66666666, 0x66666666, 0x66666666, 0x66666666, 0x66666666, 0x66666666, 0x66666666}, {0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, {0xa5b7dda3, 0x6dde8ab3, 0x775152f5, 0x20f09f80, 0x64abe37d, 0x66ea4e8e, 0xd78b7665, 0x67875f0f}, }; void ge25519_scalarmult_base(ge25519 p, const unsigned char *a) { ge25519_scalarmult(p, baseq, a); } tinyssh-20250501/ge25519.h000066400000000000000000000006651500472222400146320ustar00rootroot00000000000000#ifndef GE25519_H____ #define GE25519_H____ #include "fe.h" typedef fe ge25519[4]; /* X, Y, Z, T */ extern void ge25519_tobytes(unsigned char *, ge25519); extern int ge25519_frombytes_negate_vartime(ge25519, const unsigned char *); extern void ge25519_add(ge25519, ge25519, ge25519); extern void ge25519_scalarmult(ge25519, ge25519, const unsigned char *); extern void ge25519_scalarmult_base(ge25519, const unsigned char *); #endif tinyssh-20250501/getln.c000066400000000000000000000023551500472222400147330ustar00rootroot00000000000000/* 20140323 20241207 - reformated using clang-format Jan Mojzis Public domain. */ #include #include #include "e.h" #include "getln.h" static int getch(int fd, char *x) { int r; struct pollfd p; for (;;) { r = read(fd, x, 1); if (r == -1) { if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) { p.fd = fd; p.events = POLLIN | POLLERR; poll(&p, 1, -1); continue; } } break; } return r; } /* The function 'getln' reads line from filedescriptor 'fd' into buffer 'xv' of length 'xmax'. */ int getln(int fd, void *xv, long long xmax) { long long xlen; int r; char ch; char *x = (char *) xv; if (xmax < 1) { errno = EINVAL; return -1; } x[0] = 0; if (fd < 0) { errno = EBADF; return -1; } xlen = 0; for (;;) { if (xlen >= xmax - 1) { x[xmax - 1] = 0; errno = ENOMEM; return -1; } r = getch(fd, &ch); if (r != 1) break; if (ch == 0) ch = '\n'; x[xlen++] = ch; if (ch == '\n') break; } x[xlen] = 0; return r; } tinyssh-20250501/getln.h000066400000000000000000000001331500472222400147300ustar00rootroot00000000000000#ifndef GETLN_H____ #define GETLN_H____ extern int getln(int, void *, long long); #endif tinyssh-20250501/global.c000066400000000000000000000026421500472222400150610ustar00rootroot00000000000000/* 20140214 20241207 - reformated using clang-format Jan Mojzis Public domain. The 'global' library is used for global memory initializition and global memory cleanup. The 'global' library also has space for 2 versatile buffers. */ #include #include "newenv.h" #include "channel.h" #include "packet.h" #include "sshcrypto.h" #include "purge.h" #include "trymlock.h" #include "global.h" unsigned char global_bspace1[GLOBAL_BSIZE]; unsigned char global_bspace2[GLOBAL_BSIZE]; /* Initialize memory space. */ void global_init(void) { packet_init(); channel_init(); newenv_init(); sshcrypto_init(); trymlock(global_bspace1, sizeof global_bspace1); trymlock(global_bspace2, sizeof global_bspace2); purge(global_bspace1, sizeof global_bspace1); purge(global_bspace2, sizeof global_bspace2); } /* Remove sentitive data from allocated memory. */ void global_purge(void) { unsigned char stack[4096]; purge(stack, sizeof stack); packet_purge(); channel_purge(); newenv_purge(); sshcrypto_purge(); purge(global_bspace1, sizeof global_bspace1); purge(global_bspace2, sizeof global_bspace2); trymunlock(global_bspace1, sizeof global_bspace1); trymunlock(global_bspace2, sizeof global_bspace2); } /* Remove sentitive data from allocated memory and exit with status 'x'. */ __attribute__((noreturn)) void global_die(int x) { global_purge(); _exit(x); } tinyssh-20250501/global.h000066400000000000000000000004211500472222400150570ustar00rootroot00000000000000#ifndef GLOBAL_H____ #define GLOBAL_H____ #define GLOBAL_BSIZE 65536 extern unsigned char global_bspace1[GLOBAL_BSIZE]; extern unsigned char global_bspace2[GLOBAL_BSIZE]; extern void global_init(void); extern void global_purge(void); extern void global_die(int); #endif tinyssh-20250501/haslib1305.c000066400000000000000000000010651500472222400153720ustar00rootroot00000000000000#include int main(int argc, char **argv) { int ret = 0; long long i; unsigned char k[poly1305_KEYBYTES] = {2}; unsigned char m[16] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; unsigned char a[poly1305_BYTES]; unsigned char o[poly1305_BYTES] = {3}; (void) argc; (void) argv; ret |= -poly1305_verify(0, m, sizeof m, k); poly1305(a, m, sizeof m, k); for (i = 0; i < poly1305_BYTES; ++i) ret |= (o[i] ^ a[i]); return ret; } tinyssh-20250501/haslib25519.c000066400000000000000000000041301500472222400154630ustar00rootroot00000000000000#include #if lib25519_nP_montgomery25519_SCALARBYTES != lib25519_dh_SECRETKEYBYTES #error #endif #if lib25519_nP_montgomery25519_POINTBYTES != lib25519_dh_PUBLICKEYBYTES #error #endif #if lib25519_nP_montgomery25519_POINTBYTES != lib25519_dh_BYTES #error #endif #if lib25519_nG_montgomery25519_SCALARBYTES != lib25519_dh_SECRETKEYBYTES #error #endif #if lib25519_nG_montgomery25519_POINTBYTES != lib25519_dh_PUBLICKEYBYTES #error #endif #if lib25519_nG_montgomery25519_POINTBYTES != lib25519_dh_BYTES #error #endif static unsigned char k[lib25519_dh_BYTES]; static unsigned char k2[lib25519_dh_BYTES]; static unsigned char pk[lib25519_dh_PUBLICKEYBYTES]; static unsigned char pk2[lib25519_dh_PUBLICKEYBYTES]; static unsigned char sk[lib25519_dh_SECRETKEYBYTES]; static unsigned char signsk[lib25519_sign_SECRETKEYBYTES]; static unsigned char signpk[lib25519_sign_PUBLICKEYBYTES]; static unsigned char signs[lib25519_sign_BYTES + /*m*/ lib25519_dh_BYTES]; static long long signslen; static long long klen; /* return zero for all inputs */ static unsigned char z(unsigned char x) { unsigned long long z = (unsigned long long) x + 1ULL; unsigned long long t = z; long long i; for (i = 6; i >= 0; --i) { t = (t * t) % 257; t = (t * z) % 257; } t = (t * z) % 257; return t - 1; } int main(int argc, char **argv) { unsigned char ret = 0; long long i; (void) argc; (void) argv; lib25519_dh_keypair(pk, sk); lib25519_nG_montgomery25519(pk2, sk); for (i = 0; i < lib25519_dh_PUBLICKEYBYTES; ++i) ret |= pk[i] ^ pk2[i]; lib25519_dh(k, pk, sk); lib25519_nP_montgomery25519(k2, sk, pk); for (i = 0; i < lib25519_dh_BYTES; ++i) ret |= k[i] ^ k2[i]; lib25519_sign_keypair(signpk, signsk); lib25519_sign(signs, &signslen, k, sizeof k, signsk); if (signslen != sizeof signs) ret |= 1; ret |= lib25519_sign_open(k2, &klen, signs, signslen, signpk); if (klen != sizeof k2) ret |= 1; for (i = 0; i < lib25519_dh_BYTES; ++i) ret |= k[i] ^ k2[i]; for (i = 0; i < sizeof signs; ++i) ret |= z(signs[i]); return ret; } tinyssh-20250501/haslibntruprime.c000066400000000000000000000016401500472222400170260ustar00rootroot00000000000000#include /* return zero for all inputs */ static unsigned char z(unsigned char x) { unsigned long long z = (unsigned long long) x + 1ULL; unsigned long long t = z; long long i; for (i = 6; i >= 0; --i) { t = (t * t) % 257; t = (t * z) % 257; } t = (t * z) % 257; return t - 1; } static unsigned char pk[sntrup761_PUBLICKEYBYTES]; static unsigned char sk[sntrup761_SECRETKEYBYTES]; static unsigned char c[sntrup761_CIPHERTEXTBYTES]; static unsigned char k1[sntrup761_BYTES]; static unsigned char k2[sntrup761_BYTES]; int main(int argc, char **argv) { unsigned char ret = 0; unsigned long long i; (void) argc; (void) argv; sntrup761_keypair(pk, sk); sntrup761_enc(c, k1, pk); sntrup761_dec(k2, c, sk); for (i = 0; i < sntrup761_BYTES; ++i) ret |= k1[i] ^ k2[i]; for (i = 0; i < sizeof k1; ++i) ret |= z(k1[i]); return ret; } tinyssh-20250501/haslibrandombytes.c000066400000000000000000000013311500472222400173250ustar00rootroot00000000000000#include /* return zero for all inputs */ static unsigned char z(unsigned char x) { unsigned long long z = (unsigned long long) x + 1ULL; unsigned long long t = z; long long i; for (i = 6; i >= 0; --i) { t = (t * t) % 257; t = (t * z) % 257; } t = (t * z) % 257; return (unsigned char) t - 1; } int main(int argc, char **argv) { unsigned char buf[32], ret = 0; const char *source; unsigned long long i; (void) argc; (void) argv; randombytes(buf, sizeof buf); for (i = 0; i < sizeof buf; ++i) ret |= z(buf[i]); source = randombytes_source(); for (i = 0; source[i]; ++i) ret |= z((unsigned char) source[i]); return z(ret); } tinyssh-20250501/haslibutilh.c000066400000000000000000000001101500472222400161150ustar00rootroot00000000000000/* Public domain. */ #include int main(void) { return 0; } tinyssh-20250501/haslimits.c000066400000000000000000000001071500472222400156100ustar00rootroot00000000000000/* Public domain. */ #include int main(void) { return 0; } tinyssh-20250501/haslogintty.c000066400000000000000000000002421500472222400161600ustar00rootroot00000000000000/* Public domain. */ extern int login_tty(int); static void foo(void) { login_tty(0); } int main(int argc, char **argv) { if (!argc) foo(); return 0; } tinyssh-20250501/hasmlock.c000066400000000000000000000002251500472222400154150ustar00rootroot00000000000000/* Public domain. */ #include int main(void) { char x[16] = {0}; mlock(x, sizeof x); munlock(x, sizeof x); return 0; } tinyssh-20250501/hasopenpty.c000066400000000000000000000005111500472222400160040ustar00rootroot00000000000000/* Public domain. */ #include #include #include extern int openpty(int *, int *, char *, struct termios *, struct winsize *); static void foo(void) { int master, slave; openpty(&master, &slave, 0, 0, 0); } int main(int argc, char **argv) { if (!argc) foo(); return 0; } tinyssh-20250501/hasutilh.c000066400000000000000000000001051500472222400154320ustar00rootroot00000000000000/* Public domain. */ #include int main(void) { return 0; } tinyssh-20250501/hasutmp.c000066400000000000000000000002141500472222400152730ustar00rootroot00000000000000/* Public domain. */ #include #include #include int main(void) { struct utmp ut = {0}; return 0; } tinyssh-20250501/hasutmpaddrv6.c000066400000000000000000000002771500472222400164130ustar00rootroot00000000000000/* Public domain. */ #include #include #include int main(void) { struct utmp ut; int x[sizeof(ut.ut_addr_v6) < 16 ? -1 : 1] = {0}; return x[0]; } tinyssh-20250501/hasutmphost.c000066400000000000000000000002611500472222400161730ustar00rootroot00000000000000/* Public domain. */ #include #include #include int main(void) { struct utmp ut; if (sizeof ut.ut_host < 8) return 111; return 0; } tinyssh-20250501/hasutmploginlogout.c000066400000000000000000000004771500472222400175710ustar00rootroot00000000000000/* Public domain. */ #include #include #include extern void login(const struct utmp *); extern int logout(const char *); static void foo(void) { struct utmp ut = {0}; login(&ut); logout(ut.ut_line); } int main(int argc, char **argv) { if (!argc) foo(); return 0; } tinyssh-20250501/hasutmplogwtmp.c000066400000000000000000000003161500472222400167100ustar00rootroot00000000000000/* Public domain. */ extern void logwtmp(const char *, const char *, const char *); static void foo(void) { logwtmp("", "", ""); } int main(int argc, char **argv) { if (!argc) foo(); return 0; } tinyssh-20250501/hasutmpname.c000066400000000000000000000002611500472222400161360ustar00rootroot00000000000000/* Public domain. */ #include #include #include int main(void) { struct utmp ut; if (sizeof ut.ut_name < 8) return 111; return 0; } tinyssh-20250501/hasutmppid.c000066400000000000000000000002241500472222400157710ustar00rootroot00000000000000/* Public domain. */ #include #include #include int main(void) { struct utmp ut = {0}; return ut.ut_pid; } tinyssh-20250501/hasutmptime.c000066400000000000000000000002241500472222400161530ustar00rootroot00000000000000/* Public domain. */ #include #include #include int main(void) { struct utmp ut = {0}; return ut.ut_time; } tinyssh-20250501/hasutmptv.c000066400000000000000000000002551500472222400156520ustar00rootroot00000000000000/* Public domain. */ #include #include #include int main(void) { struct utmp ut = {0}; return ut.ut_tv.tv_sec + ut.ut_tv.tv_usec; } tinyssh-20250501/hasutmptype.c000066400000000000000000000002641500472222400162020ustar00rootroot00000000000000/* Public domain. */ #include #include #include int main(void) { struct utmp ut; ut.ut_type = USER_PROCESS | DEAD_PROCESS; return 0; } tinyssh-20250501/hasutmpuser.c000066400000000000000000000002611500472222400161740ustar00rootroot00000000000000/* Public domain. */ #include #include #include int main(void) { struct utmp ut; if (sizeof ut.ut_user < 8) return 111; return 0; } tinyssh-20250501/hasutmpx.c000066400000000000000000000004551500472222400154720ustar00rootroot00000000000000/* Public domain. */ #include static void foo(void) { struct utmpx ut; ut.ut_type = DEAD_PROCESS; ut.ut_type = USER_PROCESS; ut.ut_type = 0; setutxent(); pututxline(&ut); endutxent(); } int main(int argc, char **argv) { if (!argc) foo(); return 0; } tinyssh-20250501/hasutmpxaddrv6.c000066400000000000000000000003031500472222400165710ustar00rootroot00000000000000/* Public domain. */ #include #include #include int main(void) { struct utmpx utx; int x[sizeof(utx.ut_addr_v6) < 16 ? -1 : 1] = {0}; return x[0]; } tinyssh-20250501/hasutmpxsyslen.c000066400000000000000000000001611500472222400167220ustar00rootroot00000000000000/* Public domain. */ #include int main(void) { struct utmpx ut = {0}; return ut.ut_syslen; } tinyssh-20250501/hasutmpxupdwtmpx.c000066400000000000000000000003331500472222400172760ustar00rootroot00000000000000/* Public domain. */ #include static void foo(void) { struct utmpx ut = {0}; updwtmpx("/nonexistent", &ut); } int main(int argc, char **argv) { (void) argv; if (!argc) foo(); return 0; } tinyssh-20250501/hasvalgrind.c000066400000000000000000000015741500472222400161260ustar00rootroot00000000000000#include /* return zero for all inputs */ static unsigned char z(unsigned char x) { unsigned long long z = (unsigned long long) x + 1ULL; unsigned long long t = z; long long i; for (i = 6; i >= 0; --i) { t = (t * t) % 257; t = (t * z) % 257; } t = (t * z) % 257; return (unsigned char) t - 1; } static void secret(void *xv, long long xlen) { VALGRIND_MAKE_MEM_UNDEFINED(xv, xlen); } static void public(void *xv, long long xlen) { VALGRIND_MAKE_MEM_DEFINED(xv, xlen); } int main(int argc, char **argv) { unsigned char buf[32] = {1}; unsigned char ret = 0; unsigned long long i; (void) argc; (void) argv; secret(buf, sizeof buf); for (i = 0; i < sizeof buf; ++i) ret |= z(buf[i]); public(buf, sizeof buf); for (i = 0; i < sizeof buf; ++i) ret |= z(buf[i]); return ret; } tinyssh-20250501/int16_optblocker.c000077700000000000000000000000001500472222400243612cryptoint/int16_optblocker.custar00rootroot00000000000000tinyssh-20250501/int32_optblocker.c000077700000000000000000000000001500472222400243552cryptoint/int32_optblocker.custar00rootroot00000000000000tinyssh-20250501/int64_optblocker.c000077700000000000000000000000001500472222400243672cryptoint/int64_optblocker.custar00rootroot00000000000000tinyssh-20250501/int8_optblocker.c000077700000000000000000000000001500472222400242232cryptoint/int8_optblocker.custar00rootroot00000000000000tinyssh-20250501/iptostr.c000066400000000000000000000057331500472222400153310ustar00rootroot00000000000000/* 20130604 20241207 - reformated using clang-format Jan Mojzis Public domain. */ #include "byte.h" #include "iptostr.h" static char *iptostr4(char *, const unsigned char *); static char *iptostr6(char *, const unsigned char *); /* The 'iptostr(strbuf,ip)' function converts IP address 'ip' from network byte order into the 0-terminated string. The 'ip' length is always 16 bytes. The caller must allocate at least IPTOSTR_LEN bytes for 'strbuf'. */ char *iptostr(char *strbuf, const unsigned char *ip) { static char staticbuf[IPTOSTR_LEN]; if (!strbuf) strbuf = staticbuf; /* not thread-safe */ if (byte_isequal("\0\0\0\0\0\0\0\0\0\0\377\377", 12, ip)) { return iptostr4(strbuf, ip + 12); } return iptostr6(strbuf, ip); } /* convert IPv4 address */ static char *iptostr4(char *strbuf, const unsigned char *ip) { long long i, len = 0; unsigned long long num; for (i = 3; i >= 0; --i) { num = ip[i]; do { num /= 10; ++len; } while (num); if (i > 0) ++len; } strbuf += len; for (i = 3; i >= 0; --i) { num = ip[i]; do { *--strbuf = '0' + (num % 10); num /= 10; } while (num); if (i > 0) *--strbuf = '.'; } while (len < IPTOSTR_LEN) strbuf[len++] = 0; return strbuf; } /* The 'ip' is splited into 8 16-bit blocks and the 'countz' function counts successive zeros and searches for largest zero-block. 'first' ... first position of the zero-block 'last' ... last position of the zero-block */ static void countz(long long *first, long long *last, const unsigned long long *ip) { long long i, j, e; long long count[8]; for (i = 7; i >= 0; --i) count[i] = 0; e = 8; for (i = 7; i >= 0; --i) { if (!ip[i]) { for (j = i; j < e; ++j) ++count[j]; } else { e = i; } } e = 0; j = 0; for (i = 7; i >= 0; --i) { if (count[i]) { if (count[i] >= e) { e = count[i]; j = i; } } } *first = j - count[j] + 1; *last = j; } /* convert IPv6 address */ static char *iptostr6(char *strbuf, const unsigned char *ip) { long long first, last, i; unsigned long long ip2[8]; char *s = strbuf; for (i = 7; i >= 0; --i) { ip2[i] = ip[2 * i]; ip2[i] <<= 8; ip2[i] += ip[2 * i + 1]; } countz(&first, &last, ip2); strbuf += IPTOSTR_LEN - 1; *strbuf = 0; for (i = 7; i >= 0; --i) { if (i <= last && i >= first && first != last) { if (i == last) *--strbuf = ':'; if (i == 7) *--strbuf = ':'; continue; } do { *--strbuf = "0123456789abcdef"[ip2[i] & 15]; ip2[i] >>= 4; } while (ip2[i]); if (i > 0) *--strbuf = ':'; } i = strbuf - s; byte_copy(s, IPTOSTR_LEN - i, strbuf); byte_zero(s + IPTOSTR_LEN - i, i); return s; } tinyssh-20250501/iptostr.h000066400000000000000000000002021500472222400153200ustar00rootroot00000000000000#ifndef IPTOSTR_H____ #define IPTOSTR_H____ #define IPTOSTR_LEN 46 extern char *iptostr(char *, const unsigned char *); #endif tinyssh-20250501/limit.h000066400000000000000000000004211500472222400147350ustar00rootroot00000000000000#ifndef LIMIT_H____ #define LIMIT_H____ #include "haslimits.h" #ifdef HASLIMITS #include #endif #ifndef LOGIN_NAME_MAX #define LOGIN_NAME_MAX 256 #endif #ifndef NAME_MAX #define NAME_MAX 255 #endif #ifndef TTY_NAME_MAX #define TTY_NAME_MAX 32 #endif #endif tinyssh-20250501/load.c000066400000000000000000000005561500472222400145420ustar00rootroot00000000000000/* taken from nacl-20110221, from curvecp/load.c - reformated using clang-format */ #include #include "readall.h" #include "open.h" #include "e.h" #include "load.h" int load(const char *fn, void *x, long long xlen) { int fd; int r; fd = open_read(fn); if (fd == -1) return -1; r = readall(fd, x, xlen); close(fd); return r; } tinyssh-20250501/load.h000066400000000000000000000001411500472222400145350ustar00rootroot00000000000000#ifndef LOAD_H____ #define LOAD_H____ extern int load(const char *, void *, long long); #endif tinyssh-20250501/log.c000066400000000000000000000104071500472222400144000ustar00rootroot00000000000000/* 20140202 20241211 - reformated using clang-format Jan Mojzis Public domain. The 'log' library is used to write log messages on standard error output including source file, function and line number. Non-printable characters are replaced using '?'. The 'log' library also supports syslog. */ #include #include "writeall.h" #include "randommod.h" #include "purge.h" #include "numtostr.h" #include "e.h" #include "log.h" static const char *logtext = "x"; static char logstring[9] = "________"; int loglevel = 1; static int logflagfnln = 1; static int logflagsyslog = 0; static char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTSUVWXYZ0123456789"; void log_init(int level, const char *text, int line, int flagsyslog) { unsigned long long i; loglevel = level; logtext = text; logflagfnln = line; for (i = 0; i < sizeof logstring; ++i) { logstring[i] = chars[randommod(sizeof chars - 1)]; } logstring[sizeof logstring - 1] = 0; if (flagsyslog) { openlog(text, 0, LOG_DAEMON); logflagsyslog = 1; } errno = 0; } char *log_string(void) { return logstring; } static char buf[257]; static unsigned long long buflen = 0; static void flush(void) { if (logflagsyslog) { buf[buflen] = 0; syslog(LOG_INFO, "%s", buf); } else { writeall(2, buf, buflen); } buflen = 0; purge(buf, buflen); } static void outs(const char *x) { long long i; for (i = 0; x[i]; ++i) { if (buflen >= sizeof buf - 1) flush(); if (x[i] == '\n') buf[buflen++] = '\n'; else if (x[i] < 32) buf[buflen++] = '?'; else if (x[i] > 126) buf[buflen++] = '?'; else buf[buflen++] = x[i]; } } static void outnum(unsigned long long n) { char b[NUMTOSTR_LEN]; outs(numtostr(b, n)); } void log_9_(int level, int ignoreerrno, const char *f, unsigned long long l, const char *s0, const char *s1, const char *s2, const char *s3, const char *s4, const char *s5, const char *s6, const char *s7, const char *s8) { const char *s[9]; long long i; const char *m; if (level > loglevel) return; s[0] = s0; s[1] = s1; s[2] = s2; s[3] = s3; s[4] = s4; s[5] = s5; s[6] = s6; s[7] = s7; s[8] = s8; switch (level) { case -1: m = "BUG"; break; case 0: m = "usage"; break; case 1: m = "fatal"; break; case 2: if (!ignoreerrno) m = "warning"; else m = "info"; break; case 3: m = "debug"; break; case 4: m = "tracing"; break; default: m = "unknown"; break; } /* name: session: level: message (error){file:line} */ /* 'name:' */ do { if (level == 0) break; /* don't print in usage level */ if (logflagsyslog) break; /* don't print in syslog mode */ outs(logtext); outs(": "); } while (0); /* 'session:' */ do { if (level == 0) break; /* don't print in usage level */ if (!logflagfnln) break; /* don't print when disabled */ outs(logstring); outs(": "); } while (0); /* 'level:' */ do { if (level == 0) break; /* don't print in usage level */ outs(m); outs(": "); } while (0); /* 'message' */ for (i = 0; i < 9 && s[i]; ++i) outs(s[i]); outs(" "); /* '(error)' */ do { if (!errno) break; /* don't print when errno = 0 */ if (ignoreerrno) break; /* don't print when disabled */ outs("("); outs(e_str(errno)); outs(")"); } while (0); /* {file:line} */ do { if (level == 0) break; /* don't print in usage level */ if (!f) break; /* don't print when no f */ if (!l) break; /* don't print when no l */ if (!logflagfnln && level != -1) break; /* don't print when disabled */ outs("{"); outs(f); outs(":"); outnum(l); outs("}"); } while (0); outs("\n"); flush(); return; } tinyssh-20250501/log.h000066400000000000000000000132771500472222400144150ustar00rootroot00000000000000#ifndef LOG_H____ #define LOG_H____ extern void log_init(int, const char *, int, int); extern char *log_string(void); extern int loglevel; extern void log_9_(int, int, const char *, unsigned long long, const char *, const char *, const char *, const char *, const char *, const char *, const char *, const char *, const char *); /* usage */ #define log_u(a, b, c, d, e, f, g, h, i, j, k) \ do { \ if (loglevel < 0) break; \ log_9_(0, 1, a, b, c, d, e, f, g, h, i, j, k); \ } while (0) #define log_u9(a, b, c, d, e, f, g, h, i) \ log_u(__FILE__, __LINE__, a, b, c, d, e, f, g, h, i) #define log_u8(a, b, c, d, e, f, g, h) log_u9(a, b, c, d, e, f, g, h, 0) #define log_u7(a, b, c, d, e, f, g) log_u8(a, b, c, d, e, f, g, 0) #define log_u6(a, b, c, d, e, f) log_u7(a, b, c, d, e, f, 0) #define log_u5(a, b, c, d, e) log_u6(a, b, c, d, e, 0) #define log_u4(a, b, c, d) log_u5(a, b, c, d, 0) #define log_u3(a, b, c) log_u4(a, b, c, 0) #define log_u2(a, b) log_u3(a, b, 0) #define log_u1(a) log_u2(a, 0) /* fatal */ #define log_f(a, b, c, d, e, f, g, h, i, j, k) \ do { \ if (loglevel < 1) break; \ log_9_(1, 0, a, b, c, d, e, f, g, h, i, j, k); \ } while (0) #define log_f9(a, b, c, d, e, f, g, h, i) \ log_f(__FILE__, __LINE__, a, b, c, d, e, f, g, h, i) #define log_f8(a, b, c, d, e, f, g, h) log_f9(a, b, c, d, e, f, g, h, 0) #define log_f7(a, b, c, d, e, f, g) log_f8(a, b, c, d, e, f, g, 0) #define log_f6(a, b, c, d, e, f) log_f7(a, b, c, d, e, f, 0) #define log_f5(a, b, c, d, e) log_f6(a, b, c, d, e, 0) #define log_f4(a, b, c, d) log_f5(a, b, c, d, 0) #define log_f3(a, b, c) log_f4(a, b, c, 0) #define log_f2(a, b) log_f3(a, b, 0) #define log_f1(a) log_f2(a, 0) /* warning */ #define log_w(a, b, c, d, e, f, g, h, i, j, k) \ do { \ if (loglevel < 2) break; \ log_9_(2, 0, a, b, c, d, e, f, g, h, i, j, k); \ } while (0) #define log_w9(a, b, c, d, e, f, g, h, i) \ log_w(__FILE__, __LINE__, a, b, c, d, e, f, g, h, i) #define log_w8(a, b, c, d, e, f, g, h) log_w9(a, b, c, d, e, f, g, h, 0) #define log_w7(a, b, c, d, e, f, g) log_w8(a, b, c, d, e, f, g, 0) #define log_w6(a, b, c, d, e, f) log_w7(a, b, c, d, e, f, 0) #define log_w5(a, b, c, d, e) log_w6(a, b, c, d, e, 0) #define log_w4(a, b, c, d) log_w5(a, b, c, d, 0) #define log_w3(a, b, c) log_w4(a, b, c, 0) #define log_w2(a, b) log_w3(a, b, 0) #define log_w1(a) log_w2(a, 0) /* info */ #define log_i(a, b, c, d, e, f, g, h, i, j, k) \ do { \ if (loglevel < 2) break; \ log_9_(2, 1, a, b, c, d, e, f, g, h, i, j, k); \ } while (0) #define log_i9(a, b, c, d, e, f, g, h, i) \ log_i(__FILE__, __LINE__, a, b, c, d, e, f, g, h, i) #define log_i8(a, b, c, d, e, f, g, h) log_i9(a, b, c, d, e, f, g, h, 0) #define log_i7(a, b, c, d, e, f, g) log_i8(a, b, c, d, e, f, g, 0) #define log_i6(a, b, c, d, e, f) log_i7(a, b, c, d, e, f, 0) #define log_i5(a, b, c, d, e) log_i6(a, b, c, d, e, 0) #define log_i4(a, b, c, d) log_i5(a, b, c, d, 0) #define log_i3(a, b, c) log_i4(a, b, c, 0) #define log_i2(a, b) log_i3(a, b, 0) #define log_i1(a) log_i2(a, 0) /* debug */ #define log_d(a, b, c, d, e, f, g, h, i, j, k) \ do { \ if (loglevel < 3) break; \ log_9_(3, 1, a, b, c, d, e, f, g, h, i, j, k); \ } while (0) #define log_d9(a, b, c, d, e, f, g, h, i) \ log_d(__FILE__, __LINE__, a, b, c, d, e, f, g, h, i) #define log_d8(a, b, c, d, e, f, g, h) log_d9(a, b, c, d, e, f, g, h, 0) #define log_d7(a, b, c, d, e, f, g) log_d8(a, b, c, d, e, f, g, 0) #define log_d6(a, b, c, d, e, f) log_d7(a, b, c, d, e, f, 0) #define log_d5(a, b, c, d, e) log_d6(a, b, c, d, e, 0) #define log_d4(a, b, c, d) log_d5(a, b, c, d, 0) #define log_d3(a, b, c) log_d4(a, b, c, 0) #define log_d2(a, b) log_d3(a, b, 0) #define log_d1(a) log_d2(a, 0) /* tracing */ #define log_t(a, b, c, d, e, f, g, h, i, j, k) \ do { \ if (loglevel < 4) break; \ log_9_(4, 1, a, b, c, d, e, f, g, h, i, j, k); \ } while (0) #define log_t9(a, b, c, d, e, f, g, h, i) \ log_t(__FILE__, __LINE__, a, b, c, d, e, f, g, h, i) #define log_t8(a, b, c, d, e, f, g, h) log_t9(a, b, c, d, e, f, g, h, 0) #define log_t7(a, b, c, d, e, f, g) log_t8(a, b, c, d, e, f, g, 0) #define log_t6(a, b, c, d, e, f) log_t7(a, b, c, d, e, f, 0) #define log_t5(a, b, c, d, e) log_t6(a, b, c, d, e, 0) #define log_t4(a, b, c, d) log_t5(a, b, c, d, 0) #define log_t3(a, b, c) log_t4(a, b, c, 0) #define log_t2(a, b) log_t3(a, b, 0) #define log_t1(a) log_t2(a, 0) #endif tinyssh-20250501/loginshell.c000066400000000000000000000013331500472222400157550ustar00rootroot00000000000000/* 20140429 20241208 - reformated using clang-format Jan Mojzis Public domain. */ #include "e.h" #include "loginshell.h" /* The 'loginshell()' function converts shell path into -shell name. For example: '/bin/sh' -> '-sh' '/usr/pkg/bin/bash' -> '-bash' */ int loginshell(char *out, long long outlen, const char *in) { long long len, pos = -1; if (!out || !in || outlen < 2) { errno = EINVAL; return 0; } for (len = 0; in[len]; ++len) if (in[len] == '/') pos = len; in += pos + 1; len -= pos + 1; if (len > outlen - 2) len = outlen - 2; /* truncate name */ *out++ = '-'; while (len > 0) { *out++ = *in++; --len; } *out = 0; return 1; } tinyssh-20250501/loginshell.h000066400000000000000000000001631500472222400157620ustar00rootroot00000000000000#ifndef LOGINSHELL_H____ #define LOGINSHELL_H____ extern int loginshell(char *, long long, const char *); #endif tinyssh-20250501/logsys.c000066400000000000000000000111051500472222400151330ustar00rootroot00000000000000/* 20140212 20241208 - reformated using clang-format Jan Mojzis Public domain. The 'logsys' library is used to login recording and logout recording in the system using utmp/utmpx ... Portability - HELL !! */ /* tested on: FreeBSD 9.2 OpenBSD 5.3 NetBSD 6.1.2 Linux Debian 7.0 SunOS 5.11 */ #include #include #include #include #include #include "hasutilh.h" #ifdef HASUTILH #include #endif #include "hasutmpx.h" #ifdef HASUTMPX #include #endif #include "hasutmpxupdwtmpx.h" #include "hasutmpxsyslen.h" #include "hasutmpxaddrv6.h" #include "hasutmp.h" #ifdef HASUTMP #include #endif #include "hasutmpname.h" #include "hasutmppid.h" #include "hasutmptime.h" #include "hasutmptv.h" #include "hasutmptype.h" #include "hasutmphost.h" #include "hasutmpuser.h" #include "hasutmplogwtmp.h" #include "hasutmploginlogout.h" #include "hasutmpaddrv6.h" #include "str.h" #include "byte.h" #include "logsys.h" static void logsys_utmpx(const char *user, const char *host, const char *name, long long pid, int flaglogin) { #ifdef HASUTMPX struct timeval tv; struct utmpx ut; byte_zero(&ut, sizeof ut); /* line */ if (!name) name = ttyname(0); if (!name) return; if (str_start(name, "/dev/")) name += 5; str_copyn(ut.ut_line, sizeof ut.ut_line, name); /* host */ if (flaglogin) str_copyn(ut.ut_host, sizeof ut.ut_host, host); else byte_zero(ut.ut_host, sizeof ut.ut_host); #ifdef HASUTMPXSYSLEN ut.ut_syslen = str_len(ut.ut_host) + 1; #endif #ifdef HASUTMPXADDRV6 if (inet_pton(AF_INET6, ut.ut_host, &ut.ut_addr_v6) <= 0) inet_pton(AF_INET, ut.ut_host, &ut.ut_addr_v6[0]); #endif /* user */ if (flaglogin) str_copyn(ut.ut_user, sizeof ut.ut_user, user); else byte_zero(ut.ut_user, sizeof ut.ut_user); gettimeofday(&tv, 0); ut.ut_tv.tv_sec = tv.tv_sec; ut.ut_tv.tv_usec = tv.tv_usec; /* pid */ if (pid == 0) pid = getpid(); ut.ut_pid = pid; /* type */ if (flaglogin) ut.ut_type = USER_PROCESS; else ut.ut_type = DEAD_PROCESS; /* update utmpx */ setutxent(); pututxline(&ut); endutxent(); /* update wtmpx */ #ifdef HASUTMPXUPDWTMPX #if defined(_PATH_WTMPX) updwtmpx(_PATH_WTMPX, &ut); #elif defined(WTMPX_FILE) updwtmpx(WTMPX_FILE, &ut); #endif #endif #else (void) user; (void) host; (void) name; (void) pid; (void) flaglogin; #endif } static void logsys_utmp(const char *user, const char *host, const char *name, long long pid, int flaglogin) { #ifdef HASUTMP struct timeval tv; struct utmp ut; byte_zero(&ut, sizeof ut); /* line */ if (!name) name = ttyname(0); if (!name) return; if (str_start(name, "/dev/")) name += 5; str_copyn(ut.ut_line, sizeof ut.ut_line, name); /* host */ #ifdef HASUTMPHOST str_copyn(ut.ut_host, sizeof ut.ut_host, host); #ifdef HASUTMPADDRV6 if (inet_pton(AF_INET6, ut.ut_host, &ut.ut_addr_v6) <= 0) inet_pton(AF_INET, ut.ut_host, &ut.ut_addr_v6[0]); #endif #endif /* user */ #ifdef HASUTMPNAME str_copyn(ut.ut_name, sizeof ut.ut_name, user); #endif #ifdef HASUTMPUSER str_copyn(ut.ut_user, sizeof ut.ut_user, user); #endif /* time */ gettimeofday(&tv, 0); #ifdef HASUTMPTIME ut.ut_time = tv.tv_sec; #endif #ifdef HASUTMPTV ut.ut_tv.tv_sec = tv.tv_sec; ut.ut_tv.tv_usec = tv.tv_usec; #endif /* pid */ #ifdef HASUTMPPID if (pid == 0) pid = getpid(); ut.ut_pid = pid; #else (void) pid; #endif /* type */ #ifdef HASUTMPTYPE if (flaglogin) ut.ut_type = USER_PROCESS; else ut.ut_type = DEAD_PROCESS; #endif if (flaglogin) { #ifdef HASUTMPLOGINLOGOUT login(&ut); #else setutent(); pututline(&ut); endutent(); #endif } else { #ifdef HASUTMPLOGINLOGOUT logout(ut.ut_line); #else setutent(); pututline(&ut); endutent(); #endif #if defined(HASUTMPLOGWTMP) logwtmp(ut.ut_line, "", ""); #endif } #else (void) user; (void) host; (void) name; (void) pid; (void) flaglogin; #endif } void logsys_login(const char *user, const char *host, const char *name, long long pid) { logsys_utmp(user, host, name, pid, 1); logsys_utmpx(user, host, name, pid, 1); } void logsys_logout(const char *user, const char *host, const char *name, long long pid) { logsys_utmp(user, host, name, pid, 0); logsys_utmpx(user, host, name, pid, 0); } tinyssh-20250501/logsys.h000066400000000000000000000003321500472222400151400ustar00rootroot00000000000000/* Public domain. */ #ifndef LOGSYS_H____ #define LOGSYS_H____ void logsys_login(const char *, const char *, const char *, long long); void logsys_logout(const char *, const char *, const char *, long long); #endif tinyssh-20250501/main.h000066400000000000000000000003061500472222400145450ustar00rootroot00000000000000#ifndef MAIN_H____ #define MAIN_H____ extern int main_tinysshd(int, char **, const char *); extern int main_tinysshd_printkey(int, char **); extern int main_tinysshd_makekey(int, char **); #endif tinyssh-20250501/main_tinysshd.c000066400000000000000000000317111500472222400164710ustar00rootroot00000000000000/* 20140107 Jan Mojzis Public domain. */ #include #include #include #include #include #include "blocking.h" #include "ssh.h" #include "purge.h" #include "open.h" #include "load.h" #include "e.h" #include "byte.h" #include "buf.h" #include "packet.h" #include "channel.h" #include "log.h" #include "sshcrypto.h" #include "subprocess.h" #include "global.h" #include "connectioninfo.h" #include "die.h" #include "str.h" #include "main.h" static unsigned int cryptotypeselected = sshcrypto_TYPENEWCRYPTO | sshcrypto_TYPEPQCRYPTO; static int flagverbose = 1; static int fdwd; static int flaglogger = 0; static const char *customcmd = 0; static int flagnoneauth = 0; static struct buf b1 = {global_bspace1, 0, sizeof global_bspace1}; static struct buf b2 = {global_bspace2, 0, sizeof global_bspace2}; static void timeout(int x) { errno = x = ETIMEDOUT; die_fatal("closing connection", 0, 0); } static int selfpipe[2] = {-1, -1}; static void trigger(int x) { errno = 0; x = write(selfpipe[1], "", 1); (void) x; } int main_tinysshd(int argc, char **argv, const char *binaryname) { char *x; const char *keydir = 0; long long i; struct pollfd p[6]; struct pollfd *q; struct pollfd *watch0; struct pollfd *watch1; struct pollfd *watchtochild; struct pollfd *watchfromchild1; struct pollfd *watchfromchild2; struct pollfd *watchselfpipe; int exitsignal, exitcode; long long binarynamelen = str_len(binaryname); const char *usage; signal(SIGPIPE, SIG_IGN); signal(SIGALRM, timeout); log_init(0, binaryname, 0, 0); if (str_equaln(binaryname, binarynamelen, "tinysshnoneauthd")) { usage = "usage: tinysshnoneauthd [options] keydir"; } else { usage = "usage: tinysshd [options] keydir"; } if (argc < 2) die_usage(usage); if (!argv[0]) die_usage(usage); for (;;) { if (!argv[1]) break; if (argv[1][0] != '-') break; x = *++argv; if (x[0] == '-' && x[1] == 0) break; if (x[0] == '-' && x[1] == '-' && x[2] == 0) break; while (*++x) { if (*x == 'q') { flagverbose = 0; continue; } if (*x == 'Q') { flagverbose = 1; continue; } if (*x == 'v') { ++flagverbose; if (flagverbose >= 4) flagverbose = 4; continue; } if (*x == 'o') { cryptotypeselected |= sshcrypto_TYPEOLDCRYPTO; continue; } if (*x == 'O') { cryptotypeselected &= ~sshcrypto_TYPEOLDCRYPTO; continue; } if (*x == 's') { cryptotypeselected |= sshcrypto_TYPENEWCRYPTO; continue; } if (*x == 'S') { cryptotypeselected &= ~sshcrypto_TYPENEWCRYPTO; continue; } if (*x == 'p') { cryptotypeselected |= sshcrypto_TYPEPQCRYPTO; continue; } if (*x == 'P') { cryptotypeselected &= ~sshcrypto_TYPEPQCRYPTO; continue; } if (*x == 'l') { flaglogger = 1; continue; } if (*x == 'L') { flaglogger = 0; continue; } if (*x == 'x') { if (x[1]) { channel_subsystem_add(x + 1); break; } if (argv[1]) { channel_subsystem_add(*++argv); break; } } if (*x == 'e') { if (x[1]) { customcmd = x + 1; break; } if (argv[1]) { customcmd = *++argv; break; } } die_usage(usage); } } keydir = *++argv; if (!keydir) die_usage(usage); log_init(flagverbose, binaryname, 1, flaglogger); if (str_equaln(binaryname, binarynamelen, "tinysshnoneauthd")) { if (!customcmd) die_fatal("rejecting to run without -e customprogram", 0, 0); if (geteuid() == 0) die_fatal("rejecting to run under UID=0", 0, 0); flagnoneauth = 1; } connectioninfo(channel.localip, channel.localport, channel.remoteip, channel.remoteport); log_i4("connection from ", channel.remoteip, ":", channel.remoteport); channel_subsystem_log(); global_init(); blocking_disable(0); blocking_disable(1); blocking_disable(2); /* get server longterm keys */ fdwd = open_cwd(); if (fdwd == -1) die_fatal("unable to open current directory", 0, 0); if (chdir(keydir) == -1) die_fatal("unable to chdir to", keydir, 0); for (i = 0; sshcrypto_keys[i].name; ++i) sshcrypto_keys[i].sign_flagserver |= sshcrypto_keys[i].cryptotype & cryptotypeselected; for (i = 0; sshcrypto_keys[i].name; ++i) sshcrypto_keys[i].sign_flagclient |= sshcrypto_keys[i].cryptotype & cryptotypeselected; for (i = 0; sshcrypto_kexs[i].name; ++i) sshcrypto_kexs[i].flagenabled |= sshcrypto_kexs[i].cryptotype & cryptotypeselected; for (i = 0; sshcrypto_ciphers[i].name; ++i) sshcrypto_ciphers[i].flagenabled |= sshcrypto_ciphers[i].cryptotype & cryptotypeselected; /* read public keys */ for (i = 0; sshcrypto_keys[i].name; ++i) { if (!sshcrypto_keys[i].sign_flagserver) continue; if (load(sshcrypto_keys[i].sign_publickeyfilename, sshcrypto_keys[i].sign_publickey, sshcrypto_keys[i].sign_publickeybytes) == -1) { sshcrypto_keys[i].sign_flagserver = 0; if (errno == ENOENT) continue; die_fatal("unable to read public key from file", keydir, sshcrypto_keys[i].sign_publickeyfilename); } } if (fchdir(fdwd) == -1) die_fatal("unable to change directory to working directory", 0, 0); close(fdwd); /* set timeout */ alarm(60); /* send and receive hello */ if (!packet_hello_send()) die_fatal("unable to send hello-string", 0, 0); if (!packet_hello_receive()) die_fatal("unable to receive hello-string", 0, 0); /* send and receive kex */ if (!packet_kex_send()) die_fatal("unable to send kex-message", 0, 0); if (!packet_kex_receive()) die_fatal("unable to receive kex-message", 0, 0); rekeying: /* rekeying */ alarm(60); if (packet.flagrekeying == 1) { buf_purge(&packet.kexrecv); buf_put(&packet.kexrecv, b1.buf, b1.len); if (!packet_kex_send()) die_fatal("unable to send kex-message", 0, 0); } /* send and receive kexdh */ if (!packet_kexdh(keydir, &b1, &b2)) die_fatal("unable to process kexdh", 0, 0); if (packet.flagkeys) log_d1("rekeying: done"); packet.flagkeys = 1; /* note: communication is encrypted */ /* authentication + authorization */ if (packet.flagauthorized == 0) { if (!packet_auth(&b1, &b2, flagnoneauth)) die_fatal("authentication failed", 0, 0); packet.flagauthorized = 1; } /* note: user is authenticated and authorized */ alarm(3600); /* main loop */ for (;;) { if (channel_iseof()) if (!packet.sendbuf.len) if (packet.flagchanneleofreceived) break; watch0 = watch1 = 0; watchtochild = watchfromchild1 = watchfromchild2 = 0; watchselfpipe = 0; q = p; if (packet_sendisready()) { watch1 = q; q->fd = 1; q->events = POLLOUT; ++q; } if (packet_recvisready()) { watch0 = q; q->fd = 0; q->events = POLLIN; ++q; } if (channel_writeisready()) { watchtochild = q; q->fd = channel_getfd0(); q->events = POLLOUT; ++q; } if (channel_readisready() && packet_putisready()) { watchfromchild1 = q; q->fd = channel_getfd1(); q->events = POLLIN; ++q; } if (channel_extendedreadisready() && packet_putisready()) { watchfromchild2 = q; q->fd = channel_getfd2(); q->events = POLLIN; ++q; } if (selfpipe[0] != -1) { watchselfpipe = q; q->fd = selfpipe[0]; q->events = POLLIN; ++q; } if (poll(p, q - p, 60000) < 0) { watch0 = watch1 = 0; watchtochild = watchfromchild1 = watchfromchild2 = 0; watchselfpipe = 0; } else { if (watch0) if (!watch0->revents) watch0 = 0; if (watch1) if (!watch1->revents) watch1 = 0; if (watchfromchild1) if (!watchfromchild1->revents) watchfromchild1 = 0; if (watchfromchild2) if (!watchfromchild2->revents) watchfromchild2 = 0; if (watchtochild) if (!watchtochild->revents) watchtochild = 0; if (watchselfpipe) if (!watchselfpipe->revents) watchselfpipe = 0; } if (watchtochild) { /* write data to child */ if (!channel_write()) die_fatal("unable to write data to child", 0, 0); /* try to adjust window */ if (!packet_channel_send_windowadjust(&b1)) die_fatal("unable to send data to network", 0, 0); } /* read data from child */ if (watchfromchild1) packet_channel_send_data(&b2); if (watchfromchild2) packet_channel_send_extendeddata(&b2); /* check child */ if (channel_iseof()) { if (selfpipe[0] == -1) if (open_pipe(selfpipe) == -1) die_fatal("unable to open pipe", 0, 0); signal(SIGCHLD, trigger); if (channel_waitnohang(&exitsignal, &exitcode)) { packet_channel_send_eof(&b2); if (!packet_channel_send_close(&b2, exitsignal, exitcode)) die_fatal("unable to close channel", 0, 0); } } /* send data to network */ if (watch1) if (!packet_send()) die_fatal("unable to send data to network", 0, 0); /* receive data from network */ if (watch0) { alarm(3600); /* refresh timeout */ if (!packet_recv()) { if (channel_iseof()) break; /* XXX */ die_fatal("unable to receive data from network", 0, 0); } } /* process packets */ for (;;) { if (!packet_get(&b1, 0)) { if (!errno) break; die_fatal("unable to get packets from network", 0, 0); } if (b1.len < 1) break; /* XXX */ switch (b1.buf[0]) { case SSH_MSG_CHANNEL_OPEN: if (!packet_channel_open(&b1, &b2)) die_fatal("unable to open channel", 0, 0); break; case SSH_MSG_CHANNEL_REQUEST: if (!packet_channel_request(&b1, &b2, customcmd)) die_fatal("unable to handle channel-request", 0, 0); break; case SSH_MSG_CHANNEL_DATA: if (!packet_channel_recv_data(&b1)) die_fatal("unable to handle channel-data", 0, 0); break; case SSH_MSG_CHANNEL_EXTENDED_DATA: if (!packet_channel_recv_extendeddata(&b1)) die_fatal("unable to handle channel-extended-data", 0, 0); break; case SSH_MSG_CHANNEL_WINDOW_ADJUST: if (!packet_channel_recv_windowadjust(&b1)) die_fatal("unable to handle channel-window-adjust", 0, 0); break; case SSH_MSG_CHANNEL_EOF: if (!packet_channel_recv_eof(&b1)) die_fatal("unable to handle channel-eof", 0, 0); break; case SSH_MSG_CHANNEL_CLOSE: if (!packet_channel_recv_close(&b1)) die_fatal("unable to handle channel-close", 0, 0); break; case SSH_MSG_KEXINIT: goto rekeying; default: if (!packet_unimplemented(&b1)) die_fatal( "unable to send SSH_MSG_UNIMPLEMENTED message", 0, 0); } } } log_i1("finished"); global_die(0); return 111; } tinyssh-20250501/main_tinysshd_makekey.c000066400000000000000000000040451500472222400201770ustar00rootroot00000000000000/* 20121022 20241212 - reformated using clang-format Jan Mojzis Public domain. */ #include #include #include #include "savesync.h" #include "log.h" #include "sshcrypto.h" #include "global.h" #include "die.h" #include "main.h" #define sk global_bspace1 /* reusing global buffer */ #define pk global_bspace2 /* reusing global buffer */ #define USAGE "usage: tinysshd-makekey keydir" static void create(const char *d, const char *fn, const unsigned char *x, long long xlen) { if (savesync(fn, x, xlen) == -1) die_fatal("unable to create", d, fn); } static int flagverbose = 1; int main_tinysshd_makekey(int argc, char **argv) { char *x; long long i; log_init(flagverbose, "tinysshd-makekey", 0, 0); if (argc < 2) die_usage(USAGE); if (!argv[0]) die_usage(USAGE); for (;;) { if (!argv[1]) break; if (argv[1][0] != '-') break; x = *++argv; if (x[0] == '-' && x[1] == 0) break; if (x[0] == '-' && x[1] == '-' && x[2] == 0) break; while (*++x) { if (*x == 'q') { flagverbose = 0; continue; } if (*x == 'Q') { flagverbose = 1; continue; } die_usage(USAGE); } } x = *++argv; if (!x) die_usage(USAGE); log_init(flagverbose, "tinysshd-makekey", 0, 0); umask(022); if (mkdir(x, 0755) == -1) die_fatal("unable to create directory", x, 0); if (chdir(x) == -1) die_fatal("unable to chdir to directory", x, 0); for (i = 0; sshcrypto_keys[i].name; ++i) { if (sshcrypto_keys[i].sign_keypair(pk, sk) != 0) die_fatal("unable to generate key pair", x, 0); umask(022); create(x, sshcrypto_keys[i].sign_publickeyfilename, pk, sshcrypto_keys[i].sign_publickeybytes); umask(077); create(x, sshcrypto_keys[i].sign_secretkeyfilename, sk, sshcrypto_keys[i].sign_secretkeybytes); } global_die(0); return 111; } tinyssh-20250501/main_tinysshd_printkey.c000066400000000000000000000040471500472222400204200ustar00rootroot00000000000000/* 20150124 20241212 - reformated using clang-format Jan Mojzis Public domain. */ #include #include "e.h" #include "load.h" #include "sshcrypto.h" #include "crypto.h" #include "global.h" #include "buf.h" #include "log.h" #include "writeall.h" #include "die.h" #include "main.h" static struct buf b1 = {global_bspace1, 0, sizeof global_bspace1}; /* reusing global buffer */ static struct buf b2 = {global_bspace2, 0, sizeof global_bspace2}; /* reusing global buffer */ static unsigned char pk[sshcrypto_sign_PUBLICKEYMAX]; #define USAGE "usage: tinysshd-printkey keydir" int main_tinysshd_printkey(int argc, char **argv) { char *x; long long i; log_init(3, "tinysshd-printkey", 0, 0); if (argc < 2) die_usage(USAGE); if (!argv[0]) die_usage(USAGE); for (;;) { if (!argv[1]) break; if (argv[1][0] != '-') break; x = *++argv; if (x[0] == '-' && x[1] == 0) break; if (x[0] == '-' && x[1] == '-' && x[2] == 0) break; while (*++x) { die_usage(USAGE); } } x = *++argv; if (!x) die_usage(USAGE); if (chdir(x) == -1) die_fatal("unable to chdir to directory", x, 0); /* read public keys */ for (i = 0; sshcrypto_keys[i].name; ++i) { if (load(sshcrypto_keys[i].sign_publickeyfilename, pk, sshcrypto_keys[i].sign_publickeybytes) == -1) { if (errno == ENOENT) continue; die_fatal("unable to read public key from file", x, sshcrypto_keys[i].sign_publickeyfilename); } buf_purge(&b1); sshcrypto_keys[i].buf_putsignpk(&b1, pk); if (b1.len < 4) die_fatal("unable to get publickey", 0, 0); /* base64 */ buf_purge(&b2); buf_puts(&b2, sshcrypto_keys[i].name); buf_puts(&b2, " "); buf_putbase64(&b2, b1.buf + 4, b1.len - 4); buf_puts(&b2, "\n"); if (writeall(1, b2.buf, b2.len) == -1) die_fatal("unable to write output", 0, 0); } global_die(0); return 111; } tinyssh-20250501/makefilegen.sh000066400000000000000000000126451500472222400162640ustar00rootroot00000000000000#!/bin/sh LANG=C export LANG ( ( echo "CC?=cc" echo "CFLAGS+=-W -Wall -Os -fPIC -fwrapv -Icryptoint" echo "LDFLAGS?=" echo "CPPFLAGS?=" echo echo "DESTDIR?=" echo "PREFIX?=/usr/local" echo echo "INSTALL?=install" echo links='tinysshd-makekey tinysshd-printkey tinysshnoneauthd' autoheaders='' binaries='' testcryptobinaries='' objlib='' objall='' outfiles='' for file in `ls -1`; do ofile=`echo ${file} | sed 's/\.c$/.o/'` hfile=`echo ${file} | sed 's/\.c$/.h/'` case "${file}" in randombytes\.c) objall="${objall} ${ofile}" ;; has*\.c) autoheaders="${autoheaders} `echo ${file} | sed 's/\.c/.h/'`" ;; test-*\.sh) outfiles="${outfiles} `echo ${file} | sed 's/\.sh/.out/'`" ;; test-crypto.c) if grep '^int main(' "${file}" >/dev/null; then testcryptobinaries="${testcryptobinaries} `echo ${file} | sed 's/\.c$//'`" fi objall="${objall} ${ofile}" ;; *\.c) if grep '^int main(' "${file}" >/dev/null; then binaries="${binaries} `echo ${file} | sed 's/\.c$//'`" else objlib="${objlib} ${ofile}" fi objall="${objall} ${ofile}" ;; *) ;; esac done echo "LINKS=${links}" echo echo "`echo BINARIES=${binaries} | fold -s | sed 's/^/ /' | sed 's/^ BINARIES= /BINARIES=/' | sed 's/ $/ \\\\/'`" echo echo "`echo TESTCRYPTOBINARIES=${testcryptobinaries} | fold -s | sed 's/^/ /' | sed 's/^ TESTCRYPTOBINARIES= /TESTCRYPTOBINARIES=/' | sed 's/ $/ \\\\/'`" echo echo "`echo OBJLIB=${objlib} | fold -s | sed 's/^/ /' | sed 's/^ OBJLIB= /OBJLIB=/' | sed 's/ $/ \\\\/'`" echo echo "`echo OBJALL=${objall} | fold -s | sed 's/^/ /' | sed 's/^ OBJALL= /OBJALL=/' | sed 's/ $/ \\\\/'`" echo echo "`echo AUTOHEADERS=${autoheaders} | fold -s | sed 's/^/ /' | sed 's/^ AUTOHEADERS= /AUTOHEADERS=/' | sed 's/ $/ \\\\/'`" echo echo "`echo TESTOUT=${outfiles} | fold -s | sed 's/^/ /' | sed 's/^ TESTOUT= /TESTOUT=/' | sed 's/ $/ \\\\/'`" echo echo "all: \$(AUTOHEADERS) \$(BINARIES) \$(LINKS)" echo touch ${autoheaders} for ofile in ${objall}; do ( cfile=`echo ${ofile} | sed 's/\.o/.c/'` gcc -MM -Icryptoint "${cfile}" echo " \$(CC) \$(CFLAGS) \$(CPPFLAGS) -c ${cfile}" echo ) done rm -f ${autoheaders} for file in ${binaries}; do ofile="${file}.o" echo "${file}: ${ofile} \$(OBJLIB) randombytes.o libs" echo " \$(CC) \$(CFLAGS) \$(CPPFLAGS) -o ${file} ${ofile} \\" echo " \$(OBJLIB) \$(LDFLAGS) \`cat libs\`" randombytes.o echo done echo for file in ${testcryptobinaries}; do ofile="${file}.o" echo "${file}: ${ofile} \$(OBJLIB) libs" echo " \$(CC) \$(CFLAGS) \$(CPPFLAGS) -o ${file} ${ofile} \\" echo " \$(OBJLIB) \$(LDFLAGS) \`cat libs\`" echo done echo for hfile in ${autoheaders}; do cfile=`echo ${hfile} | sed 's/\.h/.c/'` lfile=`echo ${cfile} | sed 's/\.c/.log/'` touch "${hfile}" echo "${hfile}: tryfeature.sh ${cfile} libs" echo " env CC=\"\$(CC)\" CFLAGS=\"\$(CFLAGS)\" LDFLAGS=\"\$(LDFLAGS) \`cat libs\`\" \\" echo " ./tryfeature.sh ${cfile} >${hfile} 2>${lfile}" echo " cat ${hfile}" echo done for outfile in ${outfiles}; do expfile=`echo ${outfile} | sed 's/\.out/.exp/'` shfile=`echo ${outfile} | sed 's/\.out/.sh/'` echo "${outfile}: \$(BINARIES) \$(TESTCRYPTOBINARIES) \$(LINKS) runtest.sh ${shfile} ${expfile}" echo " sh runtest.sh ${shfile} ${outfile} ${expfile}" echo done echo "test: \$(TESTOUT)" echo echo "libs: trylibs.sh" echo " env CC=\"\$(CC)\" ./trylibs.sh -lsocket -lnsl -lutil -lrandombytes -l25519 -l1305 -lntruprime >libs 2>libs.log" echo " cat libs" echo echo "tinysshd-makekey: tinysshd" echo " rm -f tinysshd-makekey" echo " ln -s tinysshd tinysshd-makekey" echo echo "tinysshd-printkey: tinysshd" echo " rm -f tinysshd-printkey" echo " ln -s tinysshd tinysshd-printkey" echo echo "tinysshnoneauthd: tinysshd" echo " rm -f tinysshnoneauthd" echo " ln -s tinysshd tinysshnoneauthd" echo echo "install: \$(BINARIES) \$(LINKS)" echo " mkdir -p \$(DESTDIR)\$(PREFIX)/sbin" echo " mkdir -p \$(DESTDIR)\$(PREFIX)/share/man/man8" echo " \$(INSTALL) -m 0755 tinysshd \$(DESTDIR)\$(PREFIX)/sbin/tinysshd" echo " \$(INSTALL) -m 0755 tinysshd-makekey \$(DESTDIR)\$(PREFIX)/sbin/tinysshd-makekey" echo " \$(INSTALL) -m 0755 tinysshd-printkey \$(DESTDIR)\$(PREFIX)/sbin/tinysshd-printkey" echo " \$(INSTALL) -m 0755 tinysshnoneauthd \$(DESTDIR)\$(PREFIX)/sbin/tinysshnoneauthd" echo " \$(INSTALL) -m 0644 man/tinysshd.8 \$(DESTDIR)\$(PREFIX)/share/man/man8/tinysshd.8" echo " \$(INSTALL) -m 0644 man/tinysshd-makekey.8 \$(DESTDIR)\$(PREFIX)/share/man/man8/tinysshd-makekey.8" echo " \$(INSTALL) -m 0644 man/tinysshd-printkey.8 \$(DESTDIR)\$(PREFIX)/share/man/man8/tinysshd-printkey.8" echo " \$(INSTALL) -m 0644 man/tinysshnoneauthd.8 \$(DESTDIR)\$(PREFIX)/share/man/man8/tinysshnoneauthd.8" echo echo "clean:" echo " rm -f *.log libs \$(OBJLIB) \$(OBJALL) \$(BINARIES) \$(TESTCRYPTOBINARIES) \$(LINKS) \$(AUTOHEADERS) \$(TESTOUT)" echo ) > Makefile ) tinyssh-20250501/man/000077500000000000000000000000001500472222400142245ustar00rootroot00000000000000tinyssh-20250501/man/tinysshd-makekey.8000066400000000000000000000010631500472222400176060ustar00rootroot00000000000000.TH tinysshd\-makekey 8 .SH NAME tinysshd\-makekey \- create TinySSH key\-directory .SH SYNOPSIS .B tinysshd\-makekey [ options ] .I keydir .SH DESCRIPTION .B tinysshd\-makekey safely creates secret\-keys and appropriate public\-keys in directory .I keydir .SH OPTIONS .TP .B \-q no error messages .TP .B \-Q print error messages (default) .TP .TP .I keydir directory for TinySSH keys, typically /etc/tinyssh/sshkeydir .SH EXAMPLE tinysshd\-makekey /etc/tinyssh/sshkeydir .SH SEE ALSO .BR tinysshd (8), .BR tinysshd\-printkey (8) .sp .nf https://tinyssh.org/ .fi tinyssh-20250501/man/tinysshd-printkey.8000066400000000000000000000007011500472222400200230ustar00rootroot00000000000000.TH tinysshd\-printkey 8 .SH NAME tinysshd\-printkey \- print TinySSH public\-keys .SH SYNOPSIS .B tinysshd\-printkey .I keydir .SH DESCRIPTION .B tinysshd\-printkey prints TinySSH public\-keys in base64 format .SH OPTIONS .TP .I keydir directory containing TinySSH keys, typically /etc/tinyssh/sshkeydir .SH EXAMPLE tinysshd\-printkey /etc/tinyssh/sshkeydir .SH SEE ALSO .BR tinysshd (8), .BR tinysshd\-makekey (8) .sp .nf https://tinyssh.org/ .fi tinyssh-20250501/man/tinysshd.8000066400000000000000000000062501500472222400161650ustar00rootroot00000000000000.TH tinysshd 8 .SH NAME tinysshd \- Tiny SSH daemon .SH SYNOPSIS .B tinysshd [ options ] .I keydir .SH DESCRIPTION .B tinysshd is a minimalistic SSH server which implements only a subset of SSHv2 features. .sp .B tinysshd supports only secure cryptography (minimum 128\-bit security, protected against cache\-timing attacks) .sp .B tinysshd doesn't implement older crypto (such as RSA, DSA, HMAC\-MD5, HMAC\-SHA1, 3DES, RC4, ...) .sp .B tinysshd doesn't implement unsafe features (such as password or hostbased authentication) .sp .B tinysshd doesn't have features such: SSH1 protocol, compression, port forwarding, agent forwarding, X11 forwarding ... .sp .B tinysshd doesn't use dynamic memory allocation (no allocation failures, etc.) .SH OPTIONS .TP .B \-q no error messages .TP .B \-Q print error messages (default) .TP .B \-v print extra information .TP .B \-s enable state\-of\-the\-art crypto (default) .sp signing \- ssh\-ed25519 .sp key-exchange \- curve25519\-sha256 .sp symmetric \- chacha20\-poly1305@openssh.com .TP .B \-S disable state\-of\-the\-art crypto .TP .B \-p enable post\-quantum crypto (default) .sp signing \- TODO (not implemented yet) .sp key-exchange \- sntrup761x25519\-sha512@openssh.com .sp symmetric \- chacha20\-poly1305@openssh.com .TP .B \-P disable post\-quantum crypto .TP .B \-l use syslog instead of standard error output (useful for running from inetd) .TP .B \-L don't use syslog, use standard error output (default) .TP .B \-x \fIname=command add subsystem command (e.g.: sftp=/usr/libexec/openssh/sftp\-server) .TP .B \-e \fIcommand execute the given command instead of spawning the shell (disables \fIexec\fR/\fIsubsystem\fR channel requests) .TP .I keydir directory containing TinySSH keys, typically /etc/tinyssh/sshkeydir .SH AUTHORIZATION .B tinysshd supports only public-key authorization via .B AuthorizedKeysFile ~/.ssh/authorized_keys. Each line of the file contains one key in format "keytype base64-encoded-key comment". .B tinyssh supports only "ssh-ed25519" keytype. .sp ~/.ssh/authorized_keys example: .nf .RS 2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILV5AGhGQ1QVXjBWhTKJP3vrqE3isL4ivisBailQ14gS comment .RE .SH RUNNING .TP .B TCPSERVER tcpserver \-HRDl0 0.0.0.0 22 /usr/sbin/tinysshd \-v /etc/tinyssh/sshkeydir & .TP .B BUSYBOX busybox tcpsvd 0 22 tinysshd \-v /etc/tinyssh/sshkeydir & .TP .B INETD .RS 4 /etc/inetd.conf: .RS 4 ssh stream tcp nowait root /usr/sbin/tinysshd tinysshd \-l \-v /etc/tinyssh/sshkeydir .RE .RE .TP .B SYSTEMD .RS 4 tinysshd.socket: .RS 4 .nf [Unit] Description=TinySSH server socket ConditionPathExists=!/etc/tinyssh/disable_tinysshd [Socket] ListenStream=22 Accept=yes [Install] WantedBy=sockets.target .fi .RE .RE .sp .RS 4 tinysshd@.service: .RS 4 .nf [Unit] Description=Tiny SSH server After=network.target auditd.service [Service] ExecStartPre=\-/usr/sbin/tinysshd\-makekey \-q /etc/tinyssh/sshkeydir EnvironmentFile=\-/etc/default/tinysshd ExecStart=/usr/sbin/tinysshd ${TINYSSHDOPTS} \-\- /etc/tinyssh/sshkeydir KillMode=process SuccessExitStatus=111 StandardInput=socket StandardError=journal [Install] WantedBy=multi\-user.target .fi .RE .RE .SH SEE ALSO .BR tinysshd\-makekey (8), .BR tinysshd\-printkey (8) .sp .nf https://tinyssh.org/ .fi tinyssh-20250501/man/tinysshnoneauthd.8000066400000000000000000000023331500472222400177250ustar00rootroot00000000000000.TH tinysshnoneauthd 8 .SH NAME tinysshnoneauthd \- Tiny SSH daemon with 'none' auth. enabled .SH SYNOPSIS .B tinysshnoneauthd [ options ] .I keydir .SH DESCRIPTION .B tinysshnoneauthd creates encrypted (but not auhenticated) SSH connection. It's used to protect older protocols which uses e.g. telnet etc. .SH OPTIONS .TP .B \-q no error messages .TP .B \-Q print error messages (default) .TP .B \-v print extra information .TP .B \-l use syslog instead of standard error output (useful for running from inetd) .TP .B \-L don't use syslog, use standard error output (default) .TP .B \-e \fIcommand execute the given command instead of spawning the shell (disables \fIexec\fR/\fIsubsystem\fR channel requests) .TP .I keydir directory containing TinySSH keys, typically /etc/tinyssh/sshkeydir .SH EXAMPLES .TP .B TCPSERVER .nf useradd tinysshnoneauth mkdir -p /home/tinysshnoneauth/ tinysshd-makekey /home/tinysshnoneauth/sshkeydir chown -R tinysshnoneauth /home/tinysshnoneauth/sshkeydir envuidgid tinysshnoneauth tcpserver -UHRDl0 0 2222 /usr/sbin/tinysshnoneauthd -vv -e 'cat /etc/motd' /home/tinysshnoneauth/sshkeydir .fi .SH SEE ALSO .BR tinysshd (8), .BR tinysshd\-makekey (8), .BR tinysshd\-printkey (8) .sp .nf https://tinyssh.org/ .fi tinyssh-20250501/newenv.c000066400000000000000000000045531500472222400151260ustar00rootroot00000000000000/* 20140215 20241208 - reformated using clang-format Jan Mojzis Public domain. The 'newenv' library is used to execute process in completely new environment. */ #include #include "e.h" #include "byte.h" #include "str.h" #include "purge.h" #include "bug.h" #include "env.h" #include "trymlock.h" #include "newenv.h" #define NEWENV_LEN 128 #define NEWENV_SPACE 2048 static struct newenv { char *e[NEWENV_LEN]; long long elen; char es[NEWENV_SPACE]; long long eslen; } n = {{0}, 0, {0}, 0}; /* Remove sentitive data from allocated memory. */ void newenv_purge(void) { purge(&n, sizeof n); n.elen = NEWENV_LEN; n.eslen = NEWENV_SPACE; trymunlock(&n, sizeof n); } /* Initialize newenv structure. */ void newenv_init(void) { trymlock(&n, sizeof n); purge(&n, sizeof n); n.e[0] = 0; n.elen = n.eslen = 0; } /* The 'newenv_env/newenv_lowenv' function adds the variable into new environment. The newenv_lowenv is limited to a half of the buffer-space. */ int newenv_env_(int x, const char *s, const char *t) { long long slen, tlen, len, i; if (!x || !s || !t) bug_inval(); if (n.elen < 0) bug_inval(); if (n.eslen < 0) bug_inval(); slen = str_len(s); tlen = str_len(t); len = slen + tlen + 2; if (!n.elen) newenv_init(); for (i = 0; n.e[i]; ++i) { if (str_start(n.e[i], s) && (n.e[i][slen] == '=')) { n.e[i] = n.e[--n.elen]; break; } } if (n.elen + 2 > NEWENV_LEN / x) { errno = ENOMEM; return 0; } if (n.eslen + len > NEWENV_SPACE / x) { errno = ENOMEM; return 0; } byte_copy(n.es + n.eslen, slen, s); n.eslen += slen; n.es[n.eslen++] = '='; byte_copy(n.es + n.eslen, tlen, t); n.eslen += tlen; n.es[n.eslen++] = 0; n.e[n.elen++] = n.es + n.eslen - len; n.e[n.elen] = 0; return 1; } /* The 'newenv_copyenv' function copies the variable from current environment into new environment. */ int newenv_copyenv(const char *s) { char *t; if (!s) bug_inval(); t = env_get(s); if (!t) { errno = ENOENT; return 0; } return newenv_env_(1, s, t); } /* The 'newenv_exec' function executes the command in new environment. */ void newenv_exec(char *filename, char **argv) { if (!argv || !filename) bug_inval(); execve(filename, argv, n.e); } tinyssh-20250501/newenv.h000066400000000000000000000005461500472222400151310ustar00rootroot00000000000000#ifndef NEWENV_H____ #define NEWENV_H____ extern int newenv_env_(int, const char *, const char *); #define newenv_env(x, y) newenv_env_(1, (x), (y)) #define newenv_lowenv(x, y) newenv_env_(2, (x), (y)) extern int newenv_copyenv(const char *); extern void newenv_exec(char *, char **); extern void newenv_init(void); extern void newenv_purge(void); #endif tinyssh-20250501/numtostr.c000066400000000000000000000017011500472222400155070ustar00rootroot00000000000000/* 20130604 20241208 - reformated using clang-format Jan Mojzis Public domain. */ #include "numtostr.h" /* The 'numtostr(strbuf,n)' converts number 'n' into the 0-terminated string. The caller must allocate at least NUMTOSTR_LEN bytes for 'strbuf'. The 'numtostr' function is ready for 128-bit integer. */ char *numtostr(char *strbuf, long long n) { long long len = 0; unsigned long long n1, n2; static char staticbuf[NUMTOSTR_LEN]; int flagsign = 0; if (!strbuf) strbuf = staticbuf; /* not thread-safe */ if (n < 0) { n1 = n2 = -(unsigned long long) n; flagsign = 1; } else { n1 = n2 = (unsigned long long) n; } do { n1 /= 10; ++len; } while (n1); if (flagsign) ++len; strbuf += len; do { *--strbuf = '0' + (n2 % 10); n2 /= 10; } while (n2); if (flagsign) *--strbuf = '-'; while (len < NUMTOSTR_LEN) strbuf[len++] = 0; return strbuf; } tinyssh-20250501/numtostr.h000066400000000000000000000001721500472222400155150ustar00rootroot00000000000000#ifndef NUMTOSTR_H____ #define NUMTOSTR_H____ #define NUMTOSTR_LEN 41 extern char *numtostr(char *, long long); #endif tinyssh-20250501/old/000077500000000000000000000000001500472222400142275ustar00rootroot00000000000000tinyssh-20250501/old/INSTALL000066400000000000000000000000451500472222400152570ustar00rootroot00000000000000See https://tinyssh.org/install.html tinyssh-20250501/old/LICENCE000077700000000000000000000000001500472222400164072../LICENCEustar00rootroot00000000000000tinyssh-20250501/old/Makefile000066400000000000000000000003301500472222400156630ustar00rootroot00000000000000compile: make-tinyssh.sh sh -e make-tinyssh.sh cross-compile: make-tinysshcc.sh sh -e make-tinysshcc.sh clean: rm -rf build install: sh -e make-install.sh $(DESTDIR) deb: dpkg-buildpackage -b -rfakeroot -us -uc tinyssh-20250501/old/README.md000077700000000000000000000000001500472222400171732../README.mdustar00rootroot00000000000000tinyssh-20250501/old/_tinyssh/000077500000000000000000000000001500472222400160675ustar00rootroot00000000000000tinyssh-20250501/old/_tinyssh/_TARGETS000066400000000000000000000002211500472222400172550ustar00rootroot00000000000000_tinysshd-printkex _tinysshd-unauthenticated _tinysshd-test-hello1 _tinysshd-test-hello2 _tinysshd-test-kex1 _tinysshd-test-kex2 _tinysshd-speed tinyssh-20250501/old/_tinyssh/_tinysshd-printkex.c000077700000000000000000000000001500472222400265342../../_tinysshd-printkex.custar00rootroot00000000000000tinyssh-20250501/old/_tinyssh/_tinysshd-speed.c000077700000000000000000000000001500472222400252242../../_tinysshd-speed.custar00rootroot00000000000000tinyssh-20250501/old/_tinyssh/_tinysshd-test-hello1.c000077700000000000000000000000001500472222400273262../../_tinysshd-test-hello1.custar00rootroot00000000000000tinyssh-20250501/old/_tinyssh/_tinysshd-test-hello2.c000077700000000000000000000000001500472222400273302../../_tinysshd-test-hello2.custar00rootroot00000000000000tinyssh-20250501/old/_tinyssh/_tinysshd-test-kex1.c000077700000000000000000000000001500472222400264762../../_tinysshd-test-kex1.custar00rootroot00000000000000tinyssh-20250501/old/_tinyssh/_tinysshd-test-kex2.c000077700000000000000000000000001500472222400265002../../_tinysshd-test-kex2.custar00rootroot00000000000000tinyssh-20250501/old/_tinyssh/_tinysshd-unauthenticated.c000077700000000000000000000000001500472222400313762../../_tinysshd-unauthenticated.custar00rootroot00000000000000tinyssh-20250501/old/conf-ar000066400000000000000000000000031500472222400154700ustar00rootroot00000000000000ar tinyssh-20250501/old/conf-bin000066400000000000000000000000121500472222400156360ustar00rootroot00000000000000/usr/sbin tinyssh-20250501/old/conf-cc000066400000000000000000000000151500472222400154560ustar00rootroot00000000000000cc gcc clang tinyssh-20250501/old/conf-cflags000066400000000000000000000005131500472222400163330ustar00rootroot00000000000000-pedantic -Wall -Wno-long-long -Wno-overlength-strings -Wno-unused-function -Wshadow -Wdeclaration-after-statement -Wwrite-strings -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wunused-value -Wunused-parameter -Wundef -fstack-protector-strong -fwrapv -fno-strict-overflow -Os -fomit-frame-pointer -funroll-loops tinyssh-20250501/old/conf-libs000066400000000000000000000000261500472222400160240ustar00rootroot00000000000000-lutil -lsocket -lnsl tinyssh-20250501/old/conf-man000066400000000000000000000000171500472222400156460ustar00rootroot00000000000000/usr/share/man tinyssh-20250501/old/crypto-tests/000077500000000000000000000000001500472222400167075ustar00rootroot00000000000000tinyssh-20250501/old/crypto-tests/crypto_dh_x25519test.c000066400000000000000000000000671500472222400227060ustar00rootroot00000000000000#include int main(void) { _exit(0); } tinyssh-20250501/old/crypto-tests/crypto_hash_sha256test.c000066400000000000000000000016401500472222400233670ustar00rootroot00000000000000/* 20141018 Jan Mojzis Public domain. */ #include "misc.h" #include "crypto_hash_sha256.h" #define SPACESIZE 5232 static unsigned char space[SPACESIZE + 16]; static unsigned char buf[crypto_hash_sha256_BYTES + 16]; static unsigned char test_pseudorandom_checksum[32] = { 0xbd, 0x62, 0xb1, 0x24, 0x12, 0xce, 0xc2, 0xd6, 0xc9, 0x81, 0x29, 0x7f, 0x83, 0x8a, 0xe5, 0x19, 0xfd, 0xd7, 0x26, 0x4f, 0x13, 0x7e, 0xd5, 0x18, 0x40, 0x53, 0x76, 0x16, 0xe4, 0x22, 0x48, 0x50 }; static void test_pseudorandom(void) { long long i, j; checksum_zero(); i = 0; for (j = 0; j < SPACESIZE; j += 1 + j / 16) { pseudorandombytes(space + i, j); crypto_hash_sha256(buf + i, space + i, j); checksum(buf + i, crypto_hash_sha256_BYTES); ++i; i %= 16; } fail_whenbadchecksum(test_pseudorandom_checksum); } int main(void) { test_pseudorandom(); _exit(0); } tinyssh-20250501/old/crypto-tests/crypto_hash_sha512test.c000066400000000000000000000016401500472222400233620ustar00rootroot00000000000000/* 20141018 Jan Mojzis Public domain. */ #include "misc.h" #include "crypto_hash_sha512.h" #define SPACESIZE 5232 static unsigned char space[SPACESIZE + 16]; static unsigned char buf[crypto_hash_sha512_BYTES + 16]; static unsigned char test_pseudorandom_checksum[32] = { 0xa1, 0x57, 0x2f, 0x67, 0x19, 0xa6, 0x88, 0x2f, 0x54, 0xa5, 0xa4, 0x7d, 0xe2, 0xd3, 0xa3, 0xfd, 0xd1, 0x1a, 0x73, 0x58, 0x84, 0xc7, 0xb9, 0xfd, 0x7f, 0xa2, 0x33, 0xbf, 0x86, 0xf7, 0x15, 0xee }; static void test_pseudorandom(void) { long long i, j; checksum_zero(); i = 0; for (j = 0; j < SPACESIZE; j += 1 + j / 16) { pseudorandombytes(space + i, j); crypto_hash_sha512(buf + i, space + i, j); checksum(buf + i, crypto_hash_sha512_BYTES); ++i; i %= 16; } fail_whenbadchecksum(test_pseudorandom_checksum); } int main(void) { test_pseudorandom(); _exit(0); } tinyssh-20250501/old/crypto-tests/crypto_kem_sntrup761test.c000066400000000000000000000060261500472222400240040ustar00rootroot00000000000000/* 20210316 Jan Mojzis Public domain. */ #include "misc.h" #include "crypto_kem_sntrup761.h" #include "crypto_kem_sntrup761test.data" unsigned char sk[crypto_kem_sntrup761_SECRETKEYBYTES + 16]; unsigned char pk[crypto_kem_sntrup761_PUBLICKEYBYTES + 16]; unsigned char c[crypto_kem_sntrup761_CIPHERTEXTBYTES + 16]; unsigned char k1[crypto_kem_sntrup761_BYTES + 16]; unsigned char k2[crypto_kem_sntrup761_BYTES + 16]; #define xk2 k2 static void test_random(void) { long long i, j; for (i = 0; i < 16; ++i) { if (crypto_kem_sntrup761_keypair(pk + i, sk + i) != 0) { fail_printdata("pk", pk + i, crypto_kem_sntrup761_PUBLICKEYBYTES); fail_printdata("sk", sk + i, crypto_kem_sntrup761_SECRETKEYBYTES); fail("crypto_kem_sntrup761_keypair() failure, please report it !!!!!!!!!"); } if (crypto_kem_sntrup761_enc(c + i, k1 + i, pk + i) != 0) { fail_printdata("pk", pk + i, crypto_kem_sntrup761_PUBLICKEYBYTES); fail_printdata("sk", sk + i, crypto_kem_sntrup761_SECRETKEYBYTES); fail_printdata("c", c + i, crypto_kem_sntrup761_CIPHERTEXTBYTES); fail_printdata("k1", k1 + i, crypto_kem_sntrup761_BYTES); fail("crypto_kem_sntrup761_enc() failure, please report it !!!!!!!!!"); } if (crypto_kem_sntrup761_dec(k2 + i, c + i, sk + i) != 0) { fail_printdata("pk", pk + i, crypto_kem_sntrup761_PUBLICKEYBYTES); fail_printdata("sk", sk + i, crypto_kem_sntrup761_SECRETKEYBYTES); fail_printdata("c", c + i, crypto_kem_sntrup761_CIPHERTEXTBYTES); fail_printdata("k1", k1 + i, crypto_kem_sntrup761_BYTES); fail_printdata("k2", k2 + i, crypto_kem_sntrup761_BYTES); fail("crypto_kem_sntrup761_dec() failure, please report it !!!!!!!!!"); } for (j = 0; j < crypto_kem_sntrup761_BYTES; ++j) if (k1[i + j] != k2[i + j]) { fail_printdata("pk", pk + i, crypto_kem_sntrup761_PUBLICKEYBYTES); fail_printdata("sk", sk + i, crypto_kem_sntrup761_SECRETKEYBYTES); fail_printdata("c", c + i, crypto_kem_sntrup761_CIPHERTEXTBYTES); fail_printdata("k1", k1 + i, crypto_kem_sntrup761_BYTES); fail_printdata("k2", k2 + i, crypto_kem_sntrup761_BYTES); fail("crypto_kem_sntrup761_dec() failure, please report it !!!!!!!!!"); } } } static void test_dec(void) { long long j; if (crypto_kem_sntrup761_dec(xk2, xc, xsk) != 0) { fail_printdata("xk1", xk1, crypto_kem_sntrup761_BYTES); fail_printdata("xk2", xk2, crypto_kem_sntrup761_BYTES); fail("crypto_kem_sntrup761_dec() failure, please report it !!!!!!!!!"); } for (j = 0; j < crypto_kem_sntrup761_BYTES; ++j) if (xk1[j] != xk2[j]) { fail_printdata("xk1", xk1, crypto_kem_sntrup761_BYTES); fail_printdata("xk2", xk2, crypto_kem_sntrup761_BYTES); fail("crypto_kem_sntrup761_dec() failure, please report it !!!!!!!!!"); } } int main(void) { test_dec(); test_random(); _exit(0); } tinyssh-20250501/old/crypto-tests/crypto_kem_sntrup761test.data000066400000000000000000000446741500472222400245060ustar00rootroot00000000000000static unsigned char xsk[] = { 0x65, 0x55, 0x15, 0x60, 0x2a, 0x51, 0x55, 0xa5, 0x51, 0x45, 0x50, 0x54, 0x56, 0x65, 0x52, 0x22, 0x45, 0xaa, 0x41, 0x55, 0x91, 0x55, 0x56, 0xa9, 0x55, 0x44, 0x55, 0x16, 0x55, 0x8a, 0x95, 0x65, 0x19, 0x00, 0x61, 0x98, 0x59, 0x95, 0x64, 0x55, 0xa8, 0x65, 0x91, 0x55, 0x56, 0x95, 0x89, 0x11, 0x55, 0x91, 0x49, 0x55, 0x4a, 0x46, 0x01, 0x46, 0x49, 0x51, 0x11, 0x5a, 0x25, 0x51, 0x9a, 0x45, 0x65, 0x52, 0x10, 0x19, 0x45, 0x11, 0x55, 0x45, 0x61, 0x24, 0x86, 0x96, 0x54, 0x98, 0x90, 0x15, 0x55, 0x64, 0x64, 0x99, 0x55, 0x44, 0x25, 0x51, 0x65, 0x56, 0x54, 0x54, 0x54, 0x44, 0x41, 0xa5, 0x56, 0x66, 0x16, 0x45, 0x60, 0x54, 0x55, 0x45, 0x51, 0x66, 0x54, 0x54, 0x59, 0x94, 0x96, 0x19, 0x55, 0x55, 0x25, 0x55, 0x66, 0x99, 0x15, 0x45, 0x55, 0x55, 0x45, 0x52, 0x11, 0x5a, 0x94, 0x09, 0x55, 0xa8, 0x56, 0x65, 0x54, 0x56, 0x49, 0x61, 0x65, 0x15, 0x56, 0x15, 0x06, 0x51, 0x94, 0x45, 0x45, 0x00, 0x65, 0x91, 0x66, 0x08, 0x54, 0x55, 0x15, 0x95, 0x84, 0x41, 0x65, 0xa0, 0x45, 0x56, 0x45, 0x55, 0x99, 0x14, 0x65, 0x50, 0x95, 0x56, 0x51, 0x41, 0x55, 0x55, 0x54, 0x95, 0x55, 0x55, 0x1a, 0x42, 0x58, 0x65, 0x59, 0x55, 0x51, 0x21, 0x99, 0x55, 0x95, 0x55, 0x51, 0x55, 0x02, 0x41, 0x62, 0x05, 0x95, 0x00, 0x66, 0x11, 0x56, 0x00, 0x5a, 0x69, 0x84, 0x08, 0x86, 0x58, 0x1a, 0x18, 0x89, 0x24, 0x28, 0x89, 0x24, 0x59, 0x80, 0x05, 0x81, 0x62, 0x42, 0x44, 0x85, 0xa5, 0x50, 0x15, 0x05, 0xa8, 0x22, 0x6a, 0x26, 0x15, 0x28, 0x5a, 0x02, 0x46, 0x6a, 0x1a, 0x12, 0xa0, 0x6a, 0x49, 0x52, 0x45, 0x86, 0x88, 0x58, 0x16, 0x61, 0x28, 0x94, 0xa9, 0x12, 0x08, 0x09, 0x28, 0x1a, 0xa1, 0x10, 0x40, 0x2a, 0x66, 0x96, 0x49, 0x0a, 0x96, 0x08, 0x08, 0x41, 0x46, 0x95, 0x59, 0x8a, 0x69, 0x45, 0x04, 0x26, 0xa9, 0x14, 0xa9, 0x59, 0x52, 0x81, 0x21, 0x26, 0x42, 0x51, 0x69, 0x16, 0x65, 0x65, 0x20, 0x26, 0x56, 0x11, 0x11, 0x2a, 0x61, 0x04, 0x00, 0x89, 0x42, 0x26, 0x88, 0x56, 0xa4, 0x91, 0x98, 0x89, 0x65, 0x29, 0x86, 0x0a, 0x84, 0x59, 0x61, 0xa6, 0x55, 0x46, 0x1a, 0x29, 0x05, 0xa4, 0x15, 0x82, 0x65, 0x96, 0x98, 0xa8, 0x18, 0x8a, 0x80, 0x08, 0x50, 0x64, 0x10, 0x95, 0x49, 0xa4, 0x6a, 0x60, 0x85, 0x82, 0x68, 0x25, 0x18, 0x09, 0x00, 0xa1, 0x06, 0x10, 0x28, 0x54, 0x81, 0xa9, 0x15, 0x18, 0x40, 0x29, 0x10, 0x01, 0x42, 0x22, 0x6a, 0x95, 0x52, 0xa2, 0x26, 0x11, 0x29, 0x55, 0x49, 0x14, 0x55, 0x68, 0x65, 0x66, 0x48, 0xa5, 0x54, 0x85, 0x28, 0xa0, 0x02, 0x95, 0x0c, 0x33, 0x82, 0xe7, 0x2e, 0xf8, 0xd9, 0x31, 0xf1, 0xca, 0xba, 0x92, 0x92, 0x31, 0xff, 0x3a, 0xb8, 0xa8, 0xc0, 0x73, 0x00, 0x14, 0x94, 0x2a, 0xdd, 0x41, 0xf5, 0x94, 0xfc, 0xdc, 0x5a, 0x4a, 0xc1, 0x77, 0x42, 0xf2, 0xd4, 0x40, 0x00, 0x07, 0x2d, 0xe0, 0x07, 0xd1, 0x7c, 0xab, 0x0e, 0xda, 0x08, 0xb6, 0xe9, 0x53, 0x0c, 0xf7, 0xad, 0x09, 0xb2, 0x84, 0xe2, 0x26, 0x05, 0x06, 0x84, 0x3e, 0xd6, 0x86, 0xc6, 0xf5, 0x8c, 0xce, 0x5a, 0x0b, 0x57, 0x4a, 0xcc, 0xf4, 0xbc, 0xa7, 0x8b, 0x4f, 0x41, 0x22, 0xb2, 0x67, 0xfb, 0x1e, 0xf5, 0x64, 0x65, 0x54, 0x69, 0x1a, 0x16, 0x8c, 0x9b, 0x21, 0xb6, 0x11, 0xf5, 0x56, 0x90, 0xdd, 0xa3, 0xa8, 0x0e, 0x93, 0x5a, 0x50, 0x2b, 0x06, 0x36, 0x51, 0xd8, 0xf2, 0x41, 0x4d, 0x6e, 0x47, 0xeb, 0xe4, 0xec, 0xb4, 0xf7, 0x36, 0x3b, 0x55, 0x11, 0x70, 0x86, 0xe7, 0x3a, 0x45, 0xb3, 0xfb, 0x0a, 0x82, 0xb8, 0xed, 0xda, 0x24, 0x47, 0x3e, 0x85, 0xe2, 0x37, 0xbb, 0x35, 0xaa, 0xd6, 0x34, 0xd4, 0xbe, 0xed, 0x08, 0x45, 0xae, 0x22, 0xde, 0x6a, 0x79, 0x0f, 0x36, 0xff, 0xb0, 0x14, 0x99, 0xa3, 0xe9, 0x1a, 0x01, 0x68, 0xb6, 0x5f, 0xed, 0x65, 0xc5, 0x73, 0xa7, 0x94, 0x6b, 0xff, 0x57, 0xa0, 0x65, 0x3a, 0x17, 0x7a, 0x8d, 0x98, 0x0e, 0x69, 0xe0, 0x91, 0x4a, 0x7d, 0xff, 0x92, 0xc9, 0xce, 0x25, 0xec, 0xd6, 0x11, 0xd2, 0x12, 0x3f, 0x51, 0x9a, 0xaa, 0x92, 0xb2, 0xb5, 0x1d, 0x97, 0x84, 0xbd, 0x48, 0x09, 0xaa, 0x2d, 0x51, 0x3f, 0x26, 0x7a, 0x6b, 0xa7, 0x4d, 0xa6, 0x81, 0x3b, 0x14, 0xd3, 0xbe, 0xb6, 0xa2, 0x6f, 0x62, 0xa1, 0x9a, 0xc6, 0x87, 0x59, 0x17, 0x81, 0x20, 0x24, 0xb3, 0x6f, 0xa3, 0x53, 0xb1, 0x23, 0x8d, 0x4c, 0x9a, 0x06, 0xba, 0xb9, 0x36, 0x67, 0xc6, 0x8e, 0x8a, 0x0b, 0xa9, 0x51, 0x0c, 0x20, 0x01, 0x2f, 0xff, 0xa3, 0xa0, 0xc1, 0xeb, 0xa5, 0x64, 0xb6, 0x19, 0x3a, 0x50, 0xe9, 0xfc, 0x19, 0x9e, 0x99, 0x61, 0xc8, 0xc3, 0x71, 0x12, 0xcc, 0x4a, 0xa8, 0x00, 0x79, 0xc1, 0x5d, 0x8b, 0xc1, 0x3e, 0x66, 0xae, 0x6e, 0xaa, 0xe5, 0x1d, 0xaf, 0x9b, 0xa4, 0xee, 0x4d, 0x00, 0x50, 0x0f, 0x4f, 0x46, 0xe0, 0x6e, 0xf3, 0x14, 0x06, 0x6d, 0x76, 0xab, 0xd1, 0xe1, 0xb9, 0xa2, 0xcc, 0x64, 0x65, 0x9c, 0xbe, 0xe6, 0x89, 0x48, 0xcd, 0x62, 0x2e, 0xfc, 0x98, 0xe3, 0xb6, 0x12, 0xe1, 0x94, 0x91, 0x2c, 0x01, 0x6a, 0xbc, 0xc4, 0xa7, 0xc7, 0x8a, 0xe6, 0x5a, 0xd4, 0x62, 0x3e, 0x01, 0x82, 0x8f, 0xc3, 0x17, 0xd2, 0xbd, 0x28, 0xfd, 0xc3, 0x08, 0x67, 0xfc, 0xfd, 0x68, 0xd8, 0xb9, 0x80, 0x9f, 0x6a, 0xa5, 0xfd, 0xe6, 0x21, 0x93, 0x8b, 0x52, 0xe1, 0xa2, 0x2a, 0x4f, 0x96, 0xce, 0xb0, 0xcf, 0xb3, 0xba, 0xcf, 0x02, 0x25, 0xe1, 0xfd, 0xf1, 0x3c, 0x4f, 0x9b, 0x03, 0xd8, 0xa5, 0xcb, 0x58, 0x9c, 0xe9, 0xed, 0xbe, 0x7b, 0x76, 0xa9, 0xfc, 0xfe, 0xc4, 0x7d, 0xa9, 0x2e, 0x38, 0x92, 0x7b, 0xd0, 0x5f, 0xfb, 0x83, 0x62, 0x37, 0xf2, 0x00, 0x04, 0xe4, 0x53, 0x5a, 0x7b, 0x5e, 0x78, 0x6b, 0x13, 0x11, 0xce, 0x39, 0x76, 0x90, 0xd8, 0x78, 0x8b, 0x6f, 0xd0, 0xb4, 0x3b, 0xad, 0x79, 0x25, 0xa4, 0x5e, 0x94, 0xe5, 0xb2, 0x26, 0xad, 0xf1, 0x4e, 0x33, 0x06, 0xcb, 0x52, 0xf1, 0x76, 0xf4, 0x61, 0x68, 0xa4, 0xb7, 0xbc, 0xda, 0xc8, 0xc3, 0x90, 0x33, 0x06, 0x5c, 0x18, 0xb8, 0x16, 0x88, 0x36, 0x4d, 0x54, 0xa1, 0x77, 0xf5, 0xb4, 0x32, 0xba, 0xbc, 0x9c, 0xd7, 0x16, 0x98, 0xde, 0x76, 0x9c, 0x54, 0x8d, 0x0b, 0xfb, 0x72, 0xf9, 0xff, 0x3b, 0xb2, 0x2a, 0x5d, 0x8b, 0x6f, 0x40, 0x8b, 0x16, 0x20, 0x8a, 0x35, 0x45, 0x8f, 0x19, 0x3b, 0x81, 0x2f, 0x2c, 0x97, 0xc5, 0xc1, 0x5e, 0xbe, 0xdf, 0x47, 0x0e, 0x65, 0xd6, 0x9b, 0x7d, 0x28, 0x58, 0xa8, 0x6b, 0xb3, 0xfc, 0x11, 0x7f, 0x52, 0x0e, 0x21, 0x77, 0x4c, 0x35, 0x89, 0xf9, 0xd4, 0x18, 0xc8, 0xfc, 0x45, 0xe5, 0x57, 0x15, 0x1c, 0x36, 0x50, 0x0c, 0x77, 0xcc, 0xe0, 0x4c, 0xc5, 0xf0, 0x1f, 0x7f, 0xfd, 0x9a, 0x57, 0xa7, 0x22, 0x22, 0xd1, 0x9a, 0x7c, 0xdb, 0x40, 0x27, 0xd5, 0x75, 0xf1, 0x0e, 0x27, 0x0f, 0xbf, 0xaa, 0x24, 0x63, 0x19, 0x70, 0x64, 0x77, 0xe4, 0x6c, 0x32, 0x71, 0x66, 0x14, 0xe3, 0xa5, 0xb4, 0xac, 0xe5, 0xe9, 0xbd, 0x8b, 0xfb, 0x83, 0x7d, 0xd2, 0x9a, 0x5d, 0xe7, 0x5f, 0xac, 0xe7, 0xf6, 0xb7, 0xd3, 0xc4, 0xf6, 0x78, 0x1f, 0x54, 0x25, 0x1e, 0x0c, 0xa7, 0x6c, 0x4b, 0xab, 0x44, 0xf2, 0x1f, 0x30, 0x0c, 0x4a, 0x3e, 0x0d, 0x2c, 0x15, 0xd8, 0xed, 0xee, 0x20, 0xdd, 0xbc, 0x24, 0xb9, 0x2d, 0x27, 0xcc, 0x8a, 0x11, 0x19, 0xc4, 0xfb, 0x2f, 0xcf, 0xe3, 0x69, 0x3c, 0x60, 0x4f, 0xa3, 0x7a, 0x3b, 0x58, 0x47, 0x04, 0xdb, 0x94, 0x02, 0x07, 0x5a, 0x11, 0x70, 0xd1, 0xa1, 0xd4, 0x0e, 0xe5, 0x45, 0x34, 0xdf, 0x73, 0xd6, 0x6b, 0xed, 0xdc, 0xb2, 0x07, 0xde, 0x7a, 0x57, 0xdd, 0x44, 0x4e, 0x08, 0x4b, 0x43, 0xa8, 0xfa, 0x2d, 0x24, 0x6b, 0x58, 0x0d, 0x2a, 0xb6, 0x4b, 0x15, 0x79, 0x21, 0x40, 0xcb, 0xb8, 0x82, 0xf6, 0x96, 0x19, 0x76, 0x07, 0xfd, 0x42, 0xe6, 0x43, 0xd2, 0x0c, 0xfa, 0xc1, 0x07, 0xf7, 0xc3, 0x1b, 0xaf, 0x27, 0xe4, 0x63, 0x84, 0x92, 0x42, 0x95, 0x16, 0x52, 0xbb, 0x77, 0x5d, 0x6a, 0x2c, 0x1e, 0x01, 0x53, 0x85, 0xa4, 0x06, 0xd6, 0xdf, 0x3f, 0xaa, 0x5b, 0xfc, 0x46, 0x9e, 0x3e, 0x3d, 0x5b, 0xe6, 0x9d, 0x5b, 0x61, 0x8b, 0x6b, 0xd9, 0x8e, 0x2c, 0x09, 0x48, 0xe5, 0x76, 0x9e, 0xe2, 0x88, 0x0c, 0xed, 0xed, 0x8c, 0xda, 0x59, 0x31, 0xe8, 0xf3, 0x1d, 0x9e, 0xea, 0xe1, 0x11, 0xa8, 0xc3, 0xac, 0xb3, 0xff, 0x22, 0xf9, 0x97, 0xdd, 0x4b, 0x1f, 0x85, 0xa4, 0xdf, 0xe8, 0x61, 0x3b, 0x97, 0x53, 0x9e, 0x2f, 0x48, 0xa9, 0xdb, 0xbf, 0x85, 0x84, 0x8d, 0x9a, 0x8a, 0x89, 0x35, 0xf8, 0xa7, 0x33, 0x10, 0x61, 0xd4, 0x76, 0xd3, 0xaf, 0x1b, 0xbe, 0xca, 0x77, 0x91, 0xa9, 0x1a, 0x89, 0xae, 0xeb, 0x96, 0x23, 0xe1, 0x12, 0x5c, 0x5f, 0x57, 0xcc, 0x7d, 0x8f, 0x26, 0x9d, 0x3d, 0x1b, 0x96, 0x86, 0xc0, 0x22, 0x3d, 0x77, 0x3b, 0xff, 0x5c, 0x16, 0x60, 0x47, 0x35, 0x35, 0xe7, 0xb9, 0xe0, 0xb0, 0xf1, 0x7e, 0x63, 0x65, 0x0c, 0x17, 0xcf, 0x92, 0x3d, 0x40, 0x94, 0xe3, 0xcd, 0xf1, 0xf0, 0x39, 0xd7, 0x57, 0x2c, 0x09, 0x62, 0x39, 0x2f, 0xc9, 0x39, 0xc4, 0x98, 0x81, 0x08, 0x9a, 0x5e, 0xfd, 0xbe, 0xb0, 0xd7, 0xb3, 0x5d, 0x0c, 0x81, 0x22, 0x96, 0x3d, 0xaa, 0x1b, 0xe2, 0x30, 0x13, 0x7c, 0xc9, 0x4d, 0xf4, 0x4b, 0xeb, 0xcc, 0xd3, 0xc6, 0x50, 0x1b, 0x20, 0x02, 0xd0, 0x0c, 0x65, 0xb1, 0x02, 0x83, 0xf3, 0xf4, 0x85, 0x0f, 0xc5, 0x79, 0xdc, 0x3f, 0x66, 0xd5, 0xb0, 0x06, 0x57, 0x0a, 0x72, 0x85, 0xbe, 0xaf, 0x12, 0x76, 0x44, 0xf4, 0xb8, 0x76, 0x1c, 0xfa, 0x6e, 0x74, 0x9b, 0xa7, 0x8b, 0x30, 0xca, 0xc6, 0x90, 0x3f, 0xbf, 0xd0, 0x23, 0x3b, 0x75, 0x95, 0x2f, 0x06, 0xb5, 0xea, 0x5b, 0xa0, 0x49, 0x31, 0x13, 0x55, 0xb8, 0xe3, 0xfa, 0x3b, 0x52, 0xdb, 0xe3, 0x06, 0x49, 0x23, 0xd2, 0x7c, 0xfb, 0x09, 0x23, 0xae, 0x51, 0xdc, 0x92, 0x06, 0x75, 0x69, 0x62, 0x9c, 0xaa, 0x02, 0xd9, 0xf0, 0xa5, 0x5b, 0xb5, 0x18, 0xee, 0x01, 0xce, 0xa2, 0x53, 0x55, 0x35, 0x89, 0xcf, 0x23, 0xf9, 0x1f, 0xad, 0x0c, 0xac, 0x3c, 0x49, 0x17, 0xa5, 0xea, 0x06, 0x7f, 0xc5, 0x0d, 0x2c, 0x25, 0x1a, 0x62, 0xf4, 0x3d, 0x6a, 0x5f, 0xfa, 0xb3, 0xfb, 0xc4, 0x7f, 0xa1, 0x00, 0x94, 0x2e, 0xb2, 0xff, 0x10, 0x16, 0x2d, 0xad, 0xa8, 0x4b, 0x3a, 0x06, 0x12, 0x5d, 0x53, 0xe8, 0xc1, 0xcd, 0xcf, 0x7b, 0x8c, 0x46, 0x4d, 0xad, 0xb5, 0x38, 0xa4, 0x76, 0xb7, 0x9c, 0x8c, 0x3a, 0x9e, 0x13, 0x98, 0xd1, 0xb4, 0xe1, 0x45, 0xfe, 0xdd, 0x88, 0x6f, 0x8b, 0xca, 0x22, 0x07, 0xa2, 0xb2, 0xc5, 0x51, 0x5e, 0x45, 0x33, 0x43, 0xd9, 0x17, 0x74, 0x1a, 0x6e, 0x3e, 0x48, 0x87, 0x6a, 0x09, 0x01, 0xa6, 0x50, 0xac, 0xf9, 0x04, 0x6c, 0x5f, 0x7a, 0xa0, 0x90, 0xd7, 0x33, 0x14, 0xc2, 0x7c, 0x84, 0xe6, 0x9b, 0xfd, 0x8f, 0x03, 0x85, 0x0e, 0xaa, 0x17, 0x05, 0xb1, 0x5f, 0x08, 0xe8, 0x78, 0xee, 0xfc, 0xa0, 0x34, 0x4f, 0x80, 0x3d, 0xb6, 0xb4, 0x8e, 0x17, 0x5e, 0x55, 0xca, 0x16, 0x44, 0xa8, 0xd2, 0xa2, 0x87, 0xc3, 0x2f, 0x00, 0xc6, 0xd9, 0x9b, 0xbe, 0xc3, 0x98, 0x9b, 0xe8, 0x2c, 0xe7, 0xaf, 0x01, 0xea, 0x8a, 0xc2, 0x2d, 0x36, 0x9f, 0xce, 0x23, 0x83, 0xea, 0x39, 0x76, 0xbe, 0x77, 0x52, 0xdd, 0x8b, 0x65, 0x75, 0x71, 0xc2, 0x14, 0xa0, 0xa2, 0x6a, 0x83, 0x7f, 0xf8, 0x82, 0x06, 0xd9, 0xfb, 0x51, 0xc5, 0xce, 0x4d, 0x3d, 0x75, 0xf0, 0x17, 0xaa, 0xcf, 0xf4, 0xb2, 0x59, 0xc4, 0x72, 0x2a, 0x31, 0x1e, 0x5d, 0x33, 0xc9, 0x90, 0x8b, 0x07, 0x27, 0x97, 0x53, 0x3a, 0xc7, 0x44, 0x25, 0xa1, 0x73, 0x46, 0x6c, 0x00, 0xdb, 0x8b, 0xc8, 0x94, 0x9e, 0x2a, 0x11, 0xb5, 0xb4, 0x38, 0x88, 0x74, 0xac, 0x8f, 0xc3, 0xf1, 0x1d, 0x88, 0xdc, 0xfd, 0xc7, 0xef, 0x07, 0xbe, 0x4b, 0xe3, 0xdd, 0x9f, 0x02, 0xcb, 0x6e, 0xbc, 0x26, 0xa4, 0x8c, 0x01, 0xb2, 0xba, 0xbf, 0xf1, 0x6b, 0x7f, 0x87, 0xa2, 0xc5, 0xca, 0xbd, 0x31, 0xa5, 0xe5, 0x24, 0xa0, 0xa2, 0x84, 0x23, 0x9c, 0x06, 0xe7, 0x48, 0x04, 0xad, 0xdd, 0xaf, 0xe6, 0x90, 0x27, 0x13, 0xeb, 0xef, 0xcc, 0x24, 0x5a, 0x57, 0xc2, 0x7b, 0xaf, 0xdf, 0x70, 0xf1, 0x64, 0x1e, 0xc2, 0x31, 0xf9, 0xab, 0xd1, 0x8d, 0x02, 0xed, 0x8f, 0xbf, 0xda, 0x13, 0x29 }; static unsigned char xc[] = { 0x9d, 0x9c, 0x62, 0x7b, 0xe2, 0x3a, 0x22, 0x4a, 0xb1, 0x12, 0x76, 0x21, 0x4c, 0xca, 0x8c, 0x3f, 0xea, 0x2a, 0x78, 0x20, 0x2c, 0x0d, 0x51, 0x94, 0x40, 0x2d, 0x6e, 0x6c, 0xad, 0xb5, 0x29, 0x95, 0x4c, 0xe5, 0x1e, 0xeb, 0x28, 0xe1, 0xfa, 0xd4, 0x42, 0xc6, 0xc3, 0xd6, 0x03, 0xb1, 0xaa, 0x8f, 0xe5, 0x87, 0x56, 0x69, 0xd9, 0x58, 0x7a, 0xcb, 0xd2, 0xea, 0x80, 0xe8, 0xc9, 0x78, 0x15, 0xe0, 0x0b, 0xb4, 0x4b, 0x1c, 0xc4, 0x3d, 0x2d, 0x7b, 0xc5, 0x36, 0x0e, 0x8a, 0x82, 0xe0, 0x8a, 0xbf, 0xd3, 0x10, 0x4c, 0x01, 0x15, 0x47, 0x05, 0xfc, 0x26, 0x86, 0x8a, 0xd8, 0x20, 0x81, 0xd5, 0x35, 0x59, 0xd0, 0x74, 0xdf, 0xcd, 0x0e, 0xb9, 0x4d, 0x80, 0x4b, 0x8d, 0xfd, 0xbd, 0x80, 0xa0, 0x20, 0xbd, 0x2a, 0x58, 0xf2, 0xd0, 0x08, 0xb8, 0x7d, 0x8e, 0xd9, 0xff, 0x36, 0xb3, 0x1d, 0xe7, 0x94, 0x87, 0x5c, 0x5f, 0xf7, 0x49, 0x48, 0x41, 0x95, 0x67, 0x68, 0x3e, 0x6c, 0xcd, 0x36, 0x15, 0xdf, 0x47, 0xad, 0x14, 0x66, 0x61, 0x99, 0x8b, 0x3f, 0x10, 0x3e, 0x7e, 0xe9, 0xbb, 0x60, 0xed, 0x87, 0x7b, 0x90, 0x23, 0xc1, 0x5a, 0x80, 0xbd, 0x7f, 0x67, 0x0e, 0x4a, 0xa2, 0x7e, 0xb4, 0x6d, 0xcc, 0x67, 0x3d, 0x91, 0xe8, 0xf7, 0xd9, 0x25, 0x38, 0x54, 0xcf, 0xb1, 0x8a, 0x15, 0xdd, 0xc3, 0x94, 0xaf, 0x6d, 0x04, 0xf9, 0x35, 0x56, 0xe7, 0x8a, 0xbc, 0x16, 0xce, 0x33, 0xf8, 0x7e, 0xdd, 0x84, 0x67, 0x28, 0xca, 0x09, 0x75, 0xcb, 0x86, 0x03, 0x08, 0x96, 0xf9, 0xee, 0xc3, 0x9b, 0x3d, 0x18, 0xb8, 0x77, 0x28, 0x64, 0x69, 0xd4, 0x53, 0x63, 0xbd, 0x55, 0x59, 0xc7, 0x0c, 0x78, 0xda, 0x65, 0xd6, 0xb9, 0xe4, 0x0e, 0xb5, 0xc5, 0xcd, 0x95, 0xec, 0x5c, 0x03, 0x1b, 0xf2, 0x7a, 0xd8, 0xde, 0x16, 0x62, 0x1d, 0x8d, 0x3f, 0xb3, 0xa1, 0xf4, 0x46, 0x72, 0xd5, 0x93, 0x3c, 0xc9, 0x86, 0xf2, 0x58, 0x1e, 0x10, 0x62, 0x39, 0xc5, 0x8d, 0xd8, 0xda, 0x88, 0xa1, 0x6b, 0xee, 0x76, 0xad, 0xda, 0xa0, 0x21, 0x90, 0x10, 0x6e, 0x25, 0x31, 0x59, 0xeb, 0xcd, 0xb8, 0x26, 0x34, 0x38, 0x4c, 0xab, 0x3e, 0x9d, 0x00, 0xcd, 0x4b, 0x4e, 0xcd, 0x0e, 0x6e, 0x33, 0x7f, 0x61, 0x5c, 0x62, 0x77, 0xba, 0x6c, 0xc1, 0xd3, 0xe3, 0x35, 0xf2, 0xea, 0xaa, 0x40, 0x11, 0x0a, 0xd1, 0x0f, 0x03, 0x36, 0xf1, 0x06, 0xc5, 0x0a, 0x87, 0xe1, 0xf4, 0xe9, 0xc6, 0x48, 0xb8, 0xe0, 0x26, 0xc4, 0x68, 0xd0, 0x7a, 0x84, 0x8b, 0x44, 0x01, 0x18, 0x8c, 0xb5, 0x84, 0x9d, 0xe2, 0x1a, 0xdc, 0x1a, 0x7f, 0xb0, 0x03, 0x6b, 0xa1, 0xa1, 0xf3, 0xa9, 0xcd, 0x37, 0x9a, 0x43, 0xab, 0x9e, 0xc3, 0xd5, 0x8a, 0x43, 0x6f, 0xa3, 0x2f, 0x0f, 0x08, 0x19, 0xc5, 0xfb, 0x69, 0x94, 0x78, 0x74, 0x01, 0x03, 0xd1, 0x2f, 0x04, 0x2b, 0x6a, 0x5b, 0xed, 0x43, 0x26, 0xe0, 0x2a, 0x90, 0xd5, 0xee, 0x85, 0x03, 0xe4, 0x3a, 0x8b, 0xb3, 0xb1, 0xa4, 0x09, 0xc8, 0x4d, 0x20, 0xd7, 0x87, 0x41, 0xa3, 0xbd, 0xca, 0x59, 0x21, 0xbf, 0x0c, 0xde, 0xb3, 0xc0, 0xea, 0x88, 0x01, 0x28, 0x37, 0x97, 0xd3, 0xf7, 0x2d, 0x49, 0x6c, 0xd6, 0xc0, 0x78, 0x47, 0x92, 0x2c, 0xaf, 0xfe, 0x78, 0xc2, 0x18, 0x0e, 0x5b, 0xd2, 0x27, 0x72, 0x54, 0x31, 0x0f, 0x88, 0xb0, 0xa9, 0x5b, 0x6f, 0x5f, 0x02, 0xe2, 0x44, 0xa1, 0xdb, 0x7c, 0x1b, 0xe0, 0xcb, 0x0d, 0x56, 0x6b, 0xc2, 0x80, 0x84, 0x5d, 0x28, 0x0c, 0x88, 0x3a, 0x4d, 0x98, 0x78, 0x55, 0xd6, 0xe6, 0x34, 0x25, 0xc0, 0x75, 0x38, 0xf1, 0xa7, 0x66, 0x2d, 0x2c, 0x10, 0x55, 0xf0, 0xb4, 0xcf, 0x89, 0x4f, 0xba, 0x63, 0x94, 0x8a, 0xfd, 0x1d, 0x12, 0x4d, 0xb7, 0xb5, 0x91, 0x69, 0x28, 0x38, 0x76, 0x85, 0x23, 0xc4, 0xc3, 0xcd, 0x6c, 0xa8, 0x89, 0x01, 0x85, 0xd0, 0xd9, 0xb3, 0xc3, 0xdc, 0xea, 0x76, 0x8f, 0x30, 0x82, 0x88, 0xa9, 0x3a, 0x83, 0x12, 0x25, 0x05, 0x4b, 0x62, 0x4a, 0x7a, 0xdc, 0x3d, 0x12, 0x48, 0x3c, 0xb2, 0xc0, 0x22, 0x11, 0x01, 0x08, 0xfd, 0x30, 0x91, 0x86, 0x45, 0xb9, 0x42, 0x6a, 0xcb, 0x53, 0x18, 0xfd, 0x4c, 0x76, 0x49, 0x4f, 0xe2, 0xca, 0xe2, 0x03, 0x8e, 0xdb, 0xd4, 0x1f, 0xe8, 0x38, 0x2b, 0xf2, 0x4a, 0xeb, 0xa0, 0x23, 0x73, 0xe4, 0xc0, 0x3f, 0x6f, 0x6f, 0x35, 0x50, 0x24, 0xe8, 0x17, 0xf7, 0xef, 0xa6, 0x1b, 0xd4, 0x62, 0xfc, 0xbf, 0x49, 0x66, 0x21, 0x84, 0xae, 0xc1, 0xc4, 0x57, 0xdd, 0xeb, 0x25, 0x1e, 0xd7, 0xca, 0xdf, 0x87, 0xb7, 0xb4, 0xc6, 0x08, 0x93, 0x10, 0x15, 0x34, 0xf4, 0xb9, 0xcf, 0x08, 0xa5, 0x7d, 0x8a, 0x68, 0x0c, 0x4f, 0xc0, 0x01, 0xb7, 0x9c, 0x05, 0xe7, 0x7c, 0x21, 0x26, 0xd0, 0x5e, 0xaa, 0xb9, 0xa3, 0x4f, 0x2f, 0x34, 0x68, 0x01, 0xd2, 0x36, 0xbe, 0x99, 0xca, 0xe6, 0x3c, 0xfb, 0x30, 0xea, 0xc2, 0x6c, 0xd5, 0x2a, 0xa8, 0x41, 0x65, 0x82, 0x0b, 0x57, 0x09, 0x7b, 0x8d, 0x46, 0x2e, 0xbf, 0x14, 0x22, 0x70, 0x73, 0x15, 0x2e, 0xc6, 0xd6, 0x1c, 0xee, 0x68, 0xae, 0x2f, 0xe3, 0x62, 0x2d, 0x3e, 0x02, 0xb5, 0xe3, 0x03, 0xab, 0x5a, 0xc7, 0xd2, 0x81, 0x3c, 0x42, 0x36, 0xdf, 0x77, 0x6f, 0x91, 0x13, 0x72, 0xe3, 0x17, 0xa2, 0x69, 0xa7, 0x16, 0x7e, 0x68, 0xb5, 0x22, 0x7d, 0xec, 0x5b, 0x6c, 0x5b, 0x78, 0x6d, 0x36, 0x8e, 0x46, 0x41, 0xb5, 0xe1, 0x39, 0x6f, 0xf3, 0xfe, 0xf1, 0xc9, 0x8d, 0x62, 0xab, 0xc9, 0xcf, 0x7b, 0xce, 0xf2, 0x54, 0x52, 0x98, 0x9f, 0x23, 0x87, 0xc5, 0x49, 0x25, 0x7e, 0x3b, 0x42, 0x2b, 0x94, 0x10, 0xd9, 0x19, 0x78, 0xd9, 0xaa, 0xcd, 0xb0, 0x86, 0x61, 0x04, 0xee, 0x3e, 0xef, 0xca, 0x63, 0x07, 0x78, 0xb7, 0x90, 0xf3, 0x20, 0x38, 0x37, 0x0d, 0x51, 0x9a, 0x54, 0x24, 0xa2, 0x85, 0x1e, 0x21, 0xb0, 0xc3, 0x37, 0x11, 0x78, 0x60, 0x75, 0x02, 0x96, 0xab, 0xbf, 0x20, 0x40, 0xc3, 0xcf, 0x76, 0x69, 0x5d, 0x35, 0x40, 0x13, 0xb1, 0xf0, 0x2b, 0xed, 0x7a, 0x1f, 0xef, 0xa3, 0x20, 0x8f, 0x8a, 0x6d, 0x4a, 0x6d, 0xd8, 0xff, 0x6f, 0xca, 0xb2, 0x03, 0x3f, 0xa9, 0x00, 0x58, 0x6a, 0x44, 0x4c, 0x90, 0xb8, 0x13, 0x04, 0x51, 0xfa, 0xfc, 0x9d, 0x06, 0x92, 0xfa, 0x57, 0xf7, 0x3e, 0x03, 0x5e, 0xe9, 0xbe, 0xef, 0xbd, 0x24, 0x31, 0xf9, 0x25, 0xf6, 0x9d, 0xb6, 0x4e, 0x23, 0x70, 0xf9, 0x50, 0x29, 0xdc, 0x09, 0xa7, 0xfa, 0xe9, 0xcb, 0xfe, 0x4c, 0x7e, 0xc5, 0x98, 0xc5, 0xd0, 0x6c, 0xe7, 0x1a, 0x47, 0xc5, 0x44, 0xe2, 0x4f, 0x1a, 0x76, 0xa1, 0xa4, 0xb9, 0x13, 0x9b, 0x80, 0xd0, 0x66, 0xcb, 0x8e, 0x75, 0x4f, 0x2b, 0x73, 0x9c, 0x81, 0x4d, 0xde, 0x0f, 0x37, 0x06, 0x11, 0x1d, 0x42, 0x20, 0x07, 0x5d, 0x0a, 0x3a, 0xb6, 0x4c, 0xeb, 0x7b, 0x7a, 0xf9, 0x6e, 0x53, 0xbe, 0xe7, 0xd3, 0xc7, 0x46, 0x11, 0x14, 0xff, 0x84, 0xc9, 0x11, 0xf5, 0xec, 0xb6, 0x9e, 0x42, 0x94, 0xae, 0x8c, 0xfd, 0xb4, 0x69, 0xf7, 0x38, 0xfe, 0x5d, 0xad, 0xd6, 0x9f, 0xe4, 0xd6, 0x83, 0xe4, 0x3d, 0x90, 0xaa, 0xad, 0x07, 0x65, 0xd7, 0x2b, 0x4e, 0x11, 0xca, 0x02, 0x21, 0x3b, 0x1e, 0x80, 0xc2, 0x78, 0x9c, 0x57, 0xaa, 0x8f, 0xdb, 0xc7, 0xd8, 0xae, 0x31, 0x5c, 0xbf, 0xe8, 0xd7, 0x40, 0x78, 0x24, 0x59, 0xfe, 0x8b, 0x1e, 0x12, 0x31, 0x90, 0x4a, 0xf5, 0x68 }; static unsigned char xk1[] = { 0xed, 0xa0, 0xcc, 0xf8, 0x26, 0x0c, 0xf4, 0x95, 0x5d, 0xa7, 0x71, 0xa3, 0x90, 0xed, 0xf0, 0xd9, 0x87, 0xf7, 0xfc, 0xec, 0x54, 0xf2, 0xbe, 0xd7, 0x91, 0x79, 0xc7, 0xec, 0x2d, 0xd2, 0x1d, 0x05 }; tinyssh-20250501/old/crypto-tests/crypto_kem_sntrup761x25519test.c000066400000000000000000000064001500472222400245760ustar00rootroot00000000000000/* 20210316 Jan Mojzis Public domain. */ #include "misc.h" #include "crypto_kem_sntrup761x25519.h" #include "crypto_kem_sntrup761x25519test.data" unsigned char sk[crypto_kem_sntrup761x25519_SECRETKEYBYTES + 16]; unsigned char pk[crypto_kem_sntrup761x25519_PUBLICKEYBYTES + 16]; unsigned char c[crypto_kem_sntrup761x25519_CIPHERTEXTBYTES + 16]; unsigned char k1[crypto_kem_sntrup761x25519_BYTES + 16]; unsigned char k2[crypto_kem_sntrup761x25519_BYTES + 16]; #define xk2 k2 static void test_random(void) { long long i, j; for (i = 0; i < 16; ++i) { if (crypto_kem_sntrup761x25519_keypair(pk + i, sk + i) != 0) { fail_printdata("pk", pk + i, crypto_kem_sntrup761x25519_PUBLICKEYBYTES); fail_printdata("sk", sk + i, crypto_kem_sntrup761x25519_SECRETKEYBYTES); fail("crypto_kem_sntrup761x25519_keypair() failure, please report it !!!!!!!!!"); } if (crypto_kem_sntrup761x25519_enc(c + i, k1 + i, pk + i) != 0) { fail_printdata("pk", pk + i, crypto_kem_sntrup761x25519_PUBLICKEYBYTES); fail_printdata("sk", sk + i, crypto_kem_sntrup761x25519_SECRETKEYBYTES); fail_printdata("c", c + i, crypto_kem_sntrup761x25519_CIPHERTEXTBYTES); fail_printdata("k1", k1 + i, crypto_kem_sntrup761x25519_BYTES); fail("crypto_kem_sntrup761x25519_enc() failure, please report it !!!!!!!!!"); } if (crypto_kem_sntrup761x25519_dec(k2 + i, c + i, sk + i) != 0) { fail_printdata("pk", pk + i, crypto_kem_sntrup761x25519_PUBLICKEYBYTES); fail_printdata("sk", sk + i, crypto_kem_sntrup761x25519_SECRETKEYBYTES); fail_printdata("c", c + i, crypto_kem_sntrup761x25519_CIPHERTEXTBYTES); fail_printdata("k1", k1 + i, crypto_kem_sntrup761x25519_BYTES); fail_printdata("k2", k2 + i, crypto_kem_sntrup761x25519_BYTES); fail("crypto_kem_sntrup761x25519_dec() failure, please report it !!!!!!!!!"); } for (j = 0; j < crypto_kem_sntrup761x25519_BYTES; ++j) if (k1[i + j] != k2[i + j]) { fail_printdata("pk", pk + i, crypto_kem_sntrup761x25519_PUBLICKEYBYTES); fail_printdata("sk", sk + i, crypto_kem_sntrup761x25519_SECRETKEYBYTES); fail_printdata("c", c + i, crypto_kem_sntrup761x25519_CIPHERTEXTBYTES); fail_printdata("k1", k1 + i, crypto_kem_sntrup761x25519_BYTES); fail_printdata("k2", k2 + i, crypto_kem_sntrup761x25519_BYTES); fail("crypto_kem_sntrup761x25519_dec() failure, please report it !!!!!!!!!"); } } } static void test_dec(void) { long long j; if (crypto_kem_sntrup761x25519_dec(xk2, xc, xsk) != 0) { fail_printdata("xk1", xk1, crypto_kem_sntrup761x25519_BYTES); fail_printdata("xk2", xk2, crypto_kem_sntrup761x25519_BYTES); fail("crypto_kem_sntrup761x25519_dec() failure, please report it !!!!!!!!!"); } for (j = 0; j < crypto_kem_sntrup761x25519_BYTES; ++j) if (xk1[j] != xk2[j]) { fail_printdata("xk1", xk1, crypto_kem_sntrup761x25519_BYTES); fail_printdata("xk2", xk2, crypto_kem_sntrup761x25519_BYTES); fail("crypto_kem_sntrup761x25519_dec() failure, please report it !!!!!!!!!"); } } int main(void) { test_dec(); test_random(); _exit(0); } tinyssh-20250501/old/crypto-tests/crypto_kem_sntrup761x25519test.data000066400000000000000000000460701500472222400252740ustar00rootroot00000000000000static unsigned char xsk[] = { 0x95, 0x65, 0x19, 0x41, 0x1a, 0x16, 0x40, 0x0a, 0x65, 0x59, 0x04, 0x55, 0x45, 0x49, 0x46, 0x56, 0xa6, 0x56, 0x40, 0xa5, 0x51, 0x96, 0x54, 0x95, 0x16, 0x15, 0x54, 0xa2, 0x55, 0x29, 0x58, 0x59, 0x44, 0x59, 0x45, 0x55, 0xa1, 0x65, 0x95, 0x11, 0x55, 0x54, 0x21, 0x45, 0x56, 0x66, 0x52, 0x55, 0x54, 0x64, 0x85, 0x25, 0x94, 0x41, 0x91, 0x64, 0x55, 0x52, 0x99, 0x51, 0x55, 0x59, 0x11, 0x69, 0x45, 0x12, 0x59, 0x15, 0x40, 0x55, 0x65, 0x44, 0x54, 0x05, 0x44, 0x52, 0x15, 0x59, 0x00, 0x55, 0x51, 0x6a, 0x45, 0x55, 0x96, 0x95, 0x15, 0x42, 0x55, 0x41, 0x55, 0x41, 0x05, 0x01, 0x64, 0x55, 0x55, 0x64, 0x16, 0x95, 0x51, 0x65, 0x49, 0x92, 0x5a, 0x85, 0x16, 0x14, 0x54, 0x14, 0x55, 0x54, 0x5a, 0x15, 0x15, 0x56, 0x55, 0x61, 0x14, 0x55, 0x95, 0x68, 0x55, 0x12, 0x55, 0x14, 0x45, 0x95, 0x85, 0x56, 0x9a, 0x5a, 0x56, 0x45, 0x51, 0x01, 0x5a, 0x51, 0x65, 0x54, 0x65, 0x54, 0x55, 0x65, 0x55, 0x95, 0x94, 0x54, 0x60, 0x45, 0x95, 0x4a, 0x41, 0x55, 0x52, 0x15, 0x9a, 0x61, 0x45, 0x15, 0x56, 0x56, 0x44, 0x55, 0x44, 0x86, 0x45, 0xa9, 0x55, 0x51, 0x69, 0x28, 0x66, 0x19, 0x05, 0x95, 0x55, 0x05, 0x95, 0x56, 0x55, 0x54, 0x11, 0x91, 0x91, 0x25, 0x99, 0x55, 0x65, 0x25, 0x01, 0x88, 0x55, 0x80, 0x80, 0x49, 0x61, 0x51, 0x14, 0x98, 0x22, 0x06, 0x84, 0x44, 0x90, 0x98, 0x8a, 0x99, 0x80, 0x56, 0x16, 0x40, 0xa5, 0xa0, 0x8a, 0x58, 0x1a, 0xa8, 0x69, 0x19, 0xa2, 0x46, 0x4a, 0xa1, 0x20, 0x89, 0xa2, 0x21, 0x00, 0x66, 0x46, 0xa4, 0x6a, 0x21, 0x28, 0xa4, 0x68, 0x4a, 0x4a, 0x02, 0x58, 0xa8, 0x46, 0x40, 0x88, 0x68, 0x15, 0x86, 0x1a, 0x82, 0x25, 0x86, 0x22, 0x65, 0x28, 0x98, 0x49, 0x81, 0x66, 0x68, 0x55, 0x96, 0x68, 0x15, 0x1a, 0x01, 0x51, 0x1a, 0x49, 0x60, 0x55, 0x12, 0x28, 0x09, 0x48, 0x91, 0x84, 0x09, 0x62, 0x42, 0x04, 0x92, 0xa8, 0x90, 0x60, 0x86, 0x55, 0x04, 0x01, 0x65, 0x0a, 0x15, 0x98, 0x90, 0xa1, 0x09, 0xa8, 0x05, 0x52, 0x82, 0x88, 0x44, 0x20, 0x19, 0x49, 0x46, 0xa2, 0x28, 0x64, 0x54, 0x91, 0x11, 0x56, 0x84, 0x88, 0x92, 0x82, 0x80, 0x81, 0x18, 0x94, 0x19, 0x46, 0x24, 0x11, 0x85, 0x2a, 0x15, 0x81, 0x2a, 0x28, 0xa2, 0x85, 0x48, 0x19, 0x2a, 0x40, 0xa8, 0x59, 0x50, 0x59, 0x46, 0x05, 0x66, 0x52, 0x81, 0x91, 0x95, 0x00, 0x25, 0x06, 0x89, 0xa2, 0x55, 0xa0, 0x82, 0x19, 0x58, 0x86, 0x24, 0x85, 0x22, 0x5a, 0xa9, 0x45, 0x5a, 0x54, 0x06, 0x08, 0xa4, 0x29, 0x42, 0x59, 0x09, 0x92, 0x60, 0xa8, 0x19, 0x54, 0x55, 0xa6, 0x02, 0x52, 0x75, 0x1f, 0x67, 0x43, 0x3d, 0x6b, 0x58, 0x58, 0x29, 0x2f, 0x13, 0xf4, 0x0d, 0x41, 0x57, 0xeb, 0x93, 0xd1, 0x65, 0x29, 0x95, 0x3b, 0x08, 0x87, 0x0a, 0x19, 0xce, 0x94, 0xc5, 0x48, 0x86, 0x00, 0x90, 0x7b, 0x74, 0x36, 0x6a, 0x74, 0x9c, 0x00, 0x66, 0xea, 0x94, 0x9a, 0xd1, 0x77, 0x19, 0x3a, 0x57, 0x86, 0x61, 0x96, 0x13, 0x15, 0x64, 0xc9, 0x2b, 0x7b, 0xf5, 0xfe, 0x1c, 0xd2, 0xd3, 0x65, 0x03, 0x87, 0xfe, 0xc3, 0xab, 0x81, 0x23, 0x8f, 0xbe, 0x86, 0xd6, 0x30, 0x1b, 0x09, 0xa1, 0xfc, 0x0a, 0x07, 0x87, 0x11, 0xa7, 0xa8, 0xd9, 0xcf, 0x14, 0x4d, 0x80, 0x78, 0x64, 0x86, 0x0d, 0x9e, 0x02, 0xa6, 0xff, 0xa9, 0x9b, 0x28, 0xc0, 0x6c, 0xec, 0x0d, 0xa3, 0xae, 0x76, 0x9e, 0x78, 0xb9, 0x9f, 0xeb, 0x68, 0x10, 0xfc, 0xcd, 0xec, 0x0e, 0x7a, 0x38, 0xdb, 0xc9, 0xce, 0xd9, 0xda, 0x7e, 0x3e, 0x8e, 0x41, 0xd5, 0x4b, 0x2e, 0xc8, 0x1f, 0x6b, 0xb2, 0xf5, 0x24, 0xa4, 0x74, 0x57, 0xb0, 0xce, 0xb8, 0xc5, 0x05, 0x67, 0x50, 0xfb, 0x02, 0xcc, 0xd2, 0x93, 0xbf, 0x78, 0x53, 0x8c, 0xf5, 0xf4, 0x48, 0x38, 0xe2, 0x93, 0x49, 0x95, 0xce, 0x7c, 0x88, 0xdf, 0xfd, 0x6f, 0x03, 0xdd, 0x67, 0x57, 0x33, 0x9d, 0x3d, 0x4f, 0xf8, 0x44, 0x3b, 0xae, 0xbc, 0xbe, 0x8e, 0xc3, 0xc1, 0x36, 0x75, 0x73, 0x8f, 0xb9, 0x95, 0xcb, 0xe3, 0xeb, 0x92, 0x29, 0x4b, 0x98, 0xcd, 0x60, 0x92, 0xfb, 0x2b, 0x2b, 0x7c, 0xd3, 0xb2, 0x32, 0x5a, 0xba, 0x99, 0x24, 0x6a, 0xf5, 0x9c, 0xa9, 0x63, 0xd5, 0x7d, 0x91, 0x58, 0xe6, 0xfa, 0x4e, 0x1e, 0x13, 0x3c, 0x1b, 0x09, 0x83, 0xc0, 0x5b, 0xd2, 0x5d, 0xe8, 0xdc, 0x42, 0x9f, 0xf7, 0x47, 0x00, 0x83, 0xd6, 0xfb, 0x5d, 0x9c, 0x5a, 0x3b, 0x57, 0xf7, 0xb2, 0x75, 0x38, 0xcf, 0xd8, 0x16, 0x24, 0xb4, 0xf2, 0xb8, 0xcb, 0x8d, 0x02, 0x68, 0xca, 0x53, 0xa2, 0x22, 0x22, 0xdf, 0x38, 0x32, 0x8e, 0xcc, 0xfb, 0xf2, 0x48, 0xaa, 0xaf, 0x05, 0x7b, 0x91, 0x58, 0x87, 0x07, 0xf9, 0x28, 0x4a, 0xa1, 0xef, 0x54, 0xe7, 0x4b, 0xdb, 0x64, 0x15, 0x9c, 0x4f, 0x12, 0x63, 0x88, 0x8a, 0xb9, 0xee, 0xd8, 0x6c, 0x0e, 0x6e, 0xdf, 0xb0, 0xf9, 0x4a, 0x14, 0x06, 0xb5, 0x26, 0xe0, 0xf4, 0x9c, 0x85, 0xdd, 0x6d, 0x23, 0xa9, 0xd6, 0xba, 0x7d, 0x1a, 0x40, 0xf6, 0x26, 0x6e, 0x30, 0x6f, 0xcb, 0xf8, 0x16, 0x25, 0x1a, 0xec, 0x03, 0x31, 0x3a, 0x8c, 0x25, 0x63, 0x9f, 0x1d, 0x64, 0x52, 0x7e, 0x90, 0xaa, 0x83, 0x2d, 0xc6, 0xe6, 0x2e, 0xf2, 0x42, 0x9c, 0x94, 0xdc, 0x86, 0xb3, 0xc5, 0x28, 0x23, 0x3b, 0x60, 0x4d, 0x6d, 0x9b, 0x8f, 0xfc, 0xe3, 0xa7, 0x78, 0x9e, 0x2d, 0x4b, 0x89, 0x62, 0x2a, 0x6e, 0x45, 0x21, 0xc3, 0x70, 0x86, 0xa5, 0x3a, 0x7f, 0x01, 0xc8, 0xc8, 0x62, 0x74, 0x01, 0x62, 0xa6, 0xea, 0x8e, 0x36, 0xf3, 0xab, 0x67, 0x61, 0x87, 0x2f, 0x37, 0x7b, 0xb9, 0x10, 0x0e, 0x1a, 0x61, 0x03, 0x79, 0x10, 0x67, 0x23, 0x25, 0xd1, 0x8e, 0xee, 0x02, 0x97, 0xf2, 0x52, 0xad, 0xf4, 0xe8, 0xb5, 0x1e, 0x60, 0xe8, 0xa4, 0x20, 0x73, 0x3a, 0x26, 0x3e, 0x20, 0xe8, 0x37, 0x41, 0x28, 0x92, 0xd3, 0x28, 0xee, 0xa3, 0xb5, 0xd6, 0xee, 0xef, 0x4a, 0x21, 0x17, 0xe1, 0x57, 0x88, 0x1c, 0x4a, 0xd0, 0x43, 0xb1, 0x24, 0xd1, 0xd2, 0xfa, 0xba, 0x20, 0x1d, 0x9b, 0x8d, 0x04, 0x48, 0xfb, 0x64, 0x21, 0x5e, 0xea, 0x47, 0xb9, 0x01, 0x0f, 0xf3, 0x85, 0x1b, 0x56, 0x64, 0xf7, 0x64, 0x99, 0xaf, 0x26, 0x1c, 0x5a, 0xfe, 0x3c, 0x7f, 0xf3, 0xa8, 0xcb, 0xb6, 0x7c, 0x70, 0x7d, 0xd2, 0xc8, 0x06, 0x2c, 0xe6, 0x46, 0x53, 0x5f, 0x04, 0x63, 0x3d, 0xd8, 0x2b, 0x5a, 0x45, 0xd8, 0x14, 0x33, 0x2f, 0xb3, 0x5a, 0x61, 0x06, 0xa5, 0xf0, 0xc4, 0xa3, 0xf8, 0x7e, 0x92, 0xd5, 0xa6, 0x7d, 0x10, 0xc0, 0x32, 0xec, 0x2b, 0x21, 0x55, 0x5c, 0xc6, 0xcc, 0x9b, 0x4c, 0xe2, 0xc0, 0xa4, 0x90, 0xf5, 0x39, 0xe8, 0xf2, 0xe4, 0x75, 0xdc, 0x51, 0xab, 0xfd, 0x93, 0x5b, 0xeb, 0x26, 0x62, 0x63, 0x29, 0x4e, 0x57, 0x4a, 0xae, 0x30, 0x94, 0x09, 0xc1, 0x28, 0x05, 0x7c, 0x2f, 0xbf, 0x11, 0x41, 0x49, 0xad, 0xed, 0x1a, 0xc5, 0xd2, 0x2f, 0x72, 0x0f, 0x48, 0xe9, 0x9f, 0xf7, 0x5f, 0xb2, 0xd2, 0x4e, 0x64, 0x52, 0x8e, 0xe6, 0x0b, 0x3d, 0x55, 0x1b, 0x05, 0x86, 0x53, 0x7b, 0x8a, 0xd9, 0x5d, 0x59, 0xe6, 0x2e, 0xf1, 0xd7, 0x1e, 0xfc, 0x6c, 0x3c, 0x4b, 0x47, 0xda, 0x55, 0xa0, 0x63, 0x87, 0xac, 0x6f, 0x31, 0x80, 0x41, 0xec, 0x8b, 0x5f, 0x47, 0x0c, 0x1d, 0xe0, 0x38, 0x68, 0x46, 0xfa, 0xd7, 0xd7, 0x33, 0x0f, 0x19, 0x30, 0x29, 0x2a, 0x69, 0x74, 0xa1, 0xec, 0xee, 0x38, 0x33, 0x43, 0xca, 0x65, 0x72, 0x84, 0x6d, 0xae, 0x15, 0x92, 0x5d, 0x49, 0x25, 0x38, 0x68, 0xdd, 0x94, 0xa9, 0x96, 0xf1, 0xe4, 0xe2, 0xf6, 0x12, 0x12, 0x2b, 0xc1, 0x83, 0x9e, 0x0d, 0x0d, 0xb4, 0x82, 0x99, 0x7c, 0xc7, 0x62, 0x70, 0x55, 0x7f, 0x99, 0x96, 0x91, 0x9a, 0x2c, 0x5e, 0xe2, 0x74, 0x0f, 0xab, 0x8b, 0x2d, 0xcc, 0x53, 0x11, 0x74, 0x25, 0x9e, 0x0d, 0x2a, 0xf3, 0x4d, 0xbc, 0x14, 0xfd, 0x20, 0xff, 0x2d, 0x16, 0x04, 0x20, 0x06, 0x3e, 0x26, 0xc3, 0x37, 0xc4, 0x68, 0xc1, 0xeb, 0x40, 0x12, 0xf8, 0xdb, 0x79, 0x1f, 0x44, 0xc9, 0xa7, 0x2b, 0x18, 0xcb, 0xd0, 0x60, 0xba, 0xab, 0x72, 0xb2, 0x8d, 0xc0, 0x13, 0xb6, 0x17, 0x56, 0xac, 0xf1, 0x9a, 0x70, 0x74, 0x1a, 0xe8, 0xc2, 0x05, 0xed, 0xe7, 0x19, 0xaf, 0x94, 0x54, 0x56, 0x51, 0x21, 0x24, 0x8c, 0xdf, 0xc2, 0x35, 0x23, 0x2d, 0x8f, 0xc7, 0x56, 0xba, 0x7a, 0x80, 0x8f, 0x93, 0x87, 0x20, 0x85, 0xbd, 0xbe, 0x94, 0x60, 0x9c, 0xb5, 0x3c, 0x43, 0xe7, 0xf4, 0x34, 0x29, 0xd4, 0xd8, 0xef, 0xc4, 0xa2, 0x08, 0x04, 0x7b, 0x5b, 0xf5, 0xe8, 0xe7, 0xd4, 0x2d, 0x81, 0x90, 0xc9, 0xb1, 0xad, 0x48, 0x13, 0xd1, 0x00, 0x71, 0x8e, 0x1a, 0xf9, 0xa4, 0xa9, 0x2a, 0x98, 0x51, 0xaf, 0x54, 0xb8, 0x6c, 0xe4, 0xf7, 0x57, 0xd0, 0x46, 0x70, 0x1e, 0x79, 0xd3, 0xf2, 0xfa, 0x52, 0xa9, 0x01, 0x84, 0x21, 0xd7, 0xb0, 0xb6, 0x7b, 0x58, 0xc2, 0x60, 0xbb, 0x97, 0xe1, 0xe9, 0x68, 0x1a, 0x53, 0x68, 0x34, 0x32, 0x36, 0x5f, 0x76, 0x76, 0x67, 0xfa, 0xec, 0x77, 0xe8, 0x39, 0xe3, 0x9e, 0x53, 0x27, 0xc9, 0xac, 0x82, 0x8b, 0x63, 0x17, 0x59, 0x53, 0xe7, 0x37, 0xa8, 0x04, 0x16, 0x44, 0x82, 0x64, 0x19, 0xef, 0x9c, 0x32, 0x15, 0xdb, 0xa0, 0x7f, 0x95, 0xf1, 0x71, 0xe7, 0xf4, 0x5b, 0x60, 0xa9, 0x3d, 0xa3, 0x84, 0x5a, 0x4a, 0xad, 0x1f, 0xa0, 0xc2, 0xaf, 0x6b, 0x95, 0x86, 0xbb, 0x7d, 0x70, 0x45, 0x7f, 0xb2, 0x11, 0xe1, 0x5a, 0x26, 0x57, 0x5f, 0xbf, 0x44, 0xec, 0xa5, 0x3f, 0xc1, 0xd4, 0x63, 0x3a, 0x86, 0xe9, 0x85, 0x41, 0xdb, 0xd0, 0x91, 0xfa, 0x8d, 0x01, 0xec, 0x17, 0x01, 0xb1, 0x6c, 0x82, 0xa2, 0x66, 0x59, 0x36, 0x23, 0x91, 0xc2, 0x1b, 0xa7, 0x79, 0xd6, 0x1a, 0xa2, 0xf1, 0x8d, 0x79, 0xce, 0x4e, 0x77, 0x49, 0x70, 0x97, 0xb0, 0x98, 0x4a, 0xc7, 0x89, 0xf7, 0xae, 0x84, 0x44, 0x54, 0x66, 0x63, 0xe0, 0x25, 0xfa, 0xf5, 0xe7, 0xf7, 0x20, 0x4e, 0xd5, 0xb6, 0x55, 0xfb, 0x1f, 0xdb, 0x21, 0x23, 0x2a, 0x7a, 0xe2, 0x61, 0x38, 0xdb, 0x6a, 0x13, 0x99, 0x9f, 0xc6, 0xed, 0xbc, 0xe5, 0x77, 0x36, 0xd6, 0xd5, 0xf1, 0xb3, 0xdf, 0x7b, 0xe0, 0x72, 0xfd, 0x43, 0x2d, 0xfe, 0x47, 0x9a, 0xd8, 0x99, 0xc6, 0xf1, 0x3c, 0x67, 0xb4, 0xf5, 0xf1, 0xcb, 0x51, 0xb4, 0x5f, 0xc6, 0x98, 0xbc, 0xde, 0xad, 0x68, 0x7e, 0x1a, 0x5f, 0xf0, 0xff, 0x64, 0x8d, 0xd9, 0xd5, 0x7d, 0x96, 0x9e, 0x8d, 0xf7, 0x8e, 0xcf, 0x3d, 0x74, 0xc5, 0x0a, 0xcb, 0x95, 0x58, 0xb7, 0x88, 0xb7, 0xa0, 0x93, 0xe4, 0x07, 0x6a, 0xf5, 0x6a, 0x3b, 0xe1, 0x8b, 0x74, 0x81, 0x0e, 0x8c, 0x53, 0x0a, 0xf2, 0x56, 0x82, 0x57, 0x10, 0x13, 0x85, 0xf9, 0xd3, 0x22, 0x3f, 0xb3, 0x60, 0x4b, 0x67, 0x70, 0x95, 0xa9, 0x4d, 0x8b, 0xa4, 0x8a, 0xb9, 0x34, 0x03, 0x74, 0x17, 0x8f, 0x26, 0xa8, 0x35, 0x7f, 0x37, 0x82, 0x84, 0xda, 0xf0, 0xc7, 0x87, 0x7a, 0xb9, 0xbd, 0x1e, 0xe0, 0xea, 0x15, 0xd1, 0xcc, 0x69, 0x04, 0x81, 0x67, 0xd6, 0x19, 0x08, 0xc3, 0x2c, 0x53, 0x51, 0x84, 0x23, 0x46, 0xe3, 0x7e, 0x18, 0xfe, 0xda, 0x8f, 0xe0, 0x3f, 0xa7, 0x81, 0x68, 0xdb, 0x46, 0xcd, 0x4c, 0x5c, 0x6b, 0x80, 0x2c, 0x4c, 0xd8, 0xb4, 0x62, 0xc8, 0x3a, 0xcb, 0xac, 0xc1, 0x58, 0x20, 0xa0, 0xfb, 0x5a, 0xed, 0x4f, 0x15, 0xee, 0x20, 0xfd, 0xc5, 0xb6, 0xc4, 0x41, 0x29, 0xb0, 0xf8, 0x11, 0x61, 0xae, 0x90, 0x03, 0xcd, 0x28, 0xc6, 0xce, 0xd2, 0x34, 0xd7, 0x9c, 0x55, 0x4a, 0xaf, 0xba, 0x30, 0xeb, 0x43, 0x5f, 0x89, 0xd3, 0x01, 0xde, 0x2f, 0xd8, 0x6d, 0x95, 0xfa, 0xb4, 0x67, 0x64, 0x1f, 0x71, 0xcc, 0xbe, 0x37, 0x46, 0x58, 0x86, 0x0d, 0xca, 0x2d, 0xd3, 0x1d, 0x60, 0x83, 0xe3, 0xd2, 0x96, 0x47, 0xc2, 0xfb, 0xe5, 0x20, 0x1e, 0x6c, 0x08, 0xc4, 0x26, 0x71, 0x0b, 0xab, 0x10, 0x59, 0xc6, 0x29, 0xe8, 0xb5, 0x5b, 0x2c, 0x88, 0xae, 0x56, 0x2d, 0x1e, 0xe4, 0xc3, 0xc0, 0x2b, 0x44, 0xc5, 0xf2, 0xbd, 0xa7, 0x23, 0x3b, 0xe3, 0x7d, 0xb4, 0xfb, 0x8b, 0x0e, 0xf5, 0x13, 0x41, 0x19, 0x46, 0x9d, 0xd2, 0x2b, 0x33, 0x0b, 0x57, 0xa8, 0xba, 0x7a, 0x70, 0xed, 0xfc, 0x50, 0x54, 0xc0, 0x34, 0x95, 0x93, 0x08, 0x7e, 0x0c, 0x4d, 0x42, 0x49, 0xc8, 0x7e, 0x5d, 0xf7, 0x08, 0x8f, 0xf0, 0xd6, 0x8a, 0x6e, 0x95, 0xdf, 0x97, 0x32, 0x78, 0x1d, 0xd6, 0xea, 0x5a, 0x06, 0xc8, 0x78, 0x67, 0x9b, 0x95, 0xb3, 0xff, 0x32, 0xd8, 0xb7, 0x66, 0x62, 0x29, 0xce, 0x68, 0x13, 0x15, 0xd8, 0x31, 0xc7, 0xe8, 0xd6, 0x53, 0x1f, 0xf6, 0x92, 0x38, 0xac, 0x09 }; static unsigned char xc[] = { 0xf1, 0x43, 0x60, 0x72, 0x21, 0x2b, 0x90, 0xc7, 0x57, 0x44, 0x2f, 0xd7, 0x5b, 0x43, 0xc5, 0x3b, 0x7b, 0x33, 0x67, 0x84, 0xb6, 0xa3, 0x4a, 0x28, 0xf3, 0x53, 0xd6, 0x7c, 0x83, 0x58, 0xb6, 0x43, 0x26, 0x5f, 0xf3, 0xa8, 0x7e, 0x57, 0x73, 0xa6, 0x10, 0x30, 0x12, 0x90, 0x52, 0x77, 0x00, 0x4d, 0x77, 0xfb, 0x05, 0x1c, 0x0d, 0xd3, 0x64, 0xc1, 0x69, 0x19, 0x5a, 0xb8, 0x1c, 0x9b, 0x6e, 0x09, 0x3d, 0xff, 0xc7, 0xf4, 0x89, 0x57, 0x1b, 0x28, 0xde, 0x41, 0x11, 0x74, 0x63, 0x3a, 0xa6, 0xc2, 0x4b, 0xcc, 0x3a, 0xa9, 0xa5, 0x3b, 0x1d, 0x30, 0xe4, 0xdc, 0x3a, 0xdc, 0xa8, 0xc5, 0xa4, 0x6c, 0x14, 0xae, 0xd8, 0x20, 0xf1, 0xb9, 0x21, 0xae, 0xf1, 0x9a, 0x22, 0x14, 0x01, 0x53, 0xc6, 0x25, 0x64, 0x79, 0x75, 0x27, 0x56, 0x18, 0xf9, 0xd0, 0x4a, 0x04, 0xb9, 0xef, 0x74, 0xc4, 0xa9, 0xfc, 0x47, 0xb2, 0x99, 0xa3, 0x68, 0x48, 0x06, 0xd5, 0x11, 0x9f, 0x03, 0x36, 0xff, 0xa2, 0x9a, 0xd8, 0xfb, 0xb3, 0xd0, 0xe9, 0xf3, 0x58, 0x02, 0xd4, 0x8a, 0x4f, 0xd7, 0x7c, 0xdb, 0xe4, 0xb8, 0xbc, 0x8d, 0x32, 0xdd, 0x94, 0xe5, 0xdf, 0xe3, 0x15, 0x12, 0xe0, 0x81, 0xcc, 0x67, 0xe6, 0xe3, 0xb0, 0xd1, 0x40, 0x9e, 0x2b, 0x13, 0xc5, 0x57, 0x24, 0xaf, 0xe0, 0x92, 0x3c, 0xa9, 0x9f, 0x47, 0xb5, 0x00, 0x90, 0xfc, 0x72, 0xb8, 0xcb, 0xcf, 0xf4, 0xae, 0x52, 0x8e, 0xa6, 0x9d, 0x7b, 0x15, 0x0b, 0xf5, 0xd2, 0x6c, 0xe1, 0xe8, 0xd7, 0x05, 0x09, 0x1a, 0x9a, 0xfd, 0x6b, 0x29, 0x7b, 0x1d, 0x37, 0xa1, 0x5e, 0x93, 0x37, 0xd9, 0xd6, 0x0d, 0x06, 0x4c, 0x04, 0x8a, 0xb9, 0xfd, 0xc2, 0x7b, 0xd8, 0x74, 0x13, 0x3f, 0x25, 0xb2, 0x35, 0x24, 0x3a, 0x96, 0x7e, 0x4d, 0x0b, 0x49, 0x53, 0x6d, 0x7e, 0x0b, 0xdf, 0xd3, 0xfc, 0x1c, 0x36, 0x3f, 0x7d, 0x42, 0xdd, 0x0f, 0x5b, 0x50, 0xd5, 0x01, 0xd8, 0x09, 0x59, 0xaa, 0xdb, 0x19, 0x9f, 0xb7, 0xd4, 0x6f, 0x12, 0xe5, 0x73, 0x3c, 0x58, 0x86, 0xc9, 0x34, 0x91, 0xbb, 0xdd, 0x31, 0x57, 0xaf, 0xaf, 0x08, 0x3a, 0x21, 0x96, 0xc0, 0xf0, 0x84, 0xc0, 0x4a, 0x1c, 0xfd, 0x86, 0xe6, 0xb1, 0xc3, 0xec, 0x9d, 0x7f, 0x86, 0x4d, 0xaa, 0xd4, 0x3a, 0x6e, 0xb3, 0xe1, 0x89, 0xcc, 0x63, 0x64, 0x9c, 0x55, 0xe9, 0x20, 0xfc, 0xaa, 0x77, 0x77, 0x89, 0x09, 0x8c, 0x53, 0x1f, 0x9b, 0xbd, 0x1f, 0xda, 0x22, 0x1d, 0xa7, 0x19, 0x96, 0x31, 0x4b, 0x1a, 0x56, 0x59, 0xe9, 0x86, 0x73, 0x44, 0xcb, 0x75, 0x98, 0xed, 0x9c, 0xa1, 0xcc, 0xf6, 0xf5, 0x4e, 0x01, 0x9d, 0xc0, 0xb4, 0xa4, 0x4d, 0x46, 0xeb, 0x03, 0xd2, 0x02, 0x86, 0x46, 0x50, 0x5e, 0x9a, 0xc8, 0x17, 0x0f, 0xf4, 0x37, 0x5a, 0xc8, 0xce, 0x17, 0x68, 0x61, 0x5f, 0xe1, 0x2d, 0xf1, 0x83, 0x25, 0xf5, 0xd4, 0x53, 0xf6, 0x59, 0x06, 0x16, 0xfd, 0xca, 0x80, 0x18, 0x0e, 0x81, 0x50, 0x2a, 0x31, 0xc1, 0x6a, 0x9f, 0xd1, 0xcb, 0x2f, 0xf5, 0x9c, 0xe2, 0x5f, 0x32, 0x76, 0xff, 0x4c, 0xe4, 0x86, 0x48, 0xe4, 0xf3, 0x62, 0x05, 0x40, 0x8c, 0x3c, 0xd1, 0xb1, 0x6b, 0x06, 0x4b, 0x79, 0x99, 0x15, 0x74, 0x34, 0x32, 0x7a, 0x41, 0x39, 0xe4, 0x98, 0xcb, 0x01, 0x98, 0x70, 0x11, 0x3c, 0xee, 0xe1, 0x64, 0x55, 0xa2, 0x29, 0x99, 0xbb, 0x66, 0xb0, 0x19, 0x2f, 0x41, 0x54, 0x96, 0x8f, 0x77, 0xb2, 0x2b, 0x88, 0xdd, 0xa7, 0xaf, 0xb0, 0x84, 0x20, 0x9c, 0x5d, 0x83, 0x43, 0x35, 0x08, 0x42, 0xb5, 0x0c, 0x6d, 0x0a, 0xb0, 0xf5, 0xa6, 0x5b, 0xf2, 0x06, 0xcd, 0x43, 0x41, 0x39, 0x96, 0x36, 0x4e, 0x08, 0x94, 0x5a, 0x2c, 0x49, 0x0a, 0xee, 0x33, 0x32, 0x8c, 0x98, 0x4b, 0x97, 0x4f, 0x89, 0x82, 0x6f, 0x57, 0x72, 0xdd, 0xb5, 0xdc, 0x9b, 0x7f, 0xc4, 0x00, 0x7b, 0x88, 0xb2, 0x1a, 0xc0, 0x06, 0x2c, 0x08, 0x9e, 0xcf, 0x70, 0x43, 0x57, 0x8b, 0xb7, 0xc6, 0xa9, 0x5c, 0xe9, 0x1c, 0x79, 0xf6, 0xbf, 0x0c, 0x66, 0x36, 0xc4, 0xf6, 0xca, 0xe4, 0x5b, 0xe4, 0xb0, 0x60, 0xc3, 0xcd, 0xdd, 0xed, 0x0c, 0xff, 0xe2, 0x60, 0xd3, 0x2a, 0x58, 0x81, 0x48, 0xd1, 0x60, 0xf5, 0x35, 0x1c, 0x82, 0x68, 0xbd, 0xf8, 0xc1, 0x5d, 0x31, 0xce, 0x68, 0xb1, 0x8d, 0x9f, 0x06, 0xe4, 0x69, 0x87, 0x3a, 0xf1, 0x6e, 0xd3, 0x1c, 0x86, 0x3e, 0xe2, 0xf0, 0x13, 0x1b, 0xde, 0x89, 0x5f, 0x90, 0x5f, 0xcb, 0x3d, 0xd4, 0xdf, 0x0d, 0xf3, 0x81, 0x2b, 0x43, 0xda, 0x82, 0xd4, 0x12, 0xbf, 0x26, 0x32, 0xdf, 0x60, 0x15, 0x87, 0x7d, 0x70, 0x60, 0xeb, 0x25, 0x2a, 0xe1, 0x10, 0xda, 0xaa, 0x8d, 0x2f, 0xb8, 0x1e, 0x79, 0xb8, 0x7c, 0x3b, 0x4a, 0xc6, 0xc8, 0x81, 0x4a, 0x05, 0xc0, 0x2c, 0x7d, 0xe7, 0x2d, 0x34, 0x57, 0xec, 0xdb, 0x81, 0x89, 0x0c, 0x72, 0xce, 0x28, 0xcc, 0x5a, 0x56, 0x9d, 0x21, 0xb0, 0x0d, 0x72, 0xba, 0xc8, 0x68, 0x91, 0x70, 0xb1, 0x15, 0xf9, 0x2a, 0xe2, 0x59, 0x1c, 0xcc, 0x1e, 0x6d, 0x40, 0x24, 0x11, 0xef, 0x42, 0xa7, 0x4c, 0x36, 0x10, 0xbe, 0x09, 0x75, 0x57, 0xcc, 0xb0, 0x48, 0x8a, 0xb7, 0xf7, 0xb8, 0xd2, 0xb2, 0x8e, 0xea, 0x42, 0xfd, 0x3e, 0x86, 0x24, 0x31, 0x2c, 0x95, 0x5e, 0x6b, 0xab, 0xe5, 0x62, 0xb0, 0x49, 0xde, 0x41, 0xbf, 0x01, 0x76, 0x04, 0xdf, 0x3a, 0x0d, 0xfb, 0x44, 0x94, 0x98, 0xa3, 0xdd, 0x6a, 0xf9, 0xe8, 0x91, 0x80, 0x13, 0x45, 0xc5, 0xdb, 0x9f, 0xe4, 0x4d, 0x3f, 0x2a, 0xde, 0x2a, 0xf8, 0xf6, 0x93, 0x88, 0x3c, 0x29, 0xc5, 0xa9, 0xfb, 0x28, 0xcd, 0x64, 0x96, 0x51, 0x76, 0x50, 0x1a, 0x07, 0x68, 0x83, 0x56, 0x03, 0x82, 0x48, 0x81, 0xf8, 0x7c, 0x5a, 0x21, 0xe8, 0x22, 0x62, 0xeb, 0x10, 0xd2, 0x07, 0x5e, 0x0a, 0x26, 0x0c, 0x5c, 0xa2, 0xf5, 0x5f, 0xe3, 0xc6, 0xa3, 0x88, 0x1e, 0x32, 0xcd, 0xb2, 0xb9, 0xa9, 0x12, 0xbc, 0xd5, 0xc3, 0xe4, 0x4c, 0x82, 0xfc, 0xbb, 0xc1, 0x98, 0x8b, 0xa1, 0xdc, 0x80, 0x7b, 0x45, 0x97, 0xf9, 0x30, 0x53, 0x00, 0x82, 0x40, 0x29, 0x9f, 0xeb, 0xd1, 0x6a, 0x37, 0xd1, 0x6e, 0x11, 0x0f, 0x35, 0x8d, 0x57, 0x2e, 0xed, 0x13, 0xbd, 0x64, 0xa8, 0x26, 0x79, 0xb7, 0xb8, 0x84, 0x27, 0x32, 0x40, 0x73, 0x32, 0xa1, 0x89, 0x97, 0x4f, 0x3d, 0xea, 0xc0, 0xc7, 0x22, 0x68, 0xc7, 0xbc, 0x76, 0x88, 0x05, 0x1e, 0xc5, 0x42, 0xfb, 0x4c, 0x25, 0xab, 0xaf, 0x1d, 0x0c, 0x93, 0xa1, 0xeb, 0xb4, 0x35, 0x6d, 0x9e, 0x01, 0x79, 0x64, 0xa0, 0x97, 0x7f, 0x84, 0x58, 0x86, 0xe2, 0x1a, 0x50, 0x94, 0x99, 0xe3, 0xc1, 0xc5, 0xd7, 0x73, 0xc1, 0xe4, 0x45, 0x60, 0xfc, 0x30, 0x5c, 0x33, 0x44, 0xe7, 0x8d, 0x30, 0x25, 0x5f, 0x79, 0x44, 0xc6, 0xfb, 0x38, 0xb6, 0x5d, 0xd9, 0x54, 0x96, 0xb7, 0xfb, 0x67, 0x22, 0x17, 0x65, 0xf5, 0x2d, 0x4b, 0xe4, 0x18, 0x00, 0xb3, 0x6d, 0x5c, 0x1a, 0x89, 0x3f, 0xe1, 0x7e, 0xc7, 0xf5, 0x4d, 0x3b, 0x9f, 0x4c, 0xc9, 0x5d, 0x9f, 0xa4, 0x98, 0x06, 0x3c, 0xb6, 0xac, 0x89, 0x80, 0x90, 0x25, 0x4e, 0x53, 0x05, 0xc5, 0x9f, 0x40, 0xa0, 0xdb, 0x3b, 0x95, 0xf0, 0x09, 0xd8, 0xeb, 0x00, 0x31, 0x95, 0xc6, 0x8a, 0x8e, 0xfa, 0xd9, 0xb5, 0x82, 0xea, 0xa9, 0x9a, 0x14, 0xea, 0x70, 0x00, 0xbe, 0x48, 0xa5, 0x64, 0x6a, 0x66, 0x77, 0xc6, 0xc5, 0x7a, 0x37, 0x59, 0xf7, 0xb5, 0xea, 0x38, 0xb4, 0x1d, 0x2f, 0xe4, 0xe4, 0x90, 0x39, 0xc3, 0xca, 0x96, 0x69, 0x98, 0x4e, 0xf3, 0xd4, 0x45, 0x36, 0x24, 0xb0, 0xe3, 0x08, 0x41, 0x67, 0x34, 0xcd, 0xe0, 0x0c, 0x9f, 0x02 }; static unsigned char xk1[] = { 0xb7, 0x19, 0xb0, 0xae, 0x96, 0x55, 0xe7, 0x35, 0xbb, 0x84, 0x0a, 0x09, 0xd7, 0x66, 0x8b, 0xd2, 0x65, 0xd2, 0x23, 0x59, 0xf9, 0xc3, 0x75, 0xdb, 0x3c, 0xb4, 0x35, 0x89, 0xaf, 0xf1, 0xd9, 0x8b, 0x52, 0x8b, 0x3f, 0x2e, 0xfc, 0x41, 0x4a, 0x82, 0x10, 0xb2, 0x42, 0x89, 0xa3, 0x8d, 0xdf, 0x15, 0x50, 0x7d, 0x97, 0x27, 0x20, 0x12, 0x13, 0xaa, 0xf2, 0x7a, 0x83, 0x28, 0xd4, 0x20, 0x19, 0x02 }; tinyssh-20250501/old/crypto-tests/crypto_onetimeauth_poly1305test.c000066400000000000000000000035401500472222400252530ustar00rootroot00000000000000/* 20141017 Jan Mojzis Public domain. */ #include "misc.h" #include "crypto_onetimeauth_poly1305.h" #define SPACESIZE 5232 static unsigned char space[SPACESIZE + 16]; static unsigned char key[crypto_onetimeauth_poly1305_KEYBYTES + 16]; static unsigned char buf[crypto_onetimeauth_poly1305_BYTES + 16]; static unsigned char test_pseudorandom_checksum[32] = { 0xaf, 0xe7, 0xbb, 0x79, 0x2a, 0xe5, 0x81, 0xee, 0xbc, 0x1f, 0x5b, 0x79, 0x96, 0xb7, 0x27, 0x1a, 0xc2, 0x74, 0x65, 0x0e, 0x1d, 0xb5, 0xb7, 0x06, 0x10, 0x42, 0x6a, 0x50, 0x57, 0x8b, 0xf1, 0xb0 }; static void test_pseudorandom(void) { long long i, j; checksum_zero(); i = 0; for (j = 0; j < SPACESIZE; j += 1 + j / 16) { pseudorandombytes(space + i, j); pseudorandombytes(key + i, crypto_onetimeauth_poly1305_KEYBYTES); crypto_onetimeauth_poly1305(buf + i, space + i, j, key + i); checksum(buf + i, crypto_onetimeauth_poly1305_BYTES); if (crypto_onetimeauth_poly1305_verify(buf + i, space + i, j, key + i) != 0) { fail_printdata("m", space + i, j); fail_printdata("key", key + i, crypto_onetimeauth_poly1305_KEYBYTES); fail_printdata("a", buf + i, crypto_onetimeauth_poly1305_BYTES); fail("crypto_onetimeauth_poly1305_verify() failure"); } ++i; i %= 16; } fail_whenbadchecksum(test_pseudorandom_checksum); } static void test_1(void) { unsigned char k[32] = {2}; unsigned char m[16] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; unsigned char o[16] = {3}; if (crypto_onetimeauth_poly1305_verify(o, m, sizeof m, k) != 0) { fail("crypto_onetimeauth_poly1305_verify() failure"); } } int main(void) { test_pseudorandom(); test_1(); _exit(0); } tinyssh-20250501/old/crypto-tests/crypto_scalarmult_curve25519test.c000066400000000000000000000077331500472222400253460ustar00rootroot00000000000000/* 20141017 Jan Mojzis Public domain. */ #include "misc.h" #include "crypto_scalarmult_curve25519.h" #define BYTES crypto_scalarmult_curve25519_BYTES #define SCALARBYTES crypto_scalarmult_curve25519_SCALARBYTES static unsigned char pk[BYTES]; static unsigned char sk1[SCALARBYTES + 16]; static unsigned char pk1[BYTES + 16]; static unsigned char k1[BYTES + 16]; static unsigned char sk2[SCALARBYTES + 16]; static unsigned char pk2[BYTES + 16]; static unsigned char k2[BYTES + 16]; static unsigned char S[BYTES] = { 9 }; static unsigned char R[BYTES] = { 0xf9, 0xc3, 0xda, 0xc2, 0x10, 0x4c, 0x80, 0xb2, 0x52, 0xd0, 0xae, 0xec, 0x37, 0x7a, 0xfd, 0x5d, 0x1e, 0xf2, 0xc8, 0xc3, 0x48, 0xc2, 0x9e, 0x12, 0xdd, 0xb2, 0xd0, 0xc8, 0xb1, 0x98, 0xff, 0x7f }; static unsigned char d[SCALARBYTES] = { 0x56, 0x2c, 0x1e, 0xb5, 0xfd, 0xb2, 0x81, 0x29, 0xbd, 0x37, 0x49, 0x58, 0x35, 0xd4, 0xb1, 0x30, 0x7d, 0xdb, 0x57, 0x38, 0x80, 0x12, 0x17, 0x42, 0xf7, 0x13, 0xf1, 0x05, 0x67, 0x69, 0xd5, 0xbf }; static void test_vector(void) { long long j; unsigned char r[BYTES]; if (crypto_scalarmult_curve25519(r, d, S) != 0) fail("crypto_scalarmult_curve25519() failure"); for (j = 0; j < BYTES; ++j) if (r[j] != R[j]) fail("crypto_scalarmult_curve25519() failure"); } static unsigned char skdata[1080][32] = { #include "precomp.data" }; static unsigned char pkdata[1080][32] = { #include "precomp_curve25519.data" }; static void test_base(void) { long long i, j; checksum_zero(); for (i = 0; i < 1080; ++i) { if (crypto_scalarmult_curve25519_base(pk, skdata[i]) != 0) { fail_printdata("sk", skdata[i], SCALARBYTES); fail("crypto_scalarmult_curve25519_base() failure, please report it !!!!!!!!!"); } for (j = 0; j < BYTES; ++j) if (pk[j] != pkdata[i][j]) { fail_printdata("pk_computed", pk, BYTES); fail_printdata("pk_expected", pkdata[i], BYTES); fail_printdata("sk", skdata[i], SCALARBYTES); fail("crypto_scalarmult_curve25519() failure, please report it !!!!!!!!!"); } } } static const unsigned char basepoint[BYTES] = { 9 }; static unsigned char test_scalarmult_checksum[32] = { 0xca, 0xf4, 0xa3, 0xbe, 0x00, 0x9c, 0x6f, 0x01, 0xb8, 0x4e, 0xf8, 0x0d, 0x0a, 0x17, 0x16, 0x42, 0xfe, 0x01, 0x59, 0x40, 0x74, 0xd4, 0xa6, 0x48, 0x07, 0x94, 0x95, 0x94, 0xab, 0xa4, 0x5e, 0x6d }; static void test_scalarmult(void) { long long i, j; unsigned char outpk[BYTES]; for (i = 0; i < BYTES; ++i) pk[i] = basepoint[i]; checksum_zero(); for (i = 0; i < 1080; ++i) { pk[31] |= 128; if (crypto_scalarmult_curve25519(outpk, skdata[i], pk) != 0) { fail_printdata("pk", pk, BYTES); fail_printdata("sk", skdata[i], SCALARBYTES); fail("crypto_scalarmult_curve25519() failure, please report it !!!!!!!!!"); } checksum(outpk, BYTES); for (j = 0; j < BYTES; ++j) pk[j] = outpk[j]; } fail_whenbadchecksum(test_scalarmult_checksum); } static void test_random(void) { long long i, j; for (i = 0; i < 16; ++i) { unsaferandombytes(sk1 + i, SCALARBYTES); unsaferandombytes(sk2 + i, SCALARBYTES); if (crypto_scalarmult_curve25519_base(pk1 + i, sk1 + i) != 0) goto fail; pk1[31 + i] |= 128; if (crypto_scalarmult_curve25519_base(pk2 + i, sk2 + i) != 0) goto fail; pk2[31 + i] |= 128; if (crypto_scalarmult_curve25519(k1 + i, sk1 + i, pk2 + i) != 0) goto fail; if (crypto_scalarmult_curve25519(k2 + i, sk2 + i, pk1 + i) != 0) goto fail; for (j = 0; j < BYTES; ++j) if (k1[j + i] != k2[j + i]) goto fail; } return; fail: fail_printdata("sk1", sk1 + i, SCALARBYTES); fail_printdata("sk2", sk2 + i, SCALARBYTES); fail("crypto_scalarmult_curve25519() failure, please report it !!!!!!!!!"); } int main(void) { test_vector(); test_base(); test_scalarmult(); test_random(); _exit(0); } tinyssh-20250501/old/crypto-tests/crypto_sign_ed25519test.c000066400000000000000000000074731500472222400234040ustar00rootroot00000000000000/* 20141017 Jan Mojzis Public domain. */ #include #include "misc.h" #include "crypto_sign_ed25519.h" #define MLEN 5232 static unsigned char space[MLEN + 16]; static unsigned char m[MLEN + crypto_sign_ed25519_BYTES + 16]; static unsigned char sm[MLEN + crypto_sign_ed25519_BYTES + 16]; static unsigned char sk[crypto_sign_ed25519_SECRETKEYBYTES + 16]; static unsigned char pk[crypto_sign_ed25519_PUBLICKEYBYTES + 16]; static unsigned long long mlen; static unsigned long long smlen; static unsigned char test_precomp_checksumsha2[32] = { 0x63, 0xe6, 0x3c, 0xcf, 0x4a, 0x50, 0x12, 0xdc, 0xc5, 0xec, 0x43, 0x76, 0x52, 0x6c, 0xf1, 0x5c, 0x7b, 0x12, 0xb2, 0xa5, 0xee, 0x77, 0x71, 0x63, 0xd0, 0x3a, 0xf1, 0x84, 0xe0, 0xd2, 0x06, 0x13 }; static unsigned char test_precomp_checksumsha3[32] = { 0x18, 0x03, 0xc1, 0x7e, 0xf4, 0x2c, 0x56, 0xce, 0xc0, 0xc4, 0xb2, 0xc3, 0x29, 0xf7, 0xa8, 0x8c, 0x1e, 0xfe, 0xd2, 0x9c, 0xf3, 0xdb, 0xe5, 0x61, 0x2d, 0x22, 0xf9, 0x0c, 0xd9, 0x0f, 0xf2, 0x7f }; static unsigned char skdata[1080][32] = { #include "precomp.data" }; static unsigned char pkdata[1080][32] = { #include "precomp_ed25519.data" }; static void test_precomp(void) { long long i, j; pseudorandombytes(space, sizeof space); checksum_zero(); for (i = 0; i < 1080; ++i) { for (j = 31; j >= 0; --j) sk[j ] = skdata[i][j]; for (j = 31; j >= 0; --j) sk[j + 32] = pkdata[i][j]; for (j = 31; j >= 0; --j) pk[j ] = pkdata[i][j]; crypto_sign_ed25519(sm, &smlen, space, MLEN - i, sk); checksum(sm, crypto_sign_ed25519_BYTES); if (crypto_sign_ed25519_open(m, &mlen, sm, smlen, pk) != 0) { fail_printdata("sm", sm, smlen); fail_printdata("pk", pk, crypto_sign_ed25519_PUBLICKEYBYTES); fail_printdata("sk", sk, crypto_sign_ed25519_SECRETKEYBYTES); fail("crypto_sign_ed25519_open() failure, please report it !!!!!!!!!"); } } if (!checksum_check((test_precomp_checksumsha2)) && !checksum_check((test_precomp_checksumsha3))) { fail_whenbadchecksum(test_precomp_checksumsha3); } } static void test_random(void) { long long i, j; i = 0; for (j = 0; j < sizeof space; j += 1 + j / 16) { unsaferandombytes(space + i, j); if (crypto_sign_ed25519_keypair(pk + i, sk + i) != 0) fail("crypto_sign_ed25519_keypair() failure"); crypto_sign_ed25519(sm + i, &smlen, space + i, j, sk + i); if (crypto_sign_ed25519_open(m + i, &mlen, sm + i, smlen, pk + i) != 0) { fail_printdata("sm", sm + i, smlen); fail_printdata("pk", pk + i, crypto_sign_ed25519_PUBLICKEYBYTES); fail_printdata("sk", sk + i, crypto_sign_ed25519_SECRETKEYBYTES); fail("crypto_sign_ed25519_open() failure, please report it !!!!!!!!!"); } ++i; i %= 16; } } static void test_signopen(void) { unsigned char m[1024]; unsigned char sm[1024]; unsigned char om[1024]; unsigned long long smlen = 0; unsigned long long omlen; if (crypto_sign_ed25519_keypair(pk, sk) != 0) fail("crypto_sign_ed25519_keypair() failure"); pseudorandombytes(m, sizeof m); crypto_sign_ed25519(sm, &smlen, m + 64, sizeof m - 64, sk); if (crypto_sign_ed25519_open(om, &omlen, sm, sizeof sm, pk) != 0) { fail_printdata("sm", sm, smlen); fail_printdata("pk", pk, crypto_sign_ed25519_PUBLICKEYBYTES); fail_printdata("sk", sk, crypto_sign_ed25519_SECRETKEYBYTES); fail("crypto_sign_ed25519_open() failure, please report it !!!!!!!!!"); } if (memcmp(m + 64, om, sizeof m - 64)) { fail("crypto_sign_ed25519_open() failure, messages do not match"); } } int main(void) { _exit(0); test_precomp(); test_random(); test_signopen(); _exit(0); } tinyssh-20250501/old/crypto-tests/crypto_sort_uint32test.c000066400000000000000000000015511500472222400235500ustar00rootroot00000000000000#include "misc.h" #include "crypto_uint32.h" #include "crypto_sort_uint32.h" static void test_321(void) { crypto_uint32 x[3] = {3, 2, 1}; crypto_sort_uint32(x, 3); if (x[0] != 1) fail("crypto_sort_uint32() failure"); if (x[1] != 2) fail("crypto_sort_uint32() failure"); if (x[2] != 3) fail("crypto_sort_uint32() failure"); } static void test_i(void) { crypto_uint32 x[5] = { (crypto_uint32) -1, (crypto_uint32) -2, 2, 1, 0}; crypto_sort_uint32(x, 5); if (x[0] != 0) fail("crypto_sort_uint32() failure"); if (x[1] != 1) fail("crypto_sort_uint32() failure"); if (x[2] != 2) fail("crypto_sort_uint32() failure"); if (x[3] != (crypto_uint32) -2) fail("crypto_sort_uint32() failure"); if (x[4] != (crypto_uint32) -1) fail("crypto_sort_uint32() failure"); } int main(void) { test_321(); test_i(); _exit(0); } tinyssh-20250501/old/crypto-tests/crypto_stream_chacha20test.c000066400000000000000000000024171500472222400243030ustar00rootroot00000000000000/* 20140709 Jan Mojzis Public domain. */ #include #include "misc.h" #include "crypto_stream_chacha20.h" static unsigned char space[5232]; static unsigned char k[crypto_stream_chacha20_KEYBYTES + 16]; static unsigned char n[crypto_stream_chacha20_NONCEBYTES + 16]; static unsigned char o[32] = { 0x98, 0x43, 0x28, 0xe2, 0x76, 0xc2, 0xc3, 0xa1, 0xe8, 0xf3, 0x50, 0x98, 0x15, 0xc4, 0xea, 0xa6, 0x2c, 0x54, 0x87, 0x1b, 0x02, 0x4c, 0x61, 0xd1, 0x01, 0xd9, 0xf0, 0xb1, 0xd5, 0x21, 0xc4, 0x7a }; static void test_alignment(void) { long long i; for (i = 0; i < 16; ++i) { crypto_stream_chacha20_xor(space + i, space + i, sizeof space - i, n + i, k + i); } } static void test_rand(void) { long long i, j; unsigned int u; pseudorandombytes(space, sizeof space); pseudorandombytes(k, sizeof k); pseudorandombytes(n, sizeof n); for (i = 0; i < sizeof space; i += 1 + i / 16) { u = 1; for (j = 0; j < 8; ++j) { u += (unsigned int) n[j]; n[j] = u; u >>= 8; } crypto_stream_chacha20_xor(space, space, i, n, k); } checksum(space, sizeof space); fail_whenbadchecksum(o); } int main(void) { test_alignment(); test_rand(); _exit(0); } tinyssh-20250501/old/crypto-tests/crypto_verify_16test.c000066400000000000000000000017011500472222400231640ustar00rootroot00000000000000/* 20140167 Jan Mojzis Public domain. */ #include "misc.h" #include "crypto_verify_16.h" static unsigned char b1[crypto_verify_16_BYTES + 16]; static unsigned char b2[crypto_verify_16_BYTES + 16]; static void test_alignment(void) { long long i; for (i = 0; i < sizeof b1; ++i) b1[i] = 0xff; for (i = 0; i < sizeof b2; ++i) b2[i] = 0xff; for (i = 0; i < 16; ++i) { if (crypto_verify_16(b1 + i, b2 + i) != 0) fail("crypto_verify_16 failure"); } } static void test_verify(void) { long long i; for (i = 0; i < sizeof b1; ++i) b1[i] = 0xff; for (i = 0; i < sizeof b2; ++i) b2[i] = 0xff; if (crypto_verify_16(b1, b2) != 0) fail("crypto_verify_16 failure"); for (i = 0; i < crypto_verify_16_BYTES; ++i) { b1[i] = 0; if (crypto_verify_16(b1, b2) == 0) fail("crypto_verify_16 failure"); b1[i] = 0xff; } } int main(void) { test_alignment(); test_verify(); _exit(0); } tinyssh-20250501/old/crypto-tests/crypto_verify_32test.c000066400000000000000000000017011500472222400231620ustar00rootroot00000000000000/* 20140167 Jan Mojzis Public domain. */ #include "misc.h" #include "crypto_verify_32.h" static unsigned char b1[crypto_verify_32_BYTES + 16]; static unsigned char b2[crypto_verify_32_BYTES + 16]; static void test_alignment(void) { long long i; for (i = 0; i < sizeof b1; ++i) b1[i] = 0xff; for (i = 0; i < sizeof b2; ++i) b2[i] = 0xff; for (i = 0; i < 16; ++i) { if (crypto_verify_32(b1 + i, b2 + i) != 0) fail("crypto_verify_32 failure"); } } static void test_verify(void) { long long i; for (i = 0; i < sizeof b1; ++i) b1[i] = 0xff; for (i = 0; i < sizeof b2; ++i) b2[i] = 0xff; if (crypto_verify_32(b1, b2) != 0) fail("crypto_verify_32 failure"); for (i = 0; i < crypto_verify_32_BYTES; ++i) { b1[i] = 0; if (crypto_verify_32(b1, b2) == 0) fail("crypto_verify_32 failure"); b1[i] = 0xff; } } int main(void) { test_alignment(); test_verify(); _exit(0); } tinyssh-20250501/old/crypto-tests/misc.h000066400000000000000000000104121500472222400200110ustar00rootroot00000000000000#ifndef _MISC_H____ #define _MISC_H____ #include #include #include #include #include "crypto_uint8.h" #include "crypto_uint32.h" #include "crypto_uint64.h" typedef crypto_uint8 u8; typedef crypto_uint32 u32; typedef crypto_uint64 u64; #define FOR(i,n) for (i = 0;i < n;++i) static u32 L32(u32 x,int c) { return (x << c) | ((x&0xffffffff) >> (32 - c)); } static u32 ld32(const u8 *x) { u32 u = x[3]; u = (u<<8)|x[2]; u = (u<<8)|x[1]; return (u<<8)|x[0]; } static void st32(u8 *x,u32 u) { int i; FOR(i,4) { x[i] = u; u >>= 8; } } static const u8 sigma[17] = "expand 32-byte k"; static void core(u8 *out,const u8 *in,const u8 *k) { u32 w[16],x[16],y[16],t[4]; int i,j,m; FOR(i,4) { x[5*i] = ld32(sigma+4*i); x[1+i] = ld32(k+4*i); x[6+i] = ld32(in+4*i); x[11+i] = ld32(k+16+4*i); } FOR(i,16) y[i] = x[i]; FOR(i,20) { FOR(j,4) { FOR(m,4) t[m] = x[(5*j+4*m)%16]; t[1] ^= L32(t[0]+t[3], 7); t[2] ^= L32(t[1]+t[0], 9); t[3] ^= L32(t[2]+t[1],13); t[0] ^= L32(t[3]+t[2],18); FOR(m,4) w[4*j+(j+m)%4] = t[m]; } FOR(m,16) x[m] = w[m]; } FOR(i,16) st32(out + 4 * i,x[i] + y[i]); } static unsigned char checksum_state[64] = {0}; static void checksum(const unsigned char *x,unsigned long long xlen) { u8 block[16]; int i; while (xlen >= 16) { core(checksum_state,x,checksum_state); x += 16; xlen -= 16; } FOR(i,16) block[i] = 0; FOR(i,xlen) block[i] = x[i]; block[xlen] = 1; checksum_state[0] ^= 1; core(checksum_state,block,checksum_state); } static int checksum_check(unsigned char *o) { int j; for (j = 0; j < 32; ++j) if (checksum_state[j] != o[j]) return 0; return 1; } static void checksum_zero(void) { long long i; for (i = 0; i < 64; ++i) checksum_state[i] = 0; } static void s20(u8 *c,u64 b,const u8 *n,const u8 *k) { u8 z[16],x[64]; u32 u,i; if (!b) return; FOR(i,16) z[i] = 0; FOR(i,8) z[i] = n[i]; while (b >= 64) { core(x,z,k); FOR(i,64) c[i] = x[i]; u = 1; for (i = 8;i < 16;++i) { u += (u32) z[i]; z[i] = u; u >>= 8; } b -= 64; c += 64; } if (b) { core(x,z,k); FOR(i,b) c[i] = x[i]; } } static void increment(u8 *n) { if (!++n[0]) if (!++n[1]) if (!++n[2]) if (!++n[3]) if (!++n[4]) if (!++n[5]) if (!++n[6]) if (!++n[7]) ; } static void pseudorandombytes(unsigned char *x,unsigned long long xlen) { const static unsigned char randombytes_k[33] = "answer randombytes from crypto_*"; static unsigned char randombytes_n[8]; s20(x,xlen,randombytes_n,randombytes_k); increment(randombytes_n); } static void unsaferandombytes(unsigned char *x,unsigned long long xlen) { static unsigned char randombytes_k[32]; static unsigned char randombytes_n[8]; static int initialized = 0; struct timeval t; if (!initialized) { initialized = 1; gettimeofday(&t, (struct timezone *)0); st32(randombytes_k + 0, t.tv_usec); st32(randombytes_k + 4, t.tv_sec); st32(randombytes_k + 8, getpid()); st32(randombytes_k + 12, getppid()); s20(randombytes_k,32,randombytes_n,randombytes_k); } s20(x,xlen,randombytes_n,randombytes_k); increment(randombytes_n); } #define fail_(a, b, x) do { fprintf(stderr, "%s:%llu: %s\n", (a), (unsigned long long)(b), (x)); fflush(stderr); _exit(111); } while (0); #define fail(x) fail_(__FILE__, __LINE__, (x)) static void fail_printdata(const char *text, unsigned char *data, long long len) { long long i; fprintf(stderr, "%s = {\n ", text); for (i = 0; i < len; ++i) { if (i == len - 1) { fprintf(stderr, "0x%02x", data[i]); } else { fprintf(stderr, "0x%02x, ", data[i]); if (i % 8 == 7) fprintf(stderr, "\n "); } } fprintf(stderr, "\n};\n"); fflush(stderr); } #define fail_whenbadchecksum(x) \ if (!checksum_check((x))) { \ fail_printdata("checksum_expected", (x), 32); \ fail_printdata("checksum_computed", checksum_state, 32); \ fail("checksum failure"); \ } #endif tinyssh-20250501/old/crypto-tests/precomp.data000066400000000000000000005340301500472222400212140ustar00rootroot00000000000000{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8 }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe }, { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }, tinyssh-20250501/old/crypto-tests/precomp.data.py000066400000000000000000000007051500472222400216400ustar00rootroot00000000000000import binascii f = open("precomp.txt") def l(line): l = "" for i in range(32): if i == 31: l += "0x%s%s" % (line[2*i], line[2*i+1]) else: l += "0x%s%s," % (line[2*i], line[2*i+1]) return l while True: line=f.readline() if len(line) == 0: f.close() break print "{", l(line), "}," tinyssh-20250501/old/crypto-tests/precomp.txt000066400000000000000000002110701500472222400211160ustar00rootroot000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000001 0000000000000000000000000000000000000000000000000000000000000002 0000000000000000000000000000000000000000000000000000000000000003 0000000000000000000000000000000000000000000000000000000000000004 0000000000000000000000000000000000000000000000000000000000000007 0000000000000000000000000000000000000000000000000000000000000008 000000000000000000000000000000000000000000000000000000000000000f 0000000000000000000000000000000000000000000000000000000000000010 000000000000000000000000000000000000000000000000000000000000001f 0000000000000000000000000000000000000000000000000000000000000020 000000000000000000000000000000000000000000000000000000000000003f 0000000000000000000000000000000000000000000000000000000000000040 000000000000000000000000000000000000000000000000000000000000007f 0000000000000000000000000000000000000000000000000000000000000080 00000000000000000000000000000000000000000000000000000000000000ff 0000000000000000000000000000000000000000000000000000000000000100 00000000000000000000000000000000000000000000000000000000000001ff 0000000000000000000000000000000000000000000000000000000000000200 00000000000000000000000000000000000000000000000000000000000003ff 0000000000000000000000000000000000000000000000000000000000000400 00000000000000000000000000000000000000000000000000000000000007ff 0000000000000000000000000000000000000000000000000000000000000800 0000000000000000000000000000000000000000000000000000000000000fff 0000000000000000000000000000000000000000000000000000000000001000 0000000000000000000000000000000000000000000000000000000000001fff 0000000000000000000000000000000000000000000000000000000000002000 0000000000000000000000000000000000000000000000000000000000003fff 0000000000000000000000000000000000000000000000000000000000004000 0000000000000000000000000000000000000000000000000000000000007fff 0000000000000000000000000000000000000000000000000000000000008000 000000000000000000000000000000000000000000000000000000000000ff00 000000000000000000000000000000000000000000000000000000000000ffff 0000000000000000000000000000000000000000000000000000000000010000 000000000000000000000000000000000000000000000000000000000001ffff 0000000000000000000000000000000000000000000000000000000000020000 000000000000000000000000000000000000000000000000000000000003ffff 0000000000000000000000000000000000000000000000000000000000040000 000000000000000000000000000000000000000000000000000000000007ffff 0000000000000000000000000000000000000000000000000000000000080000 00000000000000000000000000000000000000000000000000000000000fffff 0000000000000000000000000000000000000000000000000000000000100000 00000000000000000000000000000000000000000000000000000000001fffff 0000000000000000000000000000000000000000000000000000000000200000 00000000000000000000000000000000000000000000000000000000003fffff 0000000000000000000000000000000000000000000000000000000000400000 00000000000000000000000000000000000000000000000000000000007fffff 0000000000000000000000000000000000000000000000000000000000800000 0000000000000000000000000000000000000000000000000000000000ff0000 0000000000000000000000000000000000000000000000000000000000ffffff 0000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000001ffffff 0000000000000000000000000000000000000000000000000000000002000000 0000000000000000000000000000000000000000000000000000000003ffffff 0000000000000000000000000000000000000000000000000000000004000000 0000000000000000000000000000000000000000000000000000000007ffffff 0000000000000000000000000000000000000000000000000000000008000000 000000000000000000000000000000000000000000000000000000000fffffff 0000000000000000000000000000000000000000000000000000000010000000 000000000000000000000000000000000000000000000000000000001fffffff 0000000000000000000000000000000000000000000000000000000020000000 000000000000000000000000000000000000000000000000000000003fffffff 0000000000000000000000000000000000000000000000000000000040000000 000000000000000000000000000000000000000000000000000000007fffffff 0000000000000000000000000000000000000000000000000000000080000000 00000000000000000000000000000000000000000000000000000000ff000000 00000000000000000000000000000000000000000000000000000000ffffffff 0000000000000000000000000000000000000000000000000000000100000000 00000000000000000000000000000000000000000000000000000001ffffffff 0000000000000000000000000000000000000000000000000000000200000000 00000000000000000000000000000000000000000000000000000003ffffffff 0000000000000000000000000000000000000000000000000000000400000000 00000000000000000000000000000000000000000000000000000007ffffffff 0000000000000000000000000000000000000000000000000000000800000000 0000000000000000000000000000000000000000000000000000000fffffffff 0000000000000000000000000000000000000000000000000000001000000000 0000000000000000000000000000000000000000000000000000001fffffffff 0000000000000000000000000000000000000000000000000000002000000000 0000000000000000000000000000000000000000000000000000003fffffffff 0000000000000000000000000000000000000000000000000000004000000000 0000000000000000000000000000000000000000000000000000007fffffffff 0000000000000000000000000000000000000000000000000000008000000000 000000000000000000000000000000000000000000000000000000ff00000000 000000000000000000000000000000000000000000000000000000ffffffffff 0000000000000000000000000000000000000000000000000000010000000000 000000000000000000000000000000000000000000000000000001ffffffffff 0000000000000000000000000000000000000000000000000000020000000000 000000000000000000000000000000000000000000000000000003ffffffffff 0000000000000000000000000000000000000000000000000000040000000000 000000000000000000000000000000000000000000000000000007ffffffffff 0000000000000000000000000000000000000000000000000000080000000000 00000000000000000000000000000000000000000000000000000fffffffffff 0000000000000000000000000000000000000000000000000000100000000000 00000000000000000000000000000000000000000000000000001fffffffffff 0000000000000000000000000000000000000000000000000000200000000000 00000000000000000000000000000000000000000000000000003fffffffffff 0000000000000000000000000000000000000000000000000000400000000000 00000000000000000000000000000000000000000000000000007fffffffffff 0000000000000000000000000000000000000000000000000000800000000000 0000000000000000000000000000000000000000000000000000ff0000000000 0000000000000000000000000000000000000000000000000000ffffffffffff 0000000000000000000000000000000000000000000000000001000000000000 0000000000000000000000000000000000000000000000000001ffffffffffff 0000000000000000000000000000000000000000000000000002000000000000 0000000000000000000000000000000000000000000000000003ffffffffffff 0000000000000000000000000000000000000000000000000004000000000000 0000000000000000000000000000000000000000000000000007ffffffffffff 0000000000000000000000000000000000000000000000000008000000000000 000000000000000000000000000000000000000000000000000fffffffffffff 0000000000000000000000000000000000000000000000000010000000000000 000000000000000000000000000000000000000000000000001fffffffffffff 0000000000000000000000000000000000000000000000000020000000000000 000000000000000000000000000000000000000000000000003fffffffffffff 0000000000000000000000000000000000000000000000000040000000000000 000000000000000000000000000000000000000000000000007fffffffffffff 0000000000000000000000000000000000000000000000000080000000000000 00000000000000000000000000000000000000000000000000ff000000000000 00000000000000000000000000000000000000000000000000ffffffffffffff 0000000000000000000000000000000000000000000000000100000000000000 00000000000000000000000000000000000000000000000001ffffffffffffff 0000000000000000000000000000000000000000000000000200000000000000 00000000000000000000000000000000000000000000000003ffffffffffffff 0000000000000000000000000000000000000000000000000400000000000000 00000000000000000000000000000000000000000000000007ffffffffffffff 0000000000000000000000000000000000000000000000000800000000000000 0000000000000000000000000000000000000000000000000fffffffffffffff 0000000000000000000000000000000000000000000000001000000000000000 0000000000000000000000000000000000000000000000001fffffffffffffff 0000000000000000000000000000000000000000000000002000000000000000 0000000000000000000000000000000000000000000000003fffffffffffffff 0000000000000000000000000000000000000000000000004000000000000000 0000000000000000000000000000000000000000000000007fffffffffffffff 0000000000000000000000000000000000000000000000008000000000000000 000000000000000000000000000000000000000000000000ff00000000000000 000000000000000000000000000000000000000000000000ffffffffffffffff 0000000000000000000000000000000000000000000000010000000000000000 000000000000000000000000000000000000000000000001ffffffffffffffff 0000000000000000000000000000000000000000000000020000000000000000 000000000000000000000000000000000000000000000003ffffffffffffffff 0000000000000000000000000000000000000000000000040000000000000000 000000000000000000000000000000000000000000000007ffffffffffffffff 0000000000000000000000000000000000000000000000080000000000000000 00000000000000000000000000000000000000000000000fffffffffffffffff 0000000000000000000000000000000000000000000000100000000000000000 00000000000000000000000000000000000000000000001fffffffffffffffff 0000000000000000000000000000000000000000000000200000000000000000 00000000000000000000000000000000000000000000003fffffffffffffffff 0000000000000000000000000000000000000000000000400000000000000000 00000000000000000000000000000000000000000000007fffffffffffffffff 0000000000000000000000000000000000000000000000800000000000000000 0000000000000000000000000000000000000000000000ff0000000000000000 0000000000000000000000000000000000000000000000ffffffffffffffffff 0000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000001ffffffffffffffffff 0000000000000000000000000000000000000000000002000000000000000000 0000000000000000000000000000000000000000000003ffffffffffffffffff 0000000000000000000000000000000000000000000004000000000000000000 0000000000000000000000000000000000000000000007ffffffffffffffffff 0000000000000000000000000000000000000000000008000000000000000000 000000000000000000000000000000000000000000000fffffffffffffffffff 0000000000000000000000000000000000000000000010000000000000000000 000000000000000000000000000000000000000000001fffffffffffffffffff 0000000000000000000000000000000000000000000020000000000000000000 000000000000000000000000000000000000000000003fffffffffffffffffff 0000000000000000000000000000000000000000000040000000000000000000 000000000000000000000000000000000000000000007fffffffffffffffffff 0000000000000000000000000000000000000000000080000000000000000000 00000000000000000000000000000000000000000000ff000000000000000000 00000000000000000000000000000000000000000000ffffffffffffffffffff 0000000000000000000000000000000000000000000100000000000000000000 00000000000000000000000000000000000000000001ffffffffffffffffffff 0000000000000000000000000000000000000000000200000000000000000000 00000000000000000000000000000000000000000003ffffffffffffffffffff 0000000000000000000000000000000000000000000400000000000000000000 00000000000000000000000000000000000000000007ffffffffffffffffffff 0000000000000000000000000000000000000000000800000000000000000000 0000000000000000000000000000000000000000000fffffffffffffffffffff 0000000000000000000000000000000000000000001000000000000000000000 0000000000000000000000000000000000000000001fffffffffffffffffffff 0000000000000000000000000000000000000000002000000000000000000000 0000000000000000000000000000000000000000003fffffffffffffffffffff 0000000000000000000000000000000000000000004000000000000000000000 0000000000000000000000000000000000000000007fffffffffffffffffffff 0000000000000000000000000000000000000000008000000000000000000000 000000000000000000000000000000000000000000ff00000000000000000000 000000000000000000000000000000000000000000ffffffffffffffffffffff 0000000000000000000000000000000000000000010000000000000000000000 000000000000000000000000000000000000000001ffffffffffffffffffffff 0000000000000000000000000000000000000000020000000000000000000000 000000000000000000000000000000000000000003ffffffffffffffffffffff 0000000000000000000000000000000000000000040000000000000000000000 000000000000000000000000000000000000000007ffffffffffffffffffffff 0000000000000000000000000000000000000000080000000000000000000000 00000000000000000000000000000000000000000fffffffffffffffffffffff 0000000000000000000000000000000000000000100000000000000000000000 00000000000000000000000000000000000000001fffffffffffffffffffffff 0000000000000000000000000000000000000000200000000000000000000000 00000000000000000000000000000000000000003fffffffffffffffffffffff 0000000000000000000000000000000000000000400000000000000000000000 00000000000000000000000000000000000000007fffffffffffffffffffffff 0000000000000000000000000000000000000000800000000000000000000000 0000000000000000000000000000000000000000ff0000000000000000000000 0000000000000000000000000000000000000000ffffffffffffffffffffffff 0000000000000000000000000000000000000001000000000000000000000000 0000000000000000000000000000000000000001ffffffffffffffffffffffff 0000000000000000000000000000000000000002000000000000000000000000 0000000000000000000000000000000000000003ffffffffffffffffffffffff 0000000000000000000000000000000000000004000000000000000000000000 0000000000000000000000000000000000000007ffffffffffffffffffffffff 0000000000000000000000000000000000000008000000000000000000000000 000000000000000000000000000000000000000fffffffffffffffffffffffff 0000000000000000000000000000000000000010000000000000000000000000 000000000000000000000000000000000000001fffffffffffffffffffffffff 0000000000000000000000000000000000000020000000000000000000000000 000000000000000000000000000000000000003fffffffffffffffffffffffff 0000000000000000000000000000000000000040000000000000000000000000 000000000000000000000000000000000000007fffffffffffffffffffffffff 0000000000000000000000000000000000000080000000000000000000000000 00000000000000000000000000000000000000ff000000000000000000000000 00000000000000000000000000000000000000ffffffffffffffffffffffffff 0000000000000000000000000000000000000100000000000000000000000000 00000000000000000000000000000000000001ffffffffffffffffffffffffff 0000000000000000000000000000000000000200000000000000000000000000 00000000000000000000000000000000000003ffffffffffffffffffffffffff 0000000000000000000000000000000000000400000000000000000000000000 00000000000000000000000000000000000007ffffffffffffffffffffffffff 0000000000000000000000000000000000000800000000000000000000000000 0000000000000000000000000000000000000fffffffffffffffffffffffffff 0000000000000000000000000000000000001000000000000000000000000000 0000000000000000000000000000000000001fffffffffffffffffffffffffff 0000000000000000000000000000000000002000000000000000000000000000 0000000000000000000000000000000000003fffffffffffffffffffffffffff 0000000000000000000000000000000000004000000000000000000000000000 0000000000000000000000000000000000007fffffffffffffffffffffffffff 0000000000000000000000000000000000008000000000000000000000000000 000000000000000000000000000000000000ff00000000000000000000000000 000000000000000000000000000000000000ffffffffffffffffffffffffffff 0000000000000000000000000000000000010000000000000000000000000000 000000000000000000000000000000000001ffffffffffffffffffffffffffff 0000000000000000000000000000000000020000000000000000000000000000 000000000000000000000000000000000003ffffffffffffffffffffffffffff 0000000000000000000000000000000000040000000000000000000000000000 000000000000000000000000000000000007ffffffffffffffffffffffffffff 0000000000000000000000000000000000080000000000000000000000000000 00000000000000000000000000000000000fffffffffffffffffffffffffffff 0000000000000000000000000000000000100000000000000000000000000000 00000000000000000000000000000000001fffffffffffffffffffffffffffff 0000000000000000000000000000000000200000000000000000000000000000 00000000000000000000000000000000003fffffffffffffffffffffffffffff 0000000000000000000000000000000000400000000000000000000000000000 00000000000000000000000000000000007fffffffffffffffffffffffffffff 0000000000000000000000000000000000800000000000000000000000000000 0000000000000000000000000000000000ff0000000000000000000000000000 0000000000000000000000000000000000ffffffffffffffffffffffffffffff 0000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000001ffffffffffffffffffffffffffffff 0000000000000000000000000000000002000000000000000000000000000000 0000000000000000000000000000000003ffffffffffffffffffffffffffffff 0000000000000000000000000000000004000000000000000000000000000000 0000000000000000000000000000000007ffffffffffffffffffffffffffffff 0000000000000000000000000000000008000000000000000000000000000000 000000000000000000000000000000000fffffffffffffffffffffffffffffff 0000000000000000000000000000000010000000000000000000000000000000 000000000000000000000000000000001fffffffffffffffffffffffffffffff 0000000000000000000000000000000020000000000000000000000000000000 000000000000000000000000000000003fffffffffffffffffffffffffffffff 0000000000000000000000000000000040000000000000000000000000000000 000000000000000000000000000000007fffffffffffffffffffffffffffffff 0000000000000000000000000000000080000000000000000000000000000000 00000000000000000000000000000000ff000000000000000000000000000000 00000000000000000000000000000000ffffffffffffffffffffffffffffffff 0000000000000000000000000000000100000000000000000000000000000000 00000000000000000000000000000001ffffffffffffffffffffffffffffffff 0000000000000000000000000000000200000000000000000000000000000000 00000000000000000000000000000003ffffffffffffffffffffffffffffffff 0000000000000000000000000000000400000000000000000000000000000000 00000000000000000000000000000007ffffffffffffffffffffffffffffffff 0000000000000000000000000000000800000000000000000000000000000000 0000000000000000000000000000000fffffffffffffffffffffffffffffffff 0000000000000000000000000000001000000000000000000000000000000000 0000000000000000000000000000001fffffffffffffffffffffffffffffffff 0000000000000000000000000000002000000000000000000000000000000000 0000000000000000000000000000003fffffffffffffffffffffffffffffffff 0000000000000000000000000000004000000000000000000000000000000000 0000000000000000000000000000007fffffffffffffffffffffffffffffffff 0000000000000000000000000000008000000000000000000000000000000000 000000000000000000000000000000ff00000000000000000000000000000000 000000000000000000000000000000ffffffffffffffffffffffffffffffffff 0000000000000000000000000000010000000000000000000000000000000000 000000000000000000000000000001ffffffffffffffffffffffffffffffffff 0000000000000000000000000000020000000000000000000000000000000000 000000000000000000000000000003ffffffffffffffffffffffffffffffffff 0000000000000000000000000000040000000000000000000000000000000000 000000000000000000000000000007ffffffffffffffffffffffffffffffffff 0000000000000000000000000000080000000000000000000000000000000000 00000000000000000000000000000fffffffffffffffffffffffffffffffffff 0000000000000000000000000000100000000000000000000000000000000000 00000000000000000000000000001fffffffffffffffffffffffffffffffffff 0000000000000000000000000000200000000000000000000000000000000000 00000000000000000000000000003fffffffffffffffffffffffffffffffffff 0000000000000000000000000000400000000000000000000000000000000000 00000000000000000000000000007fffffffffffffffffffffffffffffffffff 0000000000000000000000000000800000000000000000000000000000000000 0000000000000000000000000000ff0000000000000000000000000000000000 0000000000000000000000000000ffffffffffffffffffffffffffffffffffff 0000000000000000000000000001000000000000000000000000000000000000 0000000000000000000000000001ffffffffffffffffffffffffffffffffffff 0000000000000000000000000002000000000000000000000000000000000000 0000000000000000000000000003ffffffffffffffffffffffffffffffffffff 0000000000000000000000000004000000000000000000000000000000000000 0000000000000000000000000007ffffffffffffffffffffffffffffffffffff 0000000000000000000000000008000000000000000000000000000000000000 000000000000000000000000000fffffffffffffffffffffffffffffffffffff 0000000000000000000000000010000000000000000000000000000000000000 000000000000000000000000001fffffffffffffffffffffffffffffffffffff 0000000000000000000000000020000000000000000000000000000000000000 000000000000000000000000003fffffffffffffffffffffffffffffffffffff 0000000000000000000000000040000000000000000000000000000000000000 000000000000000000000000007fffffffffffffffffffffffffffffffffffff 0000000000000000000000000080000000000000000000000000000000000000 00000000000000000000000000ff000000000000000000000000000000000000 00000000000000000000000000ffffffffffffffffffffffffffffffffffffff 0000000000000000000000000100000000000000000000000000000000000000 00000000000000000000000001ffffffffffffffffffffffffffffffffffffff 0000000000000000000000000200000000000000000000000000000000000000 00000000000000000000000003ffffffffffffffffffffffffffffffffffffff 0000000000000000000000000400000000000000000000000000000000000000 00000000000000000000000007ffffffffffffffffffffffffffffffffffffff 0000000000000000000000000800000000000000000000000000000000000000 0000000000000000000000000fffffffffffffffffffffffffffffffffffffff 0000000000000000000000001000000000000000000000000000000000000000 0000000000000000000000001fffffffffffffffffffffffffffffffffffffff 0000000000000000000000002000000000000000000000000000000000000000 0000000000000000000000003fffffffffffffffffffffffffffffffffffffff 0000000000000000000000004000000000000000000000000000000000000000 0000000000000000000000007fffffffffffffffffffffffffffffffffffffff 0000000000000000000000008000000000000000000000000000000000000000 000000000000000000000000ff00000000000000000000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffff 0000000000000000000000010000000000000000000000000000000000000000 000000000000000000000001ffffffffffffffffffffffffffffffffffffffff 0000000000000000000000020000000000000000000000000000000000000000 000000000000000000000003ffffffffffffffffffffffffffffffffffffffff 0000000000000000000000040000000000000000000000000000000000000000 000000000000000000000007ffffffffffffffffffffffffffffffffffffffff 0000000000000000000000080000000000000000000000000000000000000000 00000000000000000000000fffffffffffffffffffffffffffffffffffffffff 0000000000000000000000100000000000000000000000000000000000000000 00000000000000000000001fffffffffffffffffffffffffffffffffffffffff 0000000000000000000000200000000000000000000000000000000000000000 00000000000000000000003fffffffffffffffffffffffffffffffffffffffff 0000000000000000000000400000000000000000000000000000000000000000 00000000000000000000007fffffffffffffffffffffffffffffffffffffffff 0000000000000000000000800000000000000000000000000000000000000000 0000000000000000000000ff0000000000000000000000000000000000000000 0000000000000000000000ffffffffffffffffffffffffffffffffffffffffff 0000000000000000000001000000000000000000000000000000000000000000 0000000000000000000001ffffffffffffffffffffffffffffffffffffffffff 0000000000000000000002000000000000000000000000000000000000000000 0000000000000000000003ffffffffffffffffffffffffffffffffffffffffff 0000000000000000000004000000000000000000000000000000000000000000 0000000000000000000007ffffffffffffffffffffffffffffffffffffffffff 0000000000000000000008000000000000000000000000000000000000000000 000000000000000000000fffffffffffffffffffffffffffffffffffffffffff 0000000000000000000010000000000000000000000000000000000000000000 000000000000000000001fffffffffffffffffffffffffffffffffffffffffff 0000000000000000000020000000000000000000000000000000000000000000 000000000000000000003fffffffffffffffffffffffffffffffffffffffffff 0000000000000000000040000000000000000000000000000000000000000000 000000000000000000007fffffffffffffffffffffffffffffffffffffffffff 0000000000000000000080000000000000000000000000000000000000000000 00000000000000000000ff000000000000000000000000000000000000000000 00000000000000000000ffffffffffffffffffffffffffffffffffffffffffff 0000000000000000000100000000000000000000000000000000000000000000 00000000000000000001ffffffffffffffffffffffffffffffffffffffffffff 0000000000000000000200000000000000000000000000000000000000000000 00000000000000000003ffffffffffffffffffffffffffffffffffffffffffff 0000000000000000000400000000000000000000000000000000000000000000 00000000000000000007ffffffffffffffffffffffffffffffffffffffffffff 0000000000000000000800000000000000000000000000000000000000000000 0000000000000000000fffffffffffffffffffffffffffffffffffffffffffff 0000000000000000001000000000000000000000000000000000000000000000 0000000000000000001fffffffffffffffffffffffffffffffffffffffffffff 0000000000000000002000000000000000000000000000000000000000000000 0000000000000000003fffffffffffffffffffffffffffffffffffffffffffff 0000000000000000004000000000000000000000000000000000000000000000 0000000000000000007fffffffffffffffffffffffffffffffffffffffffffff 0000000000000000008000000000000000000000000000000000000000000000 000000000000000000ff00000000000000000000000000000000000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffff 0000000000000000010000000000000000000000000000000000000000000000 000000000000000001ffffffffffffffffffffffffffffffffffffffffffffff 0000000000000000020000000000000000000000000000000000000000000000 000000000000000003ffffffffffffffffffffffffffffffffffffffffffffff 0000000000000000040000000000000000000000000000000000000000000000 000000000000000007ffffffffffffffffffffffffffffffffffffffffffffff 0000000000000000080000000000000000000000000000000000000000000000 00000000000000000fffffffffffffffffffffffffffffffffffffffffffffff 0000000000000000100000000000000000000000000000000000000000000000 00000000000000001fffffffffffffffffffffffffffffffffffffffffffffff 0000000000000000200000000000000000000000000000000000000000000000 00000000000000003fffffffffffffffffffffffffffffffffffffffffffffff 0000000000000000400000000000000000000000000000000000000000000000 00000000000000007fffffffffffffffffffffffffffffffffffffffffffffff 0000000000000000800000000000000000000000000000000000000000000000 0000000000000000ff0000000000000000000000000000000000000000000000 0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff 0000000000000001000000000000000000000000000000000000000000000000 0000000000000001ffffffffffffffffffffffffffffffffffffffffffffffff 0000000000000002000000000000000000000000000000000000000000000000 0000000000000003ffffffffffffffffffffffffffffffffffffffffffffffff 0000000000000004000000000000000000000000000000000000000000000000 0000000000000007ffffffffffffffffffffffffffffffffffffffffffffffff 0000000000000008000000000000000000000000000000000000000000000000 000000000000000fffffffffffffffffffffffffffffffffffffffffffffffff 0000000000000010000000000000000000000000000000000000000000000000 000000000000001fffffffffffffffffffffffffffffffffffffffffffffffff 0000000000000020000000000000000000000000000000000000000000000000 000000000000003fffffffffffffffffffffffffffffffffffffffffffffffff 0000000000000040000000000000000000000000000000000000000000000000 000000000000007fffffffffffffffffffffffffffffffffffffffffffffffff 0000000000000080000000000000000000000000000000000000000000000000 00000000000000ff000000000000000000000000000000000000000000000000 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000000100000000000000000000000000000000000000000000000000 00000000000001ffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000000200000000000000000000000000000000000000000000000000 00000000000003ffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000000400000000000000000000000000000000000000000000000000 00000000000007ffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000000800000000000000000000000000000000000000000000000000 0000000000000fffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000001000000000000000000000000000000000000000000000000000 0000000000001fffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000002000000000000000000000000000000000000000000000000000 0000000000003fffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000004000000000000000000000000000000000000000000000000000 0000000000007fffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000008000000000000000000000000000000000000000000000000000 000000000000ff00000000000000000000000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000010000000000000000000000000000000000000000000000000000 000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000020000000000000000000000000000000000000000000000000000 000000000003ffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000040000000000000000000000000000000000000000000000000000 000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000080000000000000000000000000000000000000000000000000000 00000000000fffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000100000000000000000000000000000000000000000000000000000 00000000001fffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000200000000000000000000000000000000000000000000000000000 00000000003fffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000400000000000000000000000000000000000000000000000000000 00000000007fffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000800000000000000000000000000000000000000000000000000000 0000000000ff0000000000000000000000000000000000000000000000000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000001000000000000000000000000000000000000000000000000000000 0000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000002000000000000000000000000000000000000000000000000000000 0000000003ffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000004000000000000000000000000000000000000000000000000000000 0000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000008000000000000000000000000000000000000000000000000000000 000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000010000000000000000000000000000000000000000000000000000000 000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000020000000000000000000000000000000000000000000000000000000 000000003fffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000040000000000000000000000000000000000000000000000000000000 000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000080000000000000000000000000000000000000000000000000000000 00000000ff000000000000000000000000000000000000000000000000000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000100000000000000000000000000000000000000000000000000000000 00000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000200000000000000000000000000000000000000000000000000000000 00000003ffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000400000000000000000000000000000000000000000000000000000000 00000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000800000000000000000000000000000000000000000000000000000000 0000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000001000000000000000000000000000000000000000000000000000000000 0000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000002000000000000000000000000000000000000000000000000000000000 0000003fffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000004000000000000000000000000000000000000000000000000000000000 0000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000008000000000000000000000000000000000000000000000000000000000 000000ff00000000000000000000000000000000000000000000000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000010000000000000000000000000000000000000000000000000000000000 000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000020000000000000000000000000000000000000000000000000000000000 000003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000040000000000000000000000000000000000000000000000000000000000 000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000080000000000000000000000000000000000000000000000000000000000 00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000100000000000000000000000000000000000000000000000000000000000 00001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000200000000000000000000000000000000000000000000000000000000000 00003fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000400000000000000000000000000000000000000000000000000000000000 00007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000800000000000000000000000000000000000000000000000000000000000 0000ff0000000000000000000000000000000000000000000000000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0001000000000000000000000000000000000000000000000000000000000000 0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0002000000000000000000000000000000000000000000000000000000000000 0003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0004000000000000000000000000000000000000000000000000000000000000 0007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0008000000000000000000000000000000000000000000000000000000000000 000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0010000000000000000000000000000000000000000000000000000000000000 001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0020000000000000000000000000000000000000000000000000000000000000 003fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0040000000000000000000000000000000000000000000000000000000000000 007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0080000000000000000000000000000000000000000000000000000000000000 00ff000000000000000000000000000000000000000000000000000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0100000000000000000000000000000000000000000000000000000000000000 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0200000000000000000000000000000000000000000000000000000000000000 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0400000000000000000000000000000000000000000000000000000000000000 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0800000000000000000000000000000000000000000000000000000000000000 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 1000000000000000000000000000000000000000000000000000000000000000 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 2000000000000000000000000000000000000000000000000000000000000000 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 4000000000000000000000000000000000000000000000000000000000000000 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 8000000000000000000000000000000000000000000000000000000000000000 bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c000000000000000000000000000000000000000000000000000000000000000 dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff e000000000000000000000000000000000000000000000000000000000000000 efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff f000000000000000000000000000000000000000000000000000000000000000 f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff f800000000000000000000000000000000000000000000000000000000000000 fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fc00000000000000000000000000000000000000000000000000000000000000 fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fe00000000000000000000000000000000000000000000000000000000000000 feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00000000000000000000000000000000000000000000000000000000000000 ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff80000000000000000000000000000000000000000000000000000000000000 ffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc0000000000000000000000000000000000000000000000000000000000000 ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffe0000000000000000000000000000000000000000000000000000000000000 ffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fff0000000000000000000000000000000000000000000000000000000000000 fff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fff8000000000000000000000000000000000000000000000000000000000000 fffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffc000000000000000000000000000000000000000000000000000000000000 fffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffe000000000000000000000000000000000000000000000000000000000000 fffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000000000000000000000000000000000000000000000000000 ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff800000000000000000000000000000000000000000000000000000000000 ffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc00000000000000000000000000000000000000000000000000000000000 ffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffe00000000000000000000000000000000000000000000000000000000000 ffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffff00000000000000000000000000000000000000000000000000000000000 fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffff80000000000000000000000000000000000000000000000000000000000 fffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffc0000000000000000000000000000000000000000000000000000000000 fffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffe0000000000000000000000000000000000000000000000000000000000 fffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000000000000000000000000000000000000000000000000000 ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff8000000000000000000000000000000000000000000000000000000000 ffffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc000000000000000000000000000000000000000000000000000000000 ffffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffe000000000000000000000000000000000000000000000000000000000 ffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffff000000000000000000000000000000000000000000000000000000000 fffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffff800000000000000000000000000000000000000000000000000000000 fffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffc00000000000000000000000000000000000000000000000000000000 fffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffe00000000000000000000000000000000000000000000000000000000 fffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00000000000000000000000000000000000000000000000000000000 ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff80000000000000000000000000000000000000000000000000000000 ffffffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc0000000000000000000000000000000000000000000000000000000 ffffffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffe0000000000000000000000000000000000000000000000000000000 ffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffff0000000000000000000000000000000000000000000000000000000 fffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffff8000000000000000000000000000000000000000000000000000000 fffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffc000000000000000000000000000000000000000000000000000000 fffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffe000000000000000000000000000000000000000000000000000000 fffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000000000000000000000000000000000000000000000000000 ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff800000000000000000000000000000000000000000000000000000 ffffffffffbfffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc00000000000000000000000000000000000000000000000000000 ffffffffffdfffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffe00000000000000000000000000000000000000000000000000000 ffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffff00000000000000000000000000000000000000000000000000000 fffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffff80000000000000000000000000000000000000000000000000000 fffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffc0000000000000000000000000000000000000000000000000000 fffffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffe0000000000000000000000000000000000000000000000000000 fffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000000000000000000000000000000000000000000000 ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff8000000000000000000000000000000000000000000000000000 ffffffffffffbfffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc000000000000000000000000000000000000000000000000000 ffffffffffffdfffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffe000000000000000000000000000000000000000000000000000 ffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffff000000000000000000000000000000000000000000000000000 fffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffff800000000000000000000000000000000000000000000000000 fffffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffc00000000000000000000000000000000000000000000000000 fffffffffffffdffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffe00000000000000000000000000000000000000000000000000 fffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00000000000000000000000000000000000000000000000000 ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff80000000000000000000000000000000000000000000000000 ffffffffffffffbfffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc0000000000000000000000000000000000000000000000000 ffffffffffffffdfffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffe0000000000000000000000000000000000000000000000000 ffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffff0000000000000000000000000000000000000000000000000 fffffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffff8000000000000000000000000000000000000000000000000 fffffffffffffffbffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffc000000000000000000000000000000000000000000000000 fffffffffffffffdffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffe000000000000000000000000000000000000000000000000 fffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000000000000000000000000000000000000000 ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff800000000000000000000000000000000000000000000000 ffffffffffffffffbfffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc00000000000000000000000000000000000000000000000 ffffffffffffffffdfffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffe00000000000000000000000000000000000000000000000 ffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffff00000000000000000000000000000000000000000000000 fffffffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffff80000000000000000000000000000000000000000000000 fffffffffffffffffbffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffc0000000000000000000000000000000000000000000000 fffffffffffffffffdffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffe0000000000000000000000000000000000000000000000 fffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000000000000000000000000000000000000000 ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff8000000000000000000000000000000000000000000000 ffffffffffffffffffbfffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc000000000000000000000000000000000000000000000 ffffffffffffffffffdfffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffe000000000000000000000000000000000000000000000 ffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffff000000000000000000000000000000000000000000000 fffffffffffffffffff7ffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffff800000000000000000000000000000000000000000000 fffffffffffffffffffbffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffc00000000000000000000000000000000000000000000 fffffffffffffffffffdffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffe00000000000000000000000000000000000000000000 fffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000000000000000000000000000000000000000 ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff80000000000000000000000000000000000000000000 ffffffffffffffffffffbfffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc0000000000000000000000000000000000000000000 ffffffffffffffffffffdfffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffe0000000000000000000000000000000000000000000 ffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffff0000000000000000000000000000000000000000000 fffffffffffffffffffff7ffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffff8000000000000000000000000000000000000000000 fffffffffffffffffffffbffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffc000000000000000000000000000000000000000000 fffffffffffffffffffffdffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffe000000000000000000000000000000000000000000 fffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000000000000000000000000000000000 ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff800000000000000000000000000000000000000000 ffffffffffffffffffffffbfffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc00000000000000000000000000000000000000000 ffffffffffffffffffffffdfffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffe00000000000000000000000000000000000000000 ffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffff00000000000000000000000000000000000000000 fffffffffffffffffffffff7ffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffff80000000000000000000000000000000000000000 fffffffffffffffffffffffbffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffc0000000000000000000000000000000000000000 fffffffffffffffffffffffdffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffe0000000000000000000000000000000000000000 fffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000000000000000000000000000000000 ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff8000000000000000000000000000000000000000 ffffffffffffffffffffffffbfffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc000000000000000000000000000000000000000 ffffffffffffffffffffffffdfffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffe000000000000000000000000000000000000000 ffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffff000000000000000000000000000000000000000 fffffffffffffffffffffffff7ffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffff800000000000000000000000000000000000000 fffffffffffffffffffffffffbffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffc00000000000000000000000000000000000000 fffffffffffffffffffffffffdffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffe00000000000000000000000000000000000000 fffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00000000000000000000000000000000000000 ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff80000000000000000000000000000000000000 ffffffffffffffffffffffffffbfffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc0000000000000000000000000000000000000 ffffffffffffffffffffffffffdfffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffe0000000000000000000000000000000000000 ffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffff0000000000000000000000000000000000000 fffffffffffffffffffffffffff7ffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffff8000000000000000000000000000000000000 fffffffffffffffffffffffffffbffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffc000000000000000000000000000000000000 fffffffffffffffffffffffffffdffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffe000000000000000000000000000000000000 fffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000000000000000000000000000000000 ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff800000000000000000000000000000000000 ffffffffffffffffffffffffffffbfffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc00000000000000000000000000000000000 ffffffffffffffffffffffffffffdfffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffe00000000000000000000000000000000000 ffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffff00000000000000000000000000000000000 fffffffffffffffffffffffffffff7ffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffff80000000000000000000000000000000000 fffffffffffffffffffffffffffffbffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffc0000000000000000000000000000000000 fffffffffffffffffffffffffffffdffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffe0000000000000000000000000000000000 fffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000000000000000000000000000 ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff8000000000000000000000000000000000 ffffffffffffffffffffffffffffffbfffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc000000000000000000000000000000000 ffffffffffffffffffffffffffffffdfffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffe000000000000000000000000000000000 ffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffff000000000000000000000000000000000 fffffffffffffffffffffffffffffff7ffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffff800000000000000000000000000000000 fffffffffffffffffffffffffffffffbffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffc00000000000000000000000000000000 fffffffffffffffffffffffffffffffdffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffe00000000000000000000000000000000 fffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00000000000000000000000000000000 ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff80000000000000000000000000000000 ffffffffffffffffffffffffffffffffbfffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc0000000000000000000000000000000 ffffffffffffffffffffffffffffffffdfffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffe0000000000000000000000000000000 ffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffff0000000000000000000000000000000 fffffffffffffffffffffffffffffffff7ffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffff8000000000000000000000000000000 fffffffffffffffffffffffffffffffffbffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffc000000000000000000000000000000 fffffffffffffffffffffffffffffffffdffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffe000000000000000000000000000000 fffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000000000000000000000000000 ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff800000000000000000000000000000 ffffffffffffffffffffffffffffffffffbfffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc00000000000000000000000000000 ffffffffffffffffffffffffffffffffffdfffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffe00000000000000000000000000000 ffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffff00000000000000000000000000000 fffffffffffffffffffffffffffffffffff7ffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffff80000000000000000000000000000 fffffffffffffffffffffffffffffffffffbffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffc0000000000000000000000000000 fffffffffffffffffffffffffffffffffffdffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffe0000000000000000000000000000 fffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000000000000000000000 ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff8000000000000000000000000000 ffffffffffffffffffffffffffffffffffffbfffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc000000000000000000000000000 ffffffffffffffffffffffffffffffffffffdfffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffe000000000000000000000000000 ffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffff000000000000000000000000000 fffffffffffffffffffffffffffffffffffff7ffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffff800000000000000000000000000 fffffffffffffffffffffffffffffffffffffbffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffc00000000000000000000000000 fffffffffffffffffffffffffffffffffffffdffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffe00000000000000000000000000 fffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00000000000000000000000000 ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff80000000000000000000000000 ffffffffffffffffffffffffffffffffffffffbfffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc0000000000000000000000000 ffffffffffffffffffffffffffffffffffffffdfffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffe0000000000000000000000000 ffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffff0000000000000000000000000 fffffffffffffffffffffffffffffffffffffff7ffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffff8000000000000000000000000 fffffffffffffffffffffffffffffffffffffffbffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffc000000000000000000000000 fffffffffffffffffffffffffffffffffffffffdffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffe000000000000000000000000 fffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff800000000000000000000000 ffffffffffffffffffffffffffffffffffffffffbfffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc00000000000000000000000 ffffffffffffffffffffffffffffffffffffffffdfffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffe00000000000000000000000 ffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffff00000000000000000000000 fffffffffffffffffffffffffffffffffffffffff7ffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffff80000000000000000000000 fffffffffffffffffffffffffffffffffffffffffbffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffc0000000000000000000000 fffffffffffffffffffffffffffffffffffffffffdffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffe0000000000000000000000 fffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff8000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffdfffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffe000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffff000000000000000000000 fffffffffffffffffffffffffffffffffffffffffff7ffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffff800000000000000000000 fffffffffffffffffffffffffffffffffffffffffffbffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffc00000000000000000000 fffffffffffffffffffffffffffffffffffffffffffdffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffe00000000000000000000 fffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000 ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff80000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc0000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffdfffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000 fffffffffffffffffffffffffffffffffffffffffffff7ffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffff8000000000000000000 fffffffffffffffffffffffffffffffffffffffffffffbffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffc000000000000000000 fffffffffffffffffffffffffffffffffffffffffffffdffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffe000000000000000000 fffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff800000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc00000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffdfffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000 fffffffffffffffffffffffffffffffffffffffffffffff7ffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffff80000000000000000 fffffffffffffffffffffffffffffffffffffffffffffffbffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000 fffffffffffffffffffffffffffffffffffffffffffffffdffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000 fffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffdfffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000 fffffffffffffffffffffffffffffffffffffffffffffffff7ffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffff800000000000000 fffffffffffffffffffffffffffffffffffffffffffffffffbffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffc00000000000000 fffffffffffffffffffffffffffffffffffffffffffffffffdffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000 fffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffdfffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000 fffffffffffffffffffffffffffffffffffffffffffffffffff7ffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000 fffffffffffffffffffffffffffffffffffffffffffffffffffbffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffc000000000000 fffffffffffffffffffffffffffffffffffffffffffffffffffdffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000 fffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff800000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc00000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffdfffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000 fffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000 fffffffffffffffffffffffffffffffffffffffffffffffffffffbffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000 fffffffffffffffffffffffffffffffffffffffffffffffffffffdffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000 fffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000 fffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffff800000000 fffffffffffffffffffffffffffffffffffffffffffffffffffffffbffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000000 fffffffffffffffffffffffffffffffffffffffffffffffffffffffdffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000 fffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000 fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffbffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffc000000 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffdffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0000 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff tinyssh-20250501/old/crypto-tests/precomp_curve25519.data000066400000000000000000005340301500472222400230260ustar00rootroot00000000000000{ 0x2f,0xe5,0x7d,0xa3,0x47,0xcd,0x62,0x43,0x15,0x28,0xda,0xac,0x5f,0xbb,0x29,0x07,0x30,0xff,0xf6,0x84,0xaf,0xc4,0xcf,0xc2,0xed,0x90,0x99,0x5f,0x58,0xcb,0x3b,0x74 }, { 0xfd,0x33,0x84,0xe1,0x32,0xad,0x02,0xa5,0x6c,0x78,0xf4,0x55,0x47,0xee,0x40,0x03,0x8d,0xc7,0x90,0x02,0xb9,0x0d,0x29,0xed,0x90,0xe0,0x8e,0xee,0x76,0x2a,0xe7,0x15 }, { 0xad,0x8c,0x48,0xc2,0x67,0x65,0xae,0xa7,0xad,0xc5,0x36,0x28,0x96,0x05,0xc1,0xab,0xea,0x95,0x05,0x00,0x93,0xdb,0xd2,0x18,0xc9,0x6a,0xbd,0x24,0x81,0xa0,0x35,0x65 }, { 0x99,0x52,0xfb,0x7e,0x53,0x83,0xc5,0x22,0xc9,0x54,0xde,0x94,0xf2,0xe4,0x62,0x0d,0x3e,0x08,0xcd,0x9e,0x72,0x48,0xad,0x23,0x20,0x7f,0x9e,0xf5,0x5c,0x90,0x41,0x44 }, { 0xec,0x13,0xd2,0x3a,0x17,0xda,0xf1,0x74,0x75,0x0d,0xf7,0xad,0x67,0xa8,0x6a,0x1d,0x4e,0xab,0xec,0x8f,0x51,0x76,0x36,0x60,0x52,0x81,0xc1,0xdb,0x18,0xc6,0x66,0x49 }, { 0xf6,0x03,0x1b,0xd7,0x59,0x63,0x23,0xfa,0x54,0x00,0x41,0xbd,0x3a,0x63,0x51,0x33,0xe7,0x28,0x78,0x49,0x3e,0x76,0x20,0x04,0x88,0x75,0x88,0x7b,0xdc,0x8b,0x99,0x07 }, { 0x0b,0xc6,0x8f,0x68,0x72,0x17,0x2f,0x9d,0xa9,0xc3,0x5b,0xe0,0x82,0x76,0xa6,0x36,0xa8,0x04,0x9d,0x44,0x26,0xdc,0xb5,0x06,0x7c,0x56,0xb8,0x11,0x38,0x50,0x4d,0x6a }, { 0x76,0x46,0x27,0xe0,0x18,0x48,0xbd,0x9c,0x38,0xd4,0x3d,0x7a,0xe4,0x2d,0x32,0x33,0x73,0x27,0x51,0x4a,0xeb,0x5f,0x00,0x00,0x63,0xbb,0x1f,0x5b,0xb9,0xfd,0x9b,0x75 }, { 0x2a,0xe1,0x19,0xbc,0x7b,0x59,0x49,0x5c,0x8c,0xc1,0x9e,0xfb,0xed,0xfe,0x6f,0x00,0xbb,0xc1,0x0e,0x7d,0x99,0x08,0xd1,0x02,0xa4,0x09,0x44,0xa9,0x44,0xfa,0xa3,0x6e }, { 0xce,0x08,0x10,0xb0,0x5f,0x29,0xc1,0x67,0x20,0x9e,0xd7,0x6c,0x96,0x8d,0xd5,0x9d,0xe5,0x6e,0x4b,0x1c,0x9e,0xd4,0x70,0x52,0xfb,0x96,0x7b,0xff,0x94,0x31,0x45,0x1d }, { 0xf3,0x5c,0xa9,0x9a,0xe0,0x11,0x19,0x80,0xc5,0x50,0xe3,0x7d,0xef,0xef,0xc7,0x68,0x5b,0xa1,0x24,0x14,0x38,0x31,0x47,0x06,0x86,0x77,0xf7,0x7d,0xd0,0x78,0x0c,0x52 }, { 0xad,0xea,0xff,0xf5,0xd8,0x78,0x56,0x59,0x33,0x15,0xc0,0x48,0x41,0x78,0xe8,0xd1,0xc4,0x77,0x7a,0x2a,0xb1,0x6e,0xa1,0x71,0x7a,0x7e,0x2f,0x20,0x99,0x2e,0x9b,0x2c }, { 0x2f,0xe5,0x7d,0xa3,0x47,0xcd,0x62,0x43,0x15,0x28,0xda,0xac,0x5f,0xbb,0x29,0x07,0x30,0xff,0xf6,0x84,0xaf,0xc4,0xcf,0xc2,0xed,0x90,0x99,0x5f,0x58,0xcb,0x3b,0x74 }, { 0xad,0xea,0xff,0xf5,0xd8,0x78,0x56,0x59,0x33,0x15,0xc0,0x48,0x41,0x78,0xe8,0xd1,0xc4,0x77,0x7a,0x2a,0xb1,0x6e,0xa1,0x71,0x7a,0x7e,0x2f,0x20,0x99,0x2e,0x9b,0x2c }, { 0x2f,0xe5,0x7d,0xa3,0x47,0xcd,0x62,0x43,0x15,0x28,0xda,0xac,0x5f,0xbb,0x29,0x07,0x30,0xff,0xf6,0x84,0xaf,0xc4,0xcf,0xc2,0xed,0x90,0x99,0x5f,0x58,0xcb,0x3b,0x74 }, { 0xad,0xea,0xff,0xf5,0xd8,0x78,0x56,0x59,0x33,0x15,0xc0,0x48,0x41,0x78,0xe8,0xd1,0xc4,0x77,0x7a,0x2a,0xb1,0x6e,0xa1,0x71,0x7a,0x7e,0x2f,0x20,0x99,0x2e,0x9b,0x2c }, { 0xdc,0xac,0x46,0xcd,0xb9,0xc2,0xb9,0xe9,0x34,0x84,0x04,0x27,0x53,0x8a,0x05,0x75,0xae,0x42,0x1d,0xbb,0x85,0x76,0x47,0xaa,0xcf,0x07,0x57,0x65,0xf0,0xae,0x64,0x43 }, { 0xb7,0x22,0x15,0xf0,0x6c,0xf3,0x55,0xf6,0xd1,0x42,0xd7,0x68,0xbc,0xc7,0x85,0x1e,0x0b,0x41,0x84,0xb3,0x69,0x9d,0x64,0x9c,0x20,0xfe,0xaa,0x8b,0x26,0x7c,0xf1,0x49 }, { 0x80,0xee,0xdc,0x7d,0x50,0x6a,0x6f,0x89,0x10,0x5c,0x9e,0xb8,0x25,0x83,0x11,0x4a,0x31,0x60,0x04,0x35,0xda,0xd3,0xe8,0x42,0x16,0xdb,0x2c,0x31,0x6a,0xdd,0xe2,0x56 }, { 0x0b,0xbb,0xb5,0x7a,0xb3,0xba,0xe0,0x9e,0x3c,0x7e,0x0f,0xc9,0x78,0xc7,0xf7,0xb3,0x90,0x94,0xd0,0x69,0x25,0x5c,0xc5,0x66,0xf5,0xb4,0x85,0x36,0x54,0xe0,0x02,0x2b }, { 0x83,0x4d,0xdf,0x49,0x28,0xff,0xc8,0x79,0x46,0xfa,0x61,0xf2,0x99,0x90,0x90,0x81,0x1a,0x34,0x14,0x45,0xf7,0xa4,0xdf,0x47,0x9d,0x03,0xc6,0xe5,0x84,0xd1,0x43,0x1c }, { 0xbf,0xa8,0xbf,0x95,0xbe,0xfd,0x36,0x2f,0x42,0xc4,0xa0,0x81,0x24,0xdb,0xcb,0x35,0x01,0xeb,0xd6,0xcc,0x65,0x01,0x7e,0xf9,0x83,0x2a,0x2c,0x4b,0x86,0xa8,0xbc,0x10 }, { 0xba,0x11,0xd6,0xc0,0xad,0x11,0x75,0xf7,0xfe,0x4c,0xf0,0x94,0xfc,0xd9,0x62,0xd3,0x7c,0xb0,0x79,0x09,0x8c,0x9f,0xd6,0x6f,0xfc,0x9a,0xcc,0xdc,0xf9,0xaa,0x71,0x70 }, { 0x7e,0xbc,0x10,0x2a,0xc2,0x33,0x7a,0x7f,0x95,0x2d,0x5b,0x73,0xee,0xfd,0xd9,0x22,0x3b,0x5d,0x94,0x83,0xd0,0xe2,0x13,0xf9,0xa8,0xfc,0x2f,0x94,0x0e,0x30,0x26,0x23 }, { 0x39,0x86,0xec,0x1f,0x57,0xae,0x8d,0xfc,0x40,0xb9,0x00,0xaa,0x59,0xb0,0x38,0x52,0x98,0xa6,0x63,0x7a,0xdd,0x35,0xef,0x52,0x1b,0x74,0x68,0xb0,0xff,0x38,0x16,0x49 }, { 0x0e,0x1d,0x6f,0x15,0xfb,0x3b,0x4d,0xc4,0xb4,0xf9,0x8d,0xe1,0x9e,0xac,0xca,0x65,0xa4,0xc0,0x8f,0x7e,0xd7,0x43,0xfa,0xb0,0x49,0xb2,0x84,0xec,0x06,0xd2,0xc3,0x3c }, { 0xee,0x0a,0xf8,0x9e,0x9a,0xdb,0xbd,0xde,0xc2,0x71,0x3f,0x2f,0xbc,0xf8,0x08,0x33,0x58,0x33,0x1f,0x96,0x3f,0x50,0xe8,0x6f,0x7a,0xbd,0x89,0x67,0x06,0xc2,0x96,0x50 }, { 0xce,0x12,0x7b,0x99,0x3d,0xec,0x3c,0xfb,0xa5,0x45,0xf6,0x94,0x2c,0xd5,0x19,0x20,0x1c,0x1b,0x95,0x99,0xaf,0x10,0xa7,0x1a,0x59,0x1a,0xb8,0xd8,0xbe,0xb6,0x15,0x5b }, { 0x28,0x09,0xed,0x72,0x48,0xa6,0x99,0xd7,0x39,0xe2,0xcb,0x8a,0x8b,0xec,0xb7,0xc6,0x7b,0x2a,0xfa,0x93,0x3c,0x7b,0x12,0x28,0x10,0x26,0x3b,0x9a,0xdc,0x75,0xac,0x09 }, { 0x9f,0xae,0x13,0x65,0x29,0x1e,0xf8,0xc2,0x66,0x2b,0xfb,0x7f,0x8f,0x30,0xf0,0x8d,0x73,0x74,0xb2,0xcf,0xaf,0xea,0xc9,0xcb,0x94,0x6c,0xc9,0x3a,0x1a,0xb9,0x98,0x68 }, { 0x11,0x73,0xce,0xf0,0x59,0x9a,0xe1,0x20,0xde,0x0d,0x18,0x06,0x90,0xab,0x49,0x90,0x56,0x7c,0x41,0x51,0xbe,0x47,0xd9,0x69,0xac,0x84,0xed,0xc2,0x6c,0x15,0xf2,0x61 }, { 0x11,0xb6,0x23,0xd5,0xf6,0xb9,0x9b,0xc5,0xf2,0x3b,0x4d,0x87,0x19,0x0c,0xec,0x89,0xc2,0xfc,0x6d,0x57,0x41,0x89,0x9e,0x9d,0xc7,0x89,0x6a,0x9d,0x77,0x7e,0x67,0x35 }, { 0xb1,0xe8,0x23,0x6b,0x63,0x1e,0x19,0xd8,0x6b,0x28,0xa6,0xff,0x4d,0x5f,0x4b,0x39,0xd4,0x1e,0xdd,0xf4,0x7a,0xb7,0xd3,0xa9,0x57,0x95,0x06,0xde,0xc3,0xda,0x27,0x2a }, { 0x29,0x6d,0x79,0x1b,0x69,0x24,0xe5,0x41,0x1d,0xb5,0xbe,0xe0,0x3d,0x97,0xa1,0x76,0xe6,0x24,0x1f,0x23,0x8a,0xe3,0x53,0xa8,0x1b,0xe0,0xbb,0xcd,0x74,0x9f,0x34,0x21 }, { 0x88,0xa6,0x21,0x6b,0x63,0x71,0x04,0xa2,0x66,0xef,0xb1,0x3f,0x6f,0xee,0xfa,0xa1,0xd3,0xce,0x75,0x86,0xff,0xc9,0xb3,0x8c,0xf8,0x42,0xca,0x0f,0x83,0x02,0xaa,0x50 }, { 0xdc,0x73,0x4f,0xf9,0xf9,0xee,0x7f,0x52,0x33,0x48,0x18,0xfd,0x49,0x45,0x65,0xea,0xb7,0x31,0xaf,0x79,0xdc,0xfb,0x47,0x72,0x65,0x2a,0xc8,0x18,0x3f,0x6b,0x34,0x76 }, { 0x94,0xc6,0xae,0xa0,0x73,0xdb,0x2e,0x35,0x24,0x25,0x3c,0x1a,0x2f,0x71,0x5f,0x65,0x43,0xd0,0xb2,0x6d,0x1a,0x85,0x39,0x4d,0x0b,0xd9,0xcf,0x2e,0xbf,0xc4,0x77,0x27 }, { 0xb3,0x8d,0x0f,0xa4,0x0a,0x6a,0x90,0x78,0x85,0x94,0xec,0x6d,0xbd,0x56,0xf5,0x37,0x39,0xe0,0xc3,0xdc,0xb2,0xd8,0x80,0x30,0x03,0x85,0xfb,0x86,0x91,0x1c,0x95,0x2c }, { 0xd6,0xc8,0x42,0x69,0xe4,0xb0,0x77,0x1d,0x1b,0xb4,0x45,0x74,0xcd,0xee,0xbf,0x00,0x7a,0x3b,0xab,0xe0,0x2a,0xfb,0x9f,0x4b,0x5e,0xa3,0xd0,0x16,0x09,0x80,0xe1,0x03 }, { 0x89,0x74,0xb4,0xa0,0x88,0xf1,0x10,0xe4,0x85,0xcc,0x9e,0x0b,0x5e,0x8e,0xab,0xc3,0x39,0x26,0xc7,0x00,0x7b,0x18,0xef,0xd0,0xc4,0xc4,0xcb,0x4e,0xdf,0x16,0xc6,0x35 }, { 0x26,0xc6,0x66,0x4f,0x0f,0x9a,0xb9,0x49,0x12,0x39,0x83,0x88,0x15,0x4f,0xaf,0xd4,0xe5,0x5c,0x9f,0xbc,0xfe,0x94,0x77,0x29,0x13,0xcd,0x03,0xee,0x64,0xbf,0xe3,0x57 }, { 0x46,0xaa,0xa2,0x16,0xd4,0x9f,0x74,0x7c,0xdf,0x29,0x4c,0xa8,0x64,0x09,0xb5,0x83,0x69,0xc6,0xd2,0x3b,0x7e,0xec,0x2b,0x12,0x3d,0x13,0x30,0xa6,0x33,0x20,0xe4,0x36 }, { 0x05,0x79,0x56,0x30,0x04,0x27,0x4d,0xc0,0xbd,0x8a,0xde,0x46,0x5f,0xf9,0xae,0x9d,0x23,0x61,0x7e,0x67,0xa9,0xb4,0xbe,0x0d,0xd4,0x97,0xa6,0x4a,0xfc,0x04,0xc2,0x65 }, { 0x48,0x28,0x2a,0xf7,0xe3,0x92,0x34,0xdb,0x40,0xb8,0x2c,0x62,0x2b,0xb9,0xfe,0x31,0x3b,0xc0,0x0f,0x60,0x61,0xdb,0x48,0x14,0x49,0x77,0x6f,0x62,0x97,0x67,0x0c,0x31 }, { 0x4e,0x8b,0x52,0x0f,0xdf,0x4a,0xdc,0x43,0x6f,0x12,0xbb,0x12,0x1d,0xcb,0x20,0x44,0x3e,0xc3,0x30,0x81,0x7b,0xba,0x31,0xfe,0x7e,0x25,0xaa,0x88,0x7c,0x78,0x8c,0x3a }, { 0xdd,0xf2,0xe7,0x31,0xe7,0x3c,0x26,0xbb,0xee,0x76,0xc7,0x32,0xfb,0x89,0x94,0xf7,0x60,0x72,0xf5,0x48,0x8b,0x9b,0x34,0x18,0x69,0x86,0xe2,0x3a,0xe5,0xb8,0x12,0x58 }, { 0xa4,0xe4,0x68,0x6a,0xd2,0x86,0xa7,0x4a,0xe8,0xcd,0x5f,0x96,0x28,0xf0,0x45,0x3f,0x58,0xf9,0x5e,0x08,0x6a,0xe6,0x00,0xbc,0xba,0x2f,0x76,0x10,0x9b,0xad,0x07,0x46 }, { 0xf7,0x53,0x8e,0xb1,0xaa,0xbf,0xba,0x8c,0xa3,0x1c,0x0e,0x63,0x60,0x9f,0x9b,0x54,0x56,0x6f,0xda,0x68,0x19,0xb1,0x2d,0xb5,0x8e,0x4e,0x82,0xce,0xc3,0x79,0x44,0x5d }, { 0x02,0x75,0x91,0x27,0x08,0x9c,0x40,0xe1,0xf2,0x7c,0xde,0xa7,0xbe,0x8d,0xb0,0xa5,0xda,0x4f,0x00,0x3c,0x6a,0x8d,0x95,0x5d,0x91,0xeb,0x16,0xcb,0xbf,0x97,0x21,0x3d }, { 0xba,0xa1,0x40,0x3f,0x9d,0xa4,0xac,0xa2,0x4e,0x31,0xb0,0x53,0x10,0x1c,0x0a,0x8e,0x63,0x2b,0xf2,0x23,0x0e,0x5d,0x2a,0x2a,0x7c,0x37,0x97,0xac,0x56,0x31,0x36,0x0f }, { 0x1b,0xf6,0xbf,0x46,0xc7,0x04,0x26,0xa1,0x23,0xbf,0x3e,0xfe,0x06,0x02,0xd8,0x40,0x32,0x53,0xeb,0x84,0xff,0xa0,0x94,0x54,0x78,0xa0,0x83,0xd5,0xef,0xb5,0x26,0x7c }, { 0xe6,0xe3,0x9f,0x90,0x59,0x46,0xf1,0xd6,0x30,0x53,0x9b,0xb1,0xb3,0x3f,0x70,0x52,0x69,0x2a,0x44,0x5a,0xe8,0x92,0xea,0xf3,0x67,0x32,0xde,0x2a,0x33,0x66,0x9b,0x47 }, { 0x99,0x11,0x0e,0x20,0xf7,0x6a,0x53,0xd4,0xfa,0xc1,0x97,0xa7,0x20,0x8a,0x6c,0xc7,0xd4,0xe7,0x61,0x11,0xfe,0xfc,0x68,0x84,0x01,0x69,0x72,0x2e,0x54,0x9b,0xd0,0x31 }, { 0x97,0xd2,0x1b,0x14,0x25,0x1d,0x43,0x0e,0x49,0xb6,0x63,0xa7,0x1d,0xf0,0x2d,0xd8,0xb7,0x31,0x54,0x14,0x13,0xdb,0x62,0x43,0x27,0x3e,0xbd,0xf0,0x01,0x61,0xa6,0x70 }, { 0xdd,0x16,0x8d,0x2f,0x34,0x42,0x74,0xaf,0x50,0x07,0x83,0xbc,0x3d,0x9f,0x91,0x59,0xde,0xd0,0x86,0x48,0x27,0x7c,0x0a,0x4a,0xb2,0x76,0xe6,0x25,0xe5,0x90,0xde,0x55 }, { 0xe4,0xee,0xc7,0xe7,0x58,0x95,0x5b,0xb8,0x0d,0x43,0xe2,0xf2,0x3e,0x64,0xa8,0xe2,0x06,0xa6,0x64,0xd4,0x4c,0x09,0xea,0x72,0x9f,0x48,0x50,0xa2,0x72,0x9a,0x02,0x20 }, { 0x84,0xcd,0x2c,0xf9,0xcc,0x1a,0x4f,0x1c,0x97,0x8e,0xa9,0x2e,0x0c,0x4b,0x23,0xe2,0x3c,0x84,0x21,0xa7,0x78,0x98,0x1f,0x4a,0x72,0x41,0xd1,0x4e,0x83,0x63,0xd1,0x7b }, { 0xb9,0xd9,0x05,0xef,0xf5,0x1a,0xf1,0xba,0x11,0x21,0x36,0xf8,0x06,0x38,0xb9,0xb9,0xfb,0x2f,0x44,0xd9,0xf4,0x09,0x19,0x9a,0xeb,0xb6,0xd4,0xd3,0x18,0x40,0x97,0x77 }, { 0x0f,0x34,0x6e,0x25,0xa5,0x1e,0x73,0x9b,0x98,0x04,0xb7,0xcb,0x27,0xfb,0x16,0xfb,0xcf,0x74,0xb5,0x90,0x2f,0xf2,0x1a,0xe8,0xff,0x63,0x1b,0x29,0x9d,0xe8,0x8a,0x7f }, { 0x5a,0xf4,0xcd,0xd7,0x50,0xab,0x46,0x03,0xdc,0x53,0xad,0xf5,0xb8,0x17,0x5e,0x33,0xf3,0xe5,0xa8,0x7b,0x27,0x62,0x90,0x6d,0x5d,0xaf,0x4b,0x2f,0x71,0xd3,0xb7,0x4f }, { 0xaf,0x1d,0xf4,0xeb,0x33,0x45,0xf8,0x75,0x48,0x1d,0x30,0x80,0xf8,0x1c,0x93,0x67,0xf7,0x3a,0x84,0x21,0xa0,0xbb,0x4a,0x22,0x66,0x43,0x44,0x8a,0xa9,0xa5,0xef,0x09 }, { 0xde,0x5b,0x8d,0x4e,0x61,0x24,0x30,0xc8,0xfc,0xd9,0xe2,0xbc,0xa4,0x89,0x32,0xc7,0x9f,0x11,0x05,0x00,0xc0,0x5a,0x68,0x77,0x36,0x23,0x63,0x50,0x1e,0x10,0x07,0x6b }, { 0x17,0x45,0x2b,0xfb,0xae,0x2c,0x81,0xff,0x0b,0xaf,0x6b,0xaf,0xcd,0x6d,0xd6,0xf4,0x96,0x43,0x7c,0x34,0x43,0xf5,0xeb,0x16,0x98,0x2a,0xb3,0xec,0xb5,0xd2,0x94,0x46 }, { 0x30,0x95,0xa9,0x14,0x0d,0x84,0xad,0xee,0x88,0x77,0x95,0xf6,0x96,0x6a,0xa9,0x90,0xc3,0xed,0xca,0xbb,0x65,0x8f,0xd4,0xd2,0x17,0xba,0x86,0x33,0x6c,0x99,0x9a,0x30 }, { 0x70,0x24,0x40,0x73,0x33,0x0a,0xe9,0x47,0x65,0xe1,0x6c,0xda,0xb7,0x0c,0x0b,0x94,0x4c,0x12,0x12,0xe9,0x16,0x88,0x56,0x64,0xca,0xbb,0x18,0x41,0x99,0xda,0xbc,0x29 }, { 0xf7,0x9c,0xce,0xc7,0x5d,0x66,0xa5,0x6e,0x4e,0xd6,0x30,0x1b,0x63,0x7e,0xb4,0x49,0xee,0x01,0xa6,0x65,0xdd,0x2c,0x78,0xf8,0xd4,0x3e,0x37,0x9f,0xce,0x65,0xe0,0x34 }, { 0xb1,0xc4,0x94,0xd9,0x2e,0x93,0x33,0x6e,0x8b,0xab,0xda,0x55,0x58,0xf1,0x1b,0x8b,0x83,0x2c,0x93,0xb6,0x8f,0xb8,0xa6,0x91,0x8c,0x8f,0x0b,0x86,0xc1,0xe8,0x85,0x1d }, { 0xe9,0x1c,0x16,0x22,0x39,0xb1,0xd2,0x1f,0x70,0xd9,0x81,0x43,0xac,0x9b,0xa1,0x5d,0xbd,0x8d,0xe0,0x89,0xba,0x24,0x8f,0xbf,0x45,0xee,0xe5,0x2c,0xfe,0xe0,0xc2,0x2b }, { 0x89,0xfa,0xb4,0x3f,0xc4,0x56,0xea,0x75,0x14,0x96,0x4e,0x79,0x4c,0x01,0x16,0xd7,0x55,0x35,0xf0,0xb3,0xfb,0xc6,0xdf,0x61,0xb5,0xbf,0x07,0xa5,0xc4,0x76,0x5e,0x05 }, { 0xed,0x0d,0xe3,0x31,0x92,0xf9,0x11,0x0a,0xb2,0xed,0x5d,0x8d,0x96,0xfc,0x1e,0x53,0x5b,0xb2,0xc5,0xd1,0x6f,0x60,0xdd,0xc6,0x1c,0xfe,0xef,0xf8,0x9b,0x8d,0x79,0x17 }, { 0x40,0x1c,0x21,0x1c,0xda,0xb2,0x81,0x57,0x4c,0xe7,0xe7,0x6c,0xde,0x69,0x71,0x8b,0x0a,0x23,0xbb,0x39,0xd8,0x99,0x12,0x4e,0xb8,0xdf,0x09,0x4e,0xe8,0x95,0x2e,0x57 }, { 0xc8,0xb3,0xa6,0xee,0x15,0xb2,0x9a,0x62,0xe3,0xcd,0xd5,0x3f,0xb9,0x4c,0x6f,0x06,0x79,0x1f,0xff,0x21,0xa4,0x36,0xb6,0xdb,0x52,0x88,0x0f,0x1b,0x68,0x24,0x69,0x3c }, { 0x2f,0x1e,0xf0,0x78,0x2d,0x60,0x8b,0x6d,0x99,0x07,0xac,0x6b,0x53,0x3d,0x5e,0x0c,0x92,0x03,0x02,0xe1,0x02,0xd0,0x68,0xe0,0xac,0xb6,0x27,0x60,0x2c,0xaa,0x3b,0x71 }, { 0x4c,0x8d,0x11,0xca,0xea,0x52,0xe8,0xdf,0x4f,0xa8,0x6b,0x39,0xc7,0xd4,0x20,0xa8,0xb3,0xd4,0x60,0x8d,0x50,0x15,0xb3,0x82,0x34,0xcb,0x38,0xa4,0xd3,0x84,0x0e,0x2d }, { 0xc7,0x19,0x36,0xf3,0x78,0xc8,0xb8,0xa0,0x52,0x1f,0x4a,0xc2,0x30,0x99,0x9e,0x18,0x56,0x16,0xdd,0xaf,0x46,0x37,0x99,0xde,0xce,0x6b,0x85,0xaa,0x1c,0x80,0x3d,0x35 }, { 0x07,0x01,0x88,0xfe,0xc1,0xe6,0xc3,0x12,0xa6,0x6e,0x97,0x96,0x4c,0xd4,0x98,0x10,0x84,0xd3,0x97,0xe3,0x83,0x21,0xbe,0x75,0x10,0x50,0x9f,0xf9,0x10,0x31,0xe7,0x3b }, { 0x72,0xef,0x9f,0x61,0x99,0x60,0x1f,0x5a,0x3d,0x2d,0x0b,0x7f,0x71,0x25,0xcf,0x30,0xd3,0x23,0xbd,0x3e,0xc7,0x3e,0xe1,0x67,0xcf,0x66,0x17,0xf4,0xf0,0x06,0xd9,0x55 }, { 0x09,0x96,0x30,0xa6,0x3c,0xfc,0x6c,0x53,0xb6,0x02,0xb7,0xbd,0xa5,0x97,0x28,0xbc,0x43,0xac,0x65,0x85,0xcc,0x56,0x4d,0x0b,0x62,0xb5,0xf0,0xaf,0x8b,0xe9,0x67,0x15 }, { 0xda,0x50,0x19,0xcc,0x8f,0x78,0x64,0xbd,0x1c,0xaa,0xb6,0xa7,0xc0,0xb8,0xd4,0xcb,0x6d,0xe6,0xc8,0x1f,0xd7,0x67,0x04,0x08,0xd1,0xe7,0xf6,0x9a,0xbd,0xf1,0xde,0x15 }, { 0xfa,0xbc,0xaa,0xef,0x7c,0xeb,0xfc,0xa7,0x4d,0xf1,0x89,0xed,0x7e,0xd4,0x4a,0xe9,0x7a,0xfb,0xb3,0x91,0xbd,0xf2,0xed,0xd4,0x3f,0xdc,0x7f,0x19,0xa0,0x5f,0x3f,0x0d }, { 0xdb,0x26,0x78,0xcd,0xc3,0x31,0xc1,0x74,0x65,0x9c,0xea,0x36,0x5b,0x0a,0xa6,0x02,0xcb,0x79,0xe8,0x30,0x83,0xb0,0x89,0x1b,0xc8,0x1a,0x87,0x92,0x78,0x53,0xcf,0x35 }, { 0x45,0x46,0x47,0x0d,0x8e,0x5a,0x50,0xf8,0x3c,0x69,0x80,0xf5,0x23,0x34,0x58,0x12,0x52,0x7f,0x0d,0xbf,0xf1,0x34,0x34,0x75,0x97,0xf9,0x02,0x9f,0xec,0x47,0xf9,0x30 }, { 0xd1,0xeb,0x0d,0x89,0x7f,0x2d,0x4e,0xcb,0xc6,0x1c,0xc4,0x84,0x4e,0xe8,0xb3,0xe0,0x15,0xe7,0x48,0x8d,0x96,0xa5,0xd1,0x28,0x60,0xbf,0x22,0xe7,0xd9,0x8c,0x61,0x78 }, { 0x0b,0xc0,0x3a,0xf2,0x3d,0x79,0x20,0xc3,0xa2,0x1e,0xe4,0x96,0xcc,0x02,0xf9,0x7e,0x20,0x7a,0x60,0xba,0x63,0x3e,0x51,0x8b,0x69,0xdd,0x51,0xf4,0x31,0xe7,0xde,0x28 }, { 0x68,0x25,0x64,0x37,0x26,0xb6,0x71,0xaa,0xfd,0x80,0xf8,0x72,0xaf,0xbb,0xd6,0x34,0xf8,0xce,0x19,0x57,0x6b,0xba,0x3e,0x47,0x5f,0x4d,0x5c,0x91,0x5b,0xbc,0x35,0x05 }, { 0x23,0x3a,0xd4,0xad,0x0c,0xde,0x95,0x8f,0x8e,0xa7,0xbd,0x99,0x60,0x18,0x8e,0xa3,0x14,0x55,0x2b,0xbe,0x8e,0x56,0x44,0x27,0xfc,0xe8,0x85,0x28,0xec,0xe4,0xc3,0x48 }, { 0x21,0xdf,0x6a,0xda,0xbf,0xc4,0xb9,0x01,0x7e,0xc9,0x36,0x93,0xfd,0x63,0xc5,0x34,0x01,0xc7,0x65,0xad,0x4a,0x97,0xcd,0xec,0x3e,0x03,0x62,0x55,0x3a,0xcf,0x03,0x70 }, { 0x6f,0x8e,0x4a,0x5d,0x95,0xd5,0x70,0x91,0x38,0x8d,0xff,0x62,0x9d,0xb3,0x09,0x33,0x39,0x8a,0x4d,0x21,0xa6,0xfb,0xd0,0x78,0xe2,0x96,0x7a,0xc8,0x49,0x9a,0x88,0x28 }, { 0x63,0x43,0x34,0x4a,0x05,0x39,0x6e,0xf7,0xeb,0x08,0x24,0x58,0x1d,0x44,0x76,0x16,0x59,0x38,0x1b,0xe0,0xab,0xcd,0x88,0x98,0x98,0x71,0xca,0x53,0x1a,0x89,0x81,0x62 }, { 0x5d,0x96,0xab,0xee,0x95,0x2c,0x79,0x92,0xe2,0x59,0x2c,0x08,0xdb,0xf7,0x04,0x83,0xc6,0x17,0x8a,0xb9,0x88,0x7e,0x1e,0x88,0xd1,0x9c,0xb2,0x5e,0x22,0x25,0x07,0x6c }, { 0x01,0x4a,0x91,0xef,0x0b,0x3c,0xa1,0x8f,0xab,0x94,0xd4,0x0f,0x82,0x80,0x11,0x51,0xc7,0x36,0x21,0xc4,0x5c,0x24,0xa8,0x3f,0x51,0xf0,0x98,0xb2,0x3f,0xd1,0x19,0x17 }, { 0xab,0x7a,0x4f,0x4c,0x96,0xd5,0xdf,0x9c,0x52,0xe7,0x4b,0x7d,0x67,0x41,0xc9,0xc8,0xf3,0x04,0xc0,0x70,0x74,0x42,0x78,0xed,0x93,0x8b,0x73,0x34,0x97,0x7b,0x09,0x27 }, { 0x6e,0xc3,0xba,0x59,0xfe,0x61,0x73,0xd0,0x2a,0x82,0x9f,0x13,0x2a,0x90,0x9e,0xdc,0x20,0x6a,0x97,0x83,0xa6,0x83,0x3d,0xa9,0xc1,0x35,0x32,0x61,0xbb,0x13,0x70,0x58 }, { 0xf1,0x91,0x4e,0x81,0xfe,0xb9,0x91,0xdc,0x5b,0xce,0xde,0x23,0xdd,0x26,0xaf,0xb6,0x3b,0x0e,0xc0,0x78,0xe9,0x54,0x31,0x53,0x7d,0x86,0x77,0x13,0xfe,0x14,0x48,0x2b }, { 0x44,0x13,0xf1,0xe1,0x2b,0x3d,0xaa,0x9a,0x6b,0x68,0x5d,0xe5,0x93,0xc6,0x46,0xd0,0x30,0xf3,0x41,0xd2,0x86,0x8b,0x05,0xd1,0x6a,0xdf,0xbb,0xe4,0x09,0x75,0x8e,0x2b }, { 0x99,0x0f,0xd6,0xa8,0xb9,0xc7,0xa0,0xc7,0x9a,0xd6,0x20,0xb5,0xe7,0x77,0x75,0x07,0x6c,0x3d,0xe2,0x2b,0x73,0xae,0xde,0x22,0x2e,0x1e,0xe0,0x78,0xa9,0xe5,0x12,0x5b }, { 0x01,0xdf,0xe9,0x65,0xa0,0x89,0xa4,0xee,0x95,0x42,0xdd,0xc2,0xc9,0xb5,0x56,0xd2,0x3b,0x43,0x85,0xe6,0x04,0x93,0x88,0x23,0x56,0x1c,0x70,0x27,0xf1,0x54,0x73,0x22 }, { 0x6d,0x74,0x93,0xe0,0x57,0x52,0x62,0x75,0x46,0xf8,0x3a,0x6a,0xa4,0x1d,0x23,0xd8,0x84,0xae,0x10,0x91,0xde,0x49,0x02,0xb5,0xdd,0x1b,0x43,0xfd,0xd5,0x08,0x19,0x6b }, { 0x32,0x52,0x3d,0x98,0xab,0x15,0x4a,0x44,0x6d,0x15,0xc8,0x31,0x8c,0x7a,0x2e,0xd6,0x6b,0x7e,0x9d,0x5f,0xf9,0xfb,0xe8,0xb4,0xa6,0x44,0x3c,0x01,0x6d,0x58,0x8b,0x17 }, { 0x34,0xa6,0x2b,0x13,0x67,0x80,0xa0,0x53,0x8a,0xd2,0x9b,0x9e,0x3c,0xa5,0x32,0x59,0x94,0xd2,0x1e,0xca,0xe3,0xee,0x67,0x11,0xef,0xd1,0x34,0x33,0x6a,0xf6,0x44,0x51 }, { 0x33,0xb3,0x35,0x92,0xd1,0xb1,0x86,0x27,0xf6,0xaf,0x1b,0x6a,0x3d,0x9b,0xe2,0x15,0xd9,0xbe,0x39,0xd3,0xd1,0x7b,0xbe,0x90,0x57,0xae,0x42,0xea,0x92,0x54,0x0a,0x61 }, { 0x81,0xcd,0x54,0xa4,0x49,0xdd,0x3f,0xda,0xbe,0x18,0xc4,0x3f,0x7d,0x6f,0xa9,0x53,0xb8,0x32,0xca,0xab,0xac,0xf5,0x3f,0x68,0xfa,0x3d,0xde,0x1f,0x8c,0xb5,0x03,0x4a }, { 0xd2,0xf5,0x34,0xbb,0xfa,0x41,0x87,0x41,0xae,0x8a,0x15,0xb2,0xd7,0x5a,0x80,0xed,0xba,0xf7,0xeb,0xc1,0xff,0x63,0xec,0x68,0x2f,0x85,0x14,0x91,0x11,0x34,0x29,0x65 }, { 0x66,0x08,0x12,0xb4,0xf7,0x02,0x52,0xbf,0x86,0x6a,0x0f,0x11,0xf4,0x4b,0xe1,0x59,0x0e,0x6a,0x56,0x56,0xe5,0x19,0x94,0x32,0x3c,0x9a,0x70,0x2f,0xed,0x9a,0xbb,0x10 }, { 0x7a,0x05,0x29,0x73,0x40,0x78,0x68,0x4c,0x03,0xa5,0xde,0xf9,0x80,0x97,0x6e,0x8c,0x2b,0xa1,0x23,0xd6,0xca,0x74,0x56,0xdb,0x35,0xbe,0xb5,0x35,0x24,0xa9,0x06,0x54 }, { 0xf0,0xc0,0x64,0xd1,0x9d,0xe8,0x60,0x2b,0x60,0xe7,0x3e,0xea,0xfe,0x32,0xb8,0x6f,0xf9,0x54,0x8d,0x2d,0xf8,0x0a,0x2d,0x70,0x69,0xd4,0x5a,0xc9,0x85,0x97,0x8e,0x36 }, { 0xf5,0x2d,0xba,0x28,0x58,0x64,0x2c,0xb3,0x51,0x5f,0xa5,0x90,0x16,0x5c,0x9c,0x8b,0x15,0x29,0xb3,0x6c,0x70,0xcb,0x09,0xd1,0xdc,0x5c,0x94,0xec,0x46,0x53,0xc6,0x42 }, { 0x75,0x09,0x0f,0xa5,0xad,0xe1,0xc5,0x56,0x47,0xee,0xff,0x18,0xae,0xbf,0xc8,0x0f,0xbb,0xab,0xc8,0xdc,0x04,0xf9,0x6c,0x57,0xcb,0xbd,0x42,0xbc,0x43,0x78,0xb6,0x3b }, { 0xba,0x39,0x7a,0x11,0x0e,0x55,0x02,0xdd,0x75,0x69,0x4d,0xf8,0x4c,0xbd,0xac,0x21,0x6f,0x7d,0x74,0xc6,0xb3,0x51,0xf0,0x28,0x44,0xcf,0xb5,0x62,0x8f,0xf7,0x36,0x1e }, { 0xbd,0xfe,0x4c,0x01,0xd6,0xd9,0x7c,0xc5,0x90,0x8b,0x63,0x3a,0x57,0xac,0x52,0x32,0x4f,0x48,0xe5,0x1c,0xcb,0x9b,0x80,0x05,0x63,0xcf,0x3e,0xc2,0x30,0x35,0x92,0x30 }, { 0x1c,0x4e,0xe8,0xaf,0xfb,0x88,0x2c,0xe8,0x61,0xe1,0xaa,0xbb,0x54,0x38,0xb1,0xc6,0x43,0x9b,0x84,0x84,0x99,0x26,0x87,0xdf,0x62,0x49,0x4e,0xdd,0x2a,0x9e,0x5e,0x15 }, { 0x58,0x0a,0xd8,0x02,0xda,0xeb,0x21,0x58,0x35,0x1e,0x2e,0x5f,0xc6,0x3e,0xcd,0xfc,0x9f,0xfe,0x72,0x8c,0xe7,0x15,0x9b,0xf3,0x29,0x7b,0x77,0xbf,0x55,0x35,0x94,0x78 }, { 0x9a,0x96,0xd4,0xec,0x2a,0x9c,0xe7,0xe3,0xb6,0x71,0x5d,0xf0,0xd3,0xec,0xf9,0x75,0x88,0xe2,0x9b,0xfc,0x3f,0x2e,0xad,0x24,0xe6,0xae,0xba,0x30,0xe3,0x89,0x32,0x36 }, { 0xfb,0xa4,0xdb,0x97,0x00,0x35,0xe5,0x91,0xe0,0x06,0x14,0x78,0x39,0xac,0x32,0xb2,0xd7,0xeb,0x3d,0x9d,0x87,0x08,0x37,0xcb,0x75,0x16,0xda,0xae,0x9e,0x60,0xdd,0x2f }, { 0xfc,0x27,0x3c,0x86,0xd5,0xdb,0x2e,0x42,0xd9,0x78,0x2d,0xc4,0x93,0xaa,0x4b,0x6e,0x82,0xc4,0xba,0x27,0x3e,0x51,0x2d,0xc3,0x3a,0xbd,0x49,0xfc,0xab,0xc8,0x71,0x0c }, { 0x69,0xaf,0xdb,0xf5,0x99,0xc6,0xa3,0xb7,0x15,0x4d,0x8b,0x6d,0x74,0xf4,0xe7,0x97,0x13,0xf4,0x4e,0x55,0xcb,0x56,0xe2,0xdb,0x1b,0x4d,0x20,0x78,0xcf,0x16,0xdd,0x36 }, { 0xe3,0x22,0x42,0xf5,0x18,0x27,0xd8,0x60,0x5f,0x85,0x08,0xa0,0x24,0xc1,0xd0,0x6e,0x7d,0x5f,0xda,0x94,0xb9,0x2d,0xc8,0x9d,0x94,0xf0,0x82,0xd0,0x4f,0x4f,0x5b,0x69 }, { 0xb3,0x4a,0x83,0x5a,0x97,0x33,0xd4,0x84,0xdf,0xb4,0x73,0x65,0x64,0x9e,0x14,0xdc,0x96,0x12,0x39,0x48,0x9e,0xc2,0x62,0x07,0x1f,0x8e,0x4d,0x8e,0xbc,0x93,0xee,0x7a }, { 0x3b,0x00,0x96,0x02,0x5e,0x00,0x22,0x44,0xc6,0x90,0x06,0x41,0xb4,0xde,0x39,0xe8,0xff,0x05,0xcf,0xb3,0xdf,0x99,0xe7,0x53,0xf1,0x3c,0x14,0x42,0xd5,0xaa,0xfd,0x79 }, { 0x58,0x0e,0xe1,0x30,0x1a,0x83,0x10,0xdd,0x3d,0xd3,0xa6,0xe4,0xbc,0xf8,0x1d,0x32,0x57,0xde,0xd5,0xde,0xb8,0x63,0x5a,0xb5,0x18,0x50,0x90,0x4a,0x96,0x3e,0x44,0x20 }, { 0xbe,0x13,0x59,0x56,0xa9,0x62,0x07,0x90,0xaa,0xa9,0x54,0xd9,0x26,0x34,0x8b,0xad,0x6b,0x99,0xbf,0x5d,0x6a,0x07,0xdc,0x9a,0xd8,0x18,0x39,0xac,0xde,0x56,0x5c,0x2a }, { 0xfc,0xff,0x60,0x5a,0xe9,0x8b,0x03,0xea,0xda,0xeb,0x87,0x52,0xad,0xf5,0xd9,0x59,0x72,0xf9,0xfa,0x89,0xed,0x06,0x3d,0xd3,0xd9,0xf1,0xb2,0xba,0xb1,0x9c,0x11,0x0e }, { 0x40,0x81,0xa0,0xef,0x74,0x4f,0x6c,0x9b,0x01,0xdf,0xd7,0x8f,0x5b,0x5b,0x18,0x38,0x6a,0xa4,0x58,0xd1,0xaa,0x63,0xe9,0x36,0x7d,0x01,0x97,0x44,0xa5,0x4e,0x52,0x46 }, { 0x67,0x93,0xc5,0x68,0x12,0xa6,0x6b,0x01,0xad,0xd7,0x7d,0xbc,0x98,0x33,0xe8,0x61,0xd6,0x22,0x7e,0x83,0x2c,0xe3,0x01,0xed,0x40,0x86,0x0e,0x77,0xc7,0xa2,0x80,0x3f }, { 0x9c,0x3c,0xb1,0x17,0x60,0x97,0x75,0x88,0xdd,0xe4,0x66,0x35,0x35,0xc3,0xb7,0x47,0x65,0x3f,0x58,0x46,0x31,0x7a,0xb2,0xed,0xdc,0x26,0x66,0x07,0xb4,0xe3,0xc2,0x33 }, { 0x5c,0x14,0xe3,0x22,0x24,0xfb,0x92,0x6b,0xa4,0x46,0x95,0x5d,0x85,0x4a,0xaa,0xab,0x51,0xe4,0xf5,0xa6,0x16,0xb7,0x4e,0x85,0x32,0xbd,0x42,0xaf,0x3c,0x07,0x77,0x4e }, { 0x57,0x62,0x0c,0xf1,0x06,0xb8,0x6e,0x88,0x74,0x22,0x77,0xcf,0xd7,0x79,0xd5,0xf2,0x2f,0x4d,0xb0,0xe9,0x14,0x80,0x46,0xdc,0x92,0xd5,0x0c,0xe8,0xd2,0xd5,0x19,0x42 }, { 0x50,0x78,0x5d,0xc6,0xab,0x78,0x82,0xc3,0xd6,0x5a,0x42,0x93,0xa9,0x03,0x1b,0x10,0x0b,0xc7,0x0b,0xf7,0xe7,0xc9,0x0b,0x54,0x0e,0xca,0xb5,0x0b,0x06,0xe4,0xd9,0x03 }, { 0xe3,0x61,0x31,0x92,0xb8,0xad,0xf9,0x49,0xf2,0x14,0xa4,0x72,0xb2,0x8f,0x2e,0x6b,0x4b,0x42,0x4b,0xf0,0x29,0x3e,0x7b,0xcf,0x7b,0x09,0x4e,0x83,0xe5,0x8b,0xff,0x0f }, { 0x2e,0x44,0xbb,0xb2,0xa4,0x22,0xb2,0xf9,0x46,0x74,0x67,0x89,0x8b,0x41,0x71,0xd9,0x75,0xa2,0x5c,0xa5,0xf6,0x80,0xed,0x56,0xd5,0x6e,0x05,0xc8,0xce,0xdf,0x43,0x79 }, { 0x4d,0x3b,0x90,0x6a,0x89,0xf1,0xab,0x5c,0x60,0xd3,0xb3,0x2f,0x0e,0x98,0xeb,0x82,0xeb,0x9d,0x81,0xf5,0x22,0x42,0x3c,0x7e,0xfe,0x31,0x33,0x61,0x4e,0xc8,0xee,0x51 }, { 0x25,0xe8,0xac,0xfd,0x85,0x33,0x6e,0x8f,0x78,0x4d,0xba,0x7f,0xfd,0x8a,0xf9,0x0d,0x4e,0xe4,0x5e,0x00,0xa6,0xab,0x07,0x0b,0x51,0x1f,0xa5,0xba,0x4f,0x43,0x54,0x7f }, { 0x69,0x91,0x59,0x31,0xdb,0x58,0x7b,0x44,0x20,0x93,0xd7,0x8a,0xce,0x4d,0x8e,0xa8,0x02,0x6f,0x57,0xaf,0xa8,0xf6,0x8d,0x1c,0xbe,0x66,0x72,0xbe,0x60,0x92,0xb9,0x39 }, { 0xb3,0x91,0xf9,0xa2,0xc4,0x9b,0x06,0x01,0xf7,0x15,0xeb,0xbe,0x4b,0xba,0xe0,0xc2,0x44,0xe4,0x06,0xf8,0xd7,0x9d,0x47,0xd1,0x41,0x90,0x49,0xe2,0xb4,0xcb,0x73,0x30 }, { 0xeb,0xf8,0xaf,0xb1,0x88,0x33,0x12,0x1a,0x58,0xc2,0xc4,0xb8,0x91,0xda,0xb3,0x67,0x7f,0x6c,0xe2,0xb5,0x57,0x37,0x89,0x5f,0x66,0xff,0x93,0x9a,0xc6,0xcc,0x89,0x44 }, { 0xe7,0x35,0x1d,0x0a,0x3e,0x30,0x0f,0xa0,0x14,0x13,0x43,0x73,0xd4,0xc9,0xd9,0xb8,0xac,0xf5,0x77,0x4c,0xd2,0xe3,0xf7,0xe3,0xef,0x80,0x16,0xfc,0x06,0x52,0x6c,0x5c }, { 0xec,0x1f,0x26,0xc5,0xf8,0x5c,0xda,0xf2,0x49,0xc9,0x4a,0x5a,0x36,0x63,0x69,0xd0,0xce,0xb3,0xbb,0x68,0xb2,0xa5,0x35,0xc1,0x14,0x6f,0xf4,0x94,0x98,0xf2,0x53,0x02 }, { 0xab,0x3b,0x52,0x18,0xf4,0x30,0x5d,0x5f,0x6b,0x1d,0x62,0x82,0x3d,0xbe,0x1c,0x5f,0x35,0xd5,0x0e,0x34,0x37,0x52,0x5b,0x7a,0x96,0xf8,0xf1,0x2a,0x5b,0x0e,0xe6,0x3e }, { 0x1c,0xba,0x70,0x12,0xe7,0xe5,0x8e,0xe3,0x4c,0x12,0x9c,0x64,0x0c,0x65,0xaf,0x00,0x0a,0x8c,0xc0,0x9f,0xbe,0x7e,0x02,0xbe,0x27,0x46,0x9b,0xc2,0xdf,0x18,0xfe,0x37 }, { 0x27,0x20,0x50,0xde,0xf9,0x22,0xf5,0xb2,0xc6,0x81,0x42,0x87,0x7a,0x19,0x1c,0xe7,0xaa,0x91,0x43,0xc2,0x62,0x08,0x72,0x41,0x94,0xa6,0x31,0x92,0x8c,0x09,0xa4,0x50 }, { 0xf6,0x86,0x62,0x0b,0xb4,0x6e,0x33,0xbc,0xc4,0xb9,0x58,0xc5,0x6c,0x5f,0xea,0x3a,0x01,0x06,0xdc,0x71,0x10,0xb9,0xf9,0x18,0xef,0xaf,0xdd,0xb2,0x07,0xc3,0xde,0x42 }, { 0x18,0x48,0x93,0x9a,0xae,0x94,0x37,0xbc,0x19,0x9d,0x45,0xbf,0x85,0x66,0x80,0xdd,0x81,0xac,0xa5,0xbe,0x19,0x19,0x7c,0xbc,0xd9,0x5f,0x61,0x84,0x03,0x17,0xaf,0x5a }, { 0x24,0xff,0x9d,0x0f,0xd4,0x94,0x86,0xf6,0x71,0x5b,0x73,0x5f,0x19,0x37,0xdd,0x9c,0xa7,0x32,0x51,0x85,0x2d,0x0b,0x89,0xeb,0x5a,0x99,0x07,0x6d,0x1c,0xda,0xe0,0x72 }, { 0x17,0x72,0x33,0xca,0x99,0x7b,0x1d,0x26,0xb7,0x1d,0xdd,0x42,0x75,0xbe,0xe4,0x05,0x43,0x9f,0xcd,0x9d,0xcd,0x6e,0xe0,0x4b,0x67,0x1a,0x98,0xf6,0xa1,0x5a,0x97,0x05 }, { 0xc5,0x43,0xb6,0x10,0x62,0x4c,0x80,0x66,0x89,0x73,0x93,0x41,0x23,0xbe,0x11,0x64,0x4b,0xc0,0x9e,0x49,0x8d,0xc1,0x4c,0x22,0x31,0x4a,0x3d,0xfc,0xf5,0x7d,0xac,0x7e }, { 0xa0,0xec,0x00,0x94,0x45,0xac,0x6e,0xe6,0xb2,0xcd,0x72,0x07,0xf5,0x67,0x34,0xe7,0x26,0x42,0x35,0x8d,0x19,0x78,0x8d,0xcc,0x61,0x18,0x5b,0x0a,0x29,0x1f,0xce,0x42 }, { 0x10,0x43,0x48,0x0e,0x0c,0x83,0xba,0x61,0xee,0x97,0x93,0x88,0x5d,0xd2,0xf0,0x48,0xab,0x88,0xd1,0x18,0xd6,0x47,0x20,0xd1,0xd0,0x2a,0x07,0x99,0x78,0x48,0xc0,0x2f }, { 0x28,0xce,0x29,0x46,0x46,0x4b,0x58,0xb0,0x72,0x88,0x8a,0x9c,0xc5,0x49,0x19,0xf9,0xac,0xf9,0x25,0x66,0x21,0xce,0xa6,0x15,0x16,0x05,0x07,0xba,0xf9,0xf1,0x64,0x45 }, { 0xb3,0xbb,0xa4,0xa1,0x76,0x91,0x0a,0xf5,0xd0,0x40,0x09,0xa4,0x82,0xaa,0x87,0x3d,0x5b,0x0b,0x50,0x39,0x0d,0x2b,0x45,0x79,0x97,0x8c,0xff,0x51,0x25,0x98,0xcf,0x38 }, { 0x5f,0x53,0x61,0x36,0x87,0xc5,0xff,0x87,0x6a,0xee,0xb4,0xe9,0x09,0x99,0x1e,0x87,0x99,0x4c,0xcc,0x02,0x5c,0x15,0xd6,0x59,0x84,0x91,0xbe,0x3c,0x69,0x4a,0x55,0x31 }, { 0xf8,0x88,0xcf,0x9a,0x88,0xf3,0x02,0xb3,0x97,0x4d,0x7f,0x57,0x21,0xcd,0x9d,0xe1,0x0d,0x98,0xe4,0x81,0xbc,0x21,0x3d,0xf1,0xbe,0x1e,0x3b,0x4d,0xc6,0xda,0xd7,0x50 }, { 0x2b,0x76,0x2e,0x7d,0x28,0x0d,0x89,0xfa,0xcf,0xea,0x49,0xd7,0xcb,0x81,0x06,0x69,0x92,0x50,0xae,0x1b,0x3a,0x8c,0xb4,0x24,0x50,0x9e,0xfc,0xed,0x72,0xf1,0x26,0x3d }, { 0x83,0x90,0x63,0xf2,0x49,0x98,0x37,0x20,0x13,0x43,0xc9,0x00,0x2d,0xa6,0xab,0x4a,0x96,0x8c,0x8f,0x09,0x76,0x37,0x11,0x91,0xfb,0x92,0x00,0xb9,0x35,0x54,0xfc,0x14 }, { 0x60,0xea,0x1c,0x43,0x76,0x57,0x5f,0xcd,0x8b,0xdc,0xc7,0xb8,0xec,0x88,0xb1,0x27,0xc9,0x36,0x86,0xdd,0xe7,0x00,0x5a,0xc7,0x20,0x45,0x4e,0xc8,0x28,0x26,0x65,0x2e }, { 0x38,0xa2,0xbb,0xf6,0xc6,0x3b,0xfe,0xe5,0x5c,0x7e,0x9a,0x73,0xaa,0xc1,0x4e,0x53,0x24,0x48,0x18,0xee,0x00,0x87,0x40,0x87,0xdb,0x51,0x95,0xfc,0x20,0x70,0x2a,0x18 }, { 0xb0,0x31,0xd5,0x9b,0xbb,0x08,0x42,0xcc,0xf7,0x6a,0xdc,0xcc,0x15,0x51,0x0d,0x26,0xe0,0x2e,0xbf,0x45,0x85,0x47,0xe4,0x12,0x29,0xad,0x06,0x7a,0x84,0x6f,0x46,0x05 }, { 0x30,0xb8,0x12,0x14,0x53,0xcc,0x1d,0xf0,0x2c,0x6e,0x80,0xa4,0x18,0xb8,0xc6,0x4a,0xe4,0x1e,0x62,0xd3,0xd1,0x20,0x8b,0x90,0x62,0xdf,0x40,0x46,0xa2,0x0a,0xd2,0x51 }, { 0xd6,0xeb,0x6a,0x63,0xe5,0xff,0xa5,0x24,0x7e,0xc6,0x36,0x5f,0xf5,0x71,0x02,0xfc,0xbe,0xed,0x3b,0xe1,0xb2,0xdd,0xa2,0x31,0xce,0x53,0x1d,0xbd,0x65,0x6f,0xc7,0x4b }, { 0x56,0xd1,0x53,0xfe,0x49,0x3d,0xae,0x27,0xf4,0x7e,0xc7,0x74,0x61,0x13,0x33,0x7a,0x80,0x38,0x5d,0x72,0xa8,0x33,0xd4,0x8e,0x4f,0xa0,0xb3,0x55,0x2f,0x90,0xc4,0x49 }, { 0x75,0x0d,0x01,0x35,0x40,0x65,0xd8,0x7b,0x6d,0xf7,0xe6,0xeb,0x82,0x53,0x3d,0x68,0x2a,0xfa,0x9b,0x6a,0x54,0xda,0x1b,0xf8,0x0b,0x4c,0x49,0xcc,0xb7,0x6e,0xb9,0x1f }, { 0x15,0xa5,0x12,0x0d,0xac,0x08,0x1d,0x01,0xc3,0x16,0x34,0xab,0x01,0x94,0x97,0xcb,0xb5,0x4c,0xee,0xa9,0xc7,0x76,0xf7,0xea,0xa1,0xd7,0xf9,0x1c,0x97,0xc0,0x7b,0x49 }, { 0xef,0x7d,0xa3,0x73,0x97,0x69,0x97,0xf3,0x22,0xc1,0xac,0x9e,0xe0,0xd5,0x32,0x92,0x40,0xe9,0xa0,0x0d,0xd1,0xce,0xe4,0x58,0x5b,0x92,0x2e,0xfe,0x4b,0x00,0xe6,0x7b }, { 0x50,0xd8,0xf4,0x18,0x00,0x42,0xc2,0x8c,0xe9,0xe6,0x61,0x1b,0x87,0x90,0xe4,0xb1,0xa6,0x17,0xb5,0x60,0x51,0x9b,0x58,0xab,0x17,0xd9,0x36,0xb9,0x0e,0xa7,0x23,0x05 }, { 0x6f,0xb0,0x47,0xe6,0xee,0x6c,0x97,0x6e,0xbb,0xf1,0x1d,0x32,0x89,0x80,0x17,0xcd,0xc9,0xb5,0x04,0x10,0x67,0xe8,0xb3,0x5a,0x05,0xbf,0xff,0x5d,0x0f,0xe4,0x51,0x78 }, { 0x13,0x1c,0x00,0x4d,0x4b,0x03,0x5a,0x0c,0x13,0x35,0x36,0xa7,0x74,0x3f,0x5a,0x4a,0xe9,0xa2,0xa4,0xd9,0x43,0x02,0x37,0x6b,0xf0,0x61,0x0c,0xa8,0xd1,0x08,0x12,0x37 }, { 0xeb,0x1d,0x39,0x2f,0xe4,0xc7,0xa3,0x9b,0x81,0x04,0xde,0x6c,0xa5,0xa9,0x64,0xe2,0x17,0xf9,0x36,0x7a,0x7c,0x19,0xfb,0x4a,0x71,0xd0,0x57,0xb9,0x93,0x29,0x30,0x10 }, { 0xbc,0x04,0x7b,0xcf,0x06,0x8b,0xb0,0x94,0x94,0x5b,0xbc,0x63,0x09,0xc8,0x81,0xd4,0xd0,0x4a,0x76,0x30,0x23,0xfc,0xb1,0x8c,0x41,0x96,0x96,0xa8,0x9c,0xba,0xef,0x70 }, { 0x7a,0xbb,0xb2,0x07,0x26,0xa2,0x48,0x98,0xe4,0xa4,0x1d,0xb8,0x62,0x6f,0x77,0x86,0x5c,0x12,0x91,0x51,0x76,0xbf,0x72,0x3a,0xdf,0x0a,0x00,0x86,0x45,0xc9,0xc4,0x37 }, { 0xf7,0xe2,0x0f,0xc7,0x61,0x11,0xd7,0x70,0xdd,0xba,0x05,0x00,0xdb,0x3d,0x35,0x3a,0x75,0xd7,0xc3,0x0b,0x8c,0x6d,0x18,0xe5,0xd6,0xf8,0x6b,0xd4,0x84,0x3f,0xaf,0x7b }, { 0x63,0x6d,0x06,0x76,0xf5,0x9e,0x0b,0x65,0xd5,0xf8,0xfb,0xc7,0x28,0xe9,0x30,0x24,0x77,0x23,0xed,0x46,0xbc,0xf4,0x3b,0xdf,0xd3,0x0f,0x0d,0x0a,0x22,0x3c,0x16,0x2e }, { 0xaa,0x10,0x7a,0x84,0xcc,0xce,0x7d,0x1e,0x3f,0x49,0xb8,0x9c,0xaa,0xd9,0xad,0xe3,0x34,0x1a,0xdc,0x4c,0x8a,0x63,0xd3,0xed,0x06,0x1a,0x68,0xe7,0x51,0xc4,0xa9,0x7b }, { 0xaa,0x85,0x14,0x5e,0xab,0x0e,0x07,0xc4,0x39,0x65,0x84,0xaf,0xe3,0x41,0x40,0x5a,0x61,0x26,0x75,0x6a,0xfc,0x9f,0x28,0x2b,0xf7,0x12,0x46,0x1b,0xaf,0xf9,0xa7,0x7b }, { 0x6d,0x17,0x40,0x89,0x91,0xec,0xe7,0x17,0x3f,0xb9,0x9c,0xe7,0x13,0x10,0xbc,0x9b,0x8f,0x73,0xdf,0x0a,0x0e,0x35,0x38,0x92,0x26,0x84,0x8e,0x4f,0xf3,0x89,0xca,0x6d }, { 0x4b,0x3f,0x92,0x21,0x29,0x74,0xb4,0x2c,0xf7,0xc2,0x25,0xdf,0x2f,0x06,0x5d,0xfa,0xae,0xcc,0x2b,0xdc,0x82,0x7e,0x32,0x10,0x11,0x87,0xde,0xaa,0xf1,0xef,0x24,0x6f }, { 0x81,0x14,0xb5,0x79,0x9f,0x3c,0xb2,0x30,0xb8,0xd2,0x8b,0x5d,0x7a,0x31,0xae,0xd5,0xb3,0x3a,0xf1,0xd0,0x1c,0x56,0x0f,0x7d,0xbc,0x7c,0x80,0xae,0x4d,0x1d,0x4f,0x3b }, { 0x9b,0x76,0x43,0xff,0xbd,0x62,0x3e,0xa1,0xd1,0x2a,0xc5,0x47,0xf9,0xe7,0xbe,0x01,0xeb,0xac,0x81,0x74,0xfc,0x9f,0x25,0x02,0x8d,0x37,0x92,0xd8,0x62,0xb3,0x3f,0x65 }, { 0xe4,0x6e,0x66,0xbb,0x7b,0x3c,0x72,0x3d,0xf3,0x30,0x35,0x70,0xe0,0xa7,0xf2,0x46,0x6a,0x77,0x02,0x1d,0x84,0x34,0xf5,0x22,0x21,0x6b,0x98,0xf5,0x34,0x88,0x11,0x0e }, { 0x0f,0xab,0xf6,0x0e,0x13,0xdd,0x78,0x25,0x0f,0xbe,0x70,0xc6,0xc8,0x90,0x04,0xbe,0x56,0xce,0x50,0xf7,0x0f,0x4a,0x05,0x45,0x64,0xa5,0x02,0x6b,0xb1,0xdf,0x9b,0x33 }, { 0xc0,0x63,0x8b,0xd5,0xd2,0x60,0x42,0xaf,0xbf,0xc5,0x87,0x89,0x61,0x63,0xcd,0xd2,0x23,0x02,0x52,0x9b,0x87,0xb8,0xd4,0xa8,0x49,0x58,0xc2,0x53,0x26,0x73,0x63,0x62 }, { 0x3e,0xfd,0x16,0x1e,0xb6,0xb2,0x91,0x95,0x04,0x5a,0xe3,0x32,0xdd,0xac,0x20,0xd8,0x3c,0xa8,0x5c,0xca,0x3b,0xbc,0x4b,0x6b,0x9b,0x80,0xa5,0x28,0x6c,0x7c,0x63,0x7e }, { 0x6e,0x6f,0x2d,0xba,0x61,0x68,0xfa,0xe4,0x1d,0xcf,0x69,0x3d,0x90,0x3c,0xe0,0x03,0xe2,0xdc,0x19,0xd8,0xc5,0xb1,0xa6,0x0e,0x9c,0x53,0x2f,0xb5,0xa0,0x89,0x87,0x0a }, { 0xc6,0xea,0xcf,0xd6,0xa5,0x0d,0x90,0xca,0x6b,0x54,0xd2,0x16,0x01,0x97,0xca,0xdd,0xcd,0xf2,0xfc,0xed,0x2f,0x3f,0x1f,0x8c,0xd0,0xed,0xc2,0x07,0x0f,0x9e,0x51,0x39 }, { 0x62,0xed,0x46,0x08,0x21,0x33,0x9b,0xd9,0xf2,0x17,0x12,0x7a,0x85,0xb7,0x78,0x2e,0x8b,0x30,0xab,0xa5,0x68,0x33,0xbb,0x16,0x1e,0x9d,0xc1,0x0e,0x1e,0x06,0x85,0x18 }, { 0x9a,0xba,0x36,0xeb,0xe4,0xc7,0x81,0x26,0x5d,0x19,0x2e,0x16,0x65,0x56,0x87,0xfb,0xcc,0xa0,0x3b,0x1d,0xa2,0x25,0xb2,0x02,0x43,0x49,0x1f,0x7a,0xb6,0x87,0x1e,0x72 }, { 0x73,0xb2,0xae,0x02,0x28,0x78,0xef,0x68,0x8f,0xe6,0x68,0xb7,0x3e,0x8b,0x38,0x48,0x6d,0xbb,0x3e,0x7f,0xeb,0x56,0xf1,0xd7,0x1c,0x7f,0x7d,0x75,0xca,0xb1,0xc9,0x78 }, { 0x34,0x5e,0xef,0xc1,0x61,0x0e,0xbf,0x99,0x4f,0xfe,0x69,0xa5,0xe4,0x3a,0x41,0xc9,0x8e,0xc9,0x2b,0x80,0x84,0x10,0x2b,0x95,0x91,0xdb,0x24,0xd1,0xd2,0x34,0xa6,0x62 }, { 0x9c,0x57,0xeb,0xb2,0xe8,0x58,0xc1,0xda,0x0b,0xf8,0xe7,0x96,0x6c,0xd5,0xd2,0x49,0x4e,0xe4,0x7d,0x06,0x9d,0x42,0x79,0x12,0x42,0xe8,0x2a,0xa5,0xcf,0x95,0xb8,0x5f }, { 0x58,0x7d,0x13,0x06,0x3a,0xd4,0xd1,0x59,0x21,0x6c,0x10,0x35,0x0b,0x76,0x02,0x8e,0x99,0xdb,0xc5,0x53,0xa3,0xeb,0x1a,0xa8,0x4e,0x49,0x54,0xa6,0x65,0x8b,0xfc,0x43 }, { 0x9a,0x52,0xd8,0x40,0x02,0xc9,0x39,0x21,0x5b,0xe1,0xbd,0x24,0x3c,0x4a,0xb0,0x95,0x14,0x6a,0x9b,0xa1,0x7e,0xa1,0x82,0x3c,0x99,0x36,0x2b,0xf6,0x62,0x9a,0x86,0x51 }, { 0xc5,0x6a,0x76,0x7f,0xe4,0x7e,0x54,0x38,0xda,0x8e,0x8b,0x18,0x62,0x32,0x00,0x5e,0xa9,0xbe,0x73,0x87,0x9e,0xac,0x6b,0xf0,0xea,0xc5,0xb0,0x7b,0x43,0x7d,0xee,0x75 }, { 0x1c,0x54,0x53,0x53,0x2a,0x17,0x21,0x5c,0xdd,0xb4,0x06,0x20,0x8b,0x70,0x5f,0x15,0x6a,0xf4,0x31,0xd2,0xfd,0x38,0x1b,0xbe,0x1f,0xe7,0x0f,0x60,0x8e,0x63,0x3e,0x5d }, { 0xe2,0x6a,0x8c,0x39,0x47,0xf8,0xa5,0xa1,0xb8,0x60,0x27,0xfa,0x1a,0xa5,0x9d,0xc5,0xf6,0xb1,0x14,0x40,0xc9,0xe4,0x11,0x6f,0x4f,0xc4,0x88,0xb3,0x68,0xd8,0x83,0x41 }, { 0x28,0x1b,0xb0,0x84,0xbc,0xab,0x7d,0x14,0x6d,0xe0,0xc3,0x9c,0x14,0xec,0x63,0x0a,0x43,0x2a,0x39,0x61,0x3e,0x4f,0xf9,0xd8,0xc3,0x06,0x2b,0xa1,0x67,0x2b,0xdb,0x30 }, { 0xbc,0x7c,0x5f,0xd4,0xee,0x39,0xd1,0xe9,0xe7,0x52,0xc6,0x6b,0x2e,0xfb,0x91,0x37,0x84,0x9b,0x88,0xd5,0xd7,0xc7,0xa3,0xbf,0x37,0xb3,0x32,0xb1,0x31,0xbf,0x56,0x1c }, { 0xda,0x27,0xf1,0x4a,0x43,0x51,0xa8,0x60,0x6e,0xae,0xac,0x0d,0x63,0x9a,0x74,0x4e,0xb9,0x38,0x6c,0x76,0x10,0x51,0xef,0x11,0x57,0xd6,0xd6,0x1f,0xb5,0x6d,0x83,0x73 }, { 0xc0,0xb3,0x5b,0x3d,0x31,0x8f,0x85,0x01,0x67,0x85,0xf6,0xe7,0x5a,0xfb,0xbb,0xb9,0x0d,0x61,0x6b,0xe8,0x37,0x81,0x7e,0x66,0x8f,0x3a,0xcd,0xff,0x6c,0xf7,0x0d,0x16 }, { 0xb7,0x7a,0x77,0xf8,0x85,0x2e,0x0a,0x82,0x52,0xc8,0x0d,0xb5,0x22,0x82,0xc2,0x0f,0x0f,0x44,0x1f,0xf1,0x98,0x76,0x30,0xc1,0xa5,0xe3,0x31,0xec,0xa6,0x01,0x08,0x54 }, { 0x8c,0x0e,0xe2,0x63,0x08,0x13,0xca,0x0f,0xa1,0x56,0x03,0xa3,0x76,0x0f,0xca,0x79,0xc0,0xe0,0x8c,0xa5,0x0f,0xb7,0x5a,0x43,0x48,0x3b,0xdb,0xe3,0x8f,0xcb,0x07,0x5f }, { 0xcb,0x66,0x6f,0xd3,0x0c,0x3b,0x93,0x57,0x65,0x3e,0x03,0x33,0xc1,0x3b,0xc7,0x2b,0xca,0x9b,0xc8,0xf9,0xea,0x0e,0x97,0x81,0xe6,0x12,0x0f,0xfb,0x00,0x4f,0x2a,0x17 }, { 0x91,0x3d,0xff,0x4b,0x24,0x28,0xc9,0x3c,0x2a,0x3e,0x3c,0x23,0xd3,0x6b,0x3c,0x71,0x50,0x58,0x06,0x8b,0x4a,0xa8,0xbd,0x27,0xe9,0x77,0x8d,0x06,0x27,0x8b,0xda,0x3f }, { 0x48,0x44,0xb7,0x36,0x90,0xf5,0x4f,0xa7,0x78,0xba,0x7a,0xb7,0x94,0xac,0x8d,0x97,0x5f,0xd4,0xf8,0x34,0x4a,0xa6,0x3c,0xff,0x13,0xa9,0x9c,0x8b,0xb8,0xf4,0x01,0x1f }, { 0xf5,0xc6,0x76,0xdb,0xdb,0x88,0x5a,0x94,0x13,0x8a,0x1a,0x5f,0x6d,0x46,0x29,0xee,0xc5,0xa0,0xc3,0xbd,0xfd,0xde,0x08,0x80,0xc9,0xc9,0x99,0x2f,0x5f,0x4e,0x34,0x44 }, { 0x27,0x75,0x16,0xb2,0xe2,0x10,0x00,0x48,0x03,0x7b,0x22,0x96,0xfb,0x2d,0x93,0x6e,0x72,0x7f,0xba,0x9d,0xf8,0x99,0xdc,0x98,0xe7,0xb4,0x99,0x9a,0x5c,0xa6,0x8f,0x43 }, { 0x1e,0xad,0x26,0xd6,0x05,0xdd,0xb9,0xb0,0x26,0x72,0x23,0x82,0x0a,0x39,0xe3,0xe1,0x8e,0xaa,0x47,0xdb,0xa3,0xff,0x86,0xc2,0xaf,0xdc,0xce,0x80,0x8d,0xab,0x80,0x49 }, { 0x59,0xb8,0x2c,0xd6,0x51,0x72,0x7b,0x35,0x57,0x54,0x20,0x29,0x2a,0x61,0xb5,0x85,0x6b,0xd7,0x02,0xfc,0x83,0xeb,0x10,0xbf,0x5d,0xb6,0x5e,0x5e,0x85,0x89,0x00,0x78 }, { 0xa0,0x9e,0x63,0x79,0x2e,0xa5,0x54,0x5a,0x36,0x30,0x11,0x04,0xf9,0xc9,0x82,0x0d,0x2e,0x1c,0x6c,0x0a,0x58,0x0f,0xbc,0x0d,0x46,0x61,0xa9,0x10,0x5f,0x81,0xcc,0x0a }, { 0x63,0x92,0x77,0xb6,0x6a,0xdd,0xf0,0x4e,0xc4,0x11,0xd4,0x4f,0x92,0x11,0x98,0x0b,0xeb,0x32,0x7a,0xf2,0xc6,0x79,0x38,0xe0,0x26,0x90,0x0b,0x6d,0xf7,0x3d,0x41,0x24 }, { 0xf0,0x3b,0xfd,0x64,0x94,0x29,0x9b,0x43,0x8e,0x0d,0x9f,0x52,0xfc,0x6f,0xf1,0x87,0x26,0xdd,0x4b,0x14,0xd9,0x68,0xad,0x94,0x4b,0x5e,0x59,0x35,0x91,0xa3,0x53,0x05 }, { 0x1b,0x41,0x5f,0xaf,0x1d,0xbb,0xda,0x5d,0x5d,0x93,0xd5,0x52,0xe6,0x60,0x1f,0xfe,0xe3,0x53,0xed,0x76,0x90,0x41,0x72,0xd1,0xda,0xcb,0xd2,0xc4,0xc1,0xad,0xfa,0x19 }, { 0x09,0x2a,0x46,0xc0,0x45,0x57,0x5e,0xe1,0xf6,0xc8,0x64,0xae,0xdc,0x3d,0x63,0xfc,0x71,0x06,0xf8,0x46,0xa9,0x13,0xb4,0x4e,0x94,0x54,0x0a,0x73,0xa8,0x64,0x33,0x4c }, { 0x8e,0xc3,0x40,0xc1,0x46,0x9f,0x0d,0x3c,0xb3,0x94,0xce,0xc0,0x19,0x2a,0x15,0x98,0x42,0x25,0xf4,0x87,0x00,0x44,0x09,0x52,0x22,0x4f,0xb1,0x8c,0x4a,0x83,0xbf,0x72 }, { 0xa1,0x67,0x46,0x58,0x61,0xb1,0xee,0x6e,0x42,0x59,0x52,0xd5,0xbf,0xbb,0xb0,0xd4,0x8c,0xe9,0x64,0xfb,0x13,0xf2,0xbb,0x63,0x74,0xf2,0xd1,0xcf,0x70,0xf6,0x22,0x54 }, { 0x63,0xcc,0x30,0x3e,0xea,0x0c,0x6b,0x7b,0xd8,0xc4,0x68,0x6b,0x03,0x92,0xe9,0x37,0xff,0x8c,0xb6,0x99,0x7e,0xa8,0x7d,0xe5,0xd6,0xbd,0xb3,0x9a,0xce,0x17,0x70,0x2c }, { 0x1a,0xbe,0xfc,0x15,0x6b,0x0c,0x95,0x30,0xe7,0x22,0xdc,0x84,0x91,0xd7,0xcb,0xbe,0x97,0x2f,0x85,0x8d,0x1a,0x72,0x69,0xd3,0xcc,0x78,0xc1,0x7b,0x14,0xe3,0x84,0x27 }, { 0x32,0xc6,0xc4,0xe0,0xd3,0x24,0xe2,0x5e,0xed,0x4f,0xe0,0x8f,0xd9,0xe0,0x01,0xb8,0x75,0x53,0x9a,0xb5,0xd7,0x03,0x25,0x7b,0x06,0xdd,0x58,0xcd,0x0e,0x1f,0x45,0x49 }, { 0xa0,0x44,0xa0,0x03,0x9b,0xd8,0x04,0x03,0x69,0x5f,0xf4,0x6d,0xc5,0xc5,0x00,0x15,0xf1,0x35,0xa8,0xc3,0xd0,0x5d,0x71,0x6e,0xa6,0xb6,0x43,0x2a,0x68,0xf0,0x04,0x43 }, { 0xe8,0x0b,0x7e,0xc9,0xa1,0xc2,0x0b,0x24,0x38,0x94,0x92,0x39,0xf5,0x22,0xcb,0x2b,0xae,0x5e,0x66,0x65,0xd5,0x27,0x40,0xa0,0xdf,0x10,0xae,0xd1,0x70,0x70,0x79,0x48 }, { 0x8b,0x0e,0xaf,0x61,0x87,0x93,0xfd,0xf5,0x50,0xf9,0x63,0xae,0x7e,0x88,0x73,0x73,0x29,0x87,0x1e,0x27,0xfa,0x13,0xc0,0x6e,0x0b,0xbd,0x3c,0xb7,0xdf,0x54,0x1e,0x4d }, { 0x9b,0x8b,0x00,0x94,0xac,0x6f,0x8e,0x91,0x9a,0x2f,0x33,0x38,0x2f,0x4d,0xb4,0x6c,0x88,0xe0,0xd3,0x43,0xd1,0xed,0x66,0xe1,0x33,0x96,0x1d,0xa7,0xaa,0x3f,0xfa,0x73 }, { 0xef,0xe0,0x90,0xfe,0xe4,0x48,0xef,0xf1,0x4d,0x48,0x2f,0x9d,0xbc,0xfc,0x8b,0x53,0xff,0xfa,0xe7,0xb0,0x31,0x7c,0x30,0x5a,0x05,0x4e,0xe1,0xdd,0x7d,0x08,0xed,0x56 }, { 0x94,0x74,0x24,0xd6,0xe6,0x67,0xb3,0xc7,0x9e,0x71,0xa7,0x8e,0xeb,0x35,0x67,0x66,0xdc,0x94,0x13,0x07,0x16,0x4a,0x79,0xe1,0x58,0x27,0x35,0xbd,0xb5,0x7b,0xda,0x6d }, { 0xc3,0x16,0x22,0xe6,0x2e,0x67,0x2a,0x51,0x12,0x24,0x0b,0x12,0xa8,0xb6,0xcc,0x6e,0x47,0x82,0x87,0x84,0x83,0x51,0x03,0x53,0x02,0x93,0xd8,0xe7,0xf6,0xe0,0x44,0x25 }, { 0xd4,0x1a,0xe2,0x5e,0x04,0x45,0x1e,0x66,0xf8,0xc7,0x50,0x4e,0x77,0x32,0x1c,0xd4,0x51,0xa2,0x41,0xdb,0x0d,0xeb,0xfb,0xd9,0xa5,0x4a,0xa5,0x33,0xba,0x9e,0xe4,0x42 }, { 0x70,0x34,0x5d,0xd1,0xa1,0xc8,0x82,0xab,0x8c,0x32,0xfd,0xf5,0x9d,0xe5,0xf2,0x64,0x23,0x13,0x45,0xbf,0x38,0x34,0x6e,0x18,0x6d,0xc0,0x7b,0xd2,0x63,0x5f,0x54,0x29 }, { 0x0b,0xa6,0x32,0xf6,0x67,0xb5,0x0c,0x18,0xfb,0x3f,0x65,0x73,0xd7,0x46,0x82,0x6c,0x48,0x59,0xf8,0x93,0x01,0xbf,0xaa,0x24,0xce,0xfe,0xec,0x83,0x16,0xe6,0xab,0x29 }, { 0x99,0x56,0xf4,0xbc,0xa6,0x6b,0xe9,0x2e,0x9a,0x1c,0xf5,0x94,0x43,0x25,0xf8,0xb8,0xe0,0xce,0x08,0xec,0x66,0x72,0xfe,0xf2,0xd3,0x9d,0x35,0xd3,0x14,0xd3,0x58,0x76 }, { 0xb0,0x40,0x71,0x14,0x25,0x0f,0xd7,0x6f,0xbf,0x98,0x24,0xf7,0xec,0xbf,0xd9,0xad,0x0a,0xa9,0x87,0xb4,0xf0,0x9d,0x15,0xbb,0xf7,0x43,0x7b,0xe7,0x0f,0x1f,0xbc,0x4e }, { 0x16,0x69,0x29,0xce,0xdf,0x6d,0x8a,0x07,0x7f,0x22,0x54,0x0f,0xa5,0xa2,0x6c,0xdc,0x62,0xac,0xe4,0x3b,0x9b,0x11,0x4d,0x99,0xb6,0x9c,0x1c,0x8d,0x44,0xf4,0x5c,0x1a }, { 0xe2,0x89,0xea,0x78,0xa5,0x83,0x74,0xf5,0x1c,0x55,0x5d,0xb3,0x7e,0xe0,0x7a,0xe5,0x65,0xd6,0xf6,0x70,0xea,0x50,0x52,0xfd,0xea,0xac,0xdd,0x41,0xb8,0xbb,0x6d,0x1e }, { 0x96,0x61,0x80,0xac,0xbb,0x42,0xf5,0xcb,0x61,0x7f,0xfb,0x57,0x44,0x06,0xdd,0x8c,0xe0,0x73,0xc7,0x69,0xa3,0xba,0x21,0x40,0xf0,0x91,0x64,0x39,0xc6,0xfc,0x32,0x31 }, { 0x58,0x28,0xf5,0x95,0x73,0xba,0x6b,0x9e,0x30,0xe6,0x92,0x97,0xac,0xea,0x42,0xe1,0x2f,0xd7,0x65,0xbf,0x25,0x74,0x52,0xf5,0xc0,0x41,0x82,0x57,0x37,0x94,0x2e,0x3e }, { 0x7a,0xda,0x2b,0xa3,0xaf,0x7d,0x5e,0x17,0xb7,0xb0,0x3c,0xe0,0xbb,0xd1,0x4d,0xe3,0x1c,0xc0,0x16,0x2e,0xa4,0x24,0xd3,0xc2,0xc3,0x5f,0x33,0x59,0xca,0x7f,0x7e,0x50 }, { 0xb1,0xda,0xec,0x98,0x4b,0x4c,0x0e,0x13,0x88,0x47,0x11,0xc5,0x81,0x62,0xe9,0x94,0x19,0x0d,0x43,0x10,0x4c,0x44,0x43,0xc2,0x73,0xe8,0x21,0x8f,0xeb,0xe4,0x5f,0x1d }, { 0x41,0x45,0x68,0x8e,0xac,0x43,0x1b,0xa8,0x2b,0x01,0x4c,0xaa,0x99,0x2f,0xbd,0x70,0xab,0x0b,0xd2,0x2a,0xb8,0x85,0xf4,0x53,0xc0,0x23,0xf9,0xc3,0xe8,0xac,0x5f,0x02 }, { 0xd0,0xab,0x94,0xa6,0x3c,0xf0,0xf3,0x72,0x11,0xc4,0x7f,0x36,0x08,0x4f,0xde,0xe3,0x64,0xd4,0x72,0x16,0x2c,0x1e,0xc5,0x0c,0xa7,0x99,0xdd,0x95,0xef,0xe5,0x2f,0x1c }, { 0xbf,0xe1,0x45,0x68,0x7c,0xb3,0x4d,0x21,0x70,0x3a,0x44,0xbb,0xd8,0x84,0xe2,0x3d,0x63,0xb8,0xf9,0x02,0x86,0xb2,0x42,0xaf,0x15,0xeb,0x05,0x57,0xa6,0xe6,0x13,0x54 }, { 0x77,0x17,0xf4,0x53,0x41,0x49,0x35,0x74,0x7a,0x5d,0x73,0xc9,0xc5,0xb6,0x9f,0xb6,0xd8,0xb4,0xd6,0xd4,0x33,0xa6,0xb1,0x4c,0xf7,0x93,0x21,0xcb,0x89,0x58,0x4d,0x06 }, { 0x46,0xb6,0x93,0xf4,0x10,0x97,0x83,0xf5,0xd7,0x59,0x5a,0x90,0x53,0x9c,0x87,0x0a,0x2e,0xe5,0xb2,0x2c,0x5c,0xe7,0x79,0xf8,0x29,0xa0,0x72,0x51,0xe0,0xe9,0x2f,0x6d }, { 0x65,0xbe,0xa7,0x9b,0x20,0x02,0xbc,0xf1,0x4c,0x24,0x6f,0x30,0x68,0x4f,0xf3,0x96,0x3b,0x51,0x54,0x82,0x3c,0xe5,0x77,0x9f,0xe1,0xd0,0xd8,0x13,0x96,0xd7,0x92,0x5c }, { 0xe2,0x82,0xfe,0xdb,0x5d,0x53,0x3a,0x08,0x34,0x71,0xf6,0xa5,0x46,0x87,0x8f,0x6c,0x88,0xa5,0xdf,0x83,0x88,0x56,0xbe,0x50,0x75,0x0b,0xc2,0x28,0x41,0x65,0x49,0x39 }, { 0x6c,0x23,0x19,0xea,0x2c,0xde,0xc5,0x8c,0xee,0x96,0xce,0x5f,0xdd,0x2e,0x48,0xe4,0x56,0x8c,0x05,0x24,0x5c,0x68,0x42,0xc9,0x26,0xae,0x97,0xaf,0x0d,0x98,0xee,0x45 }, { 0x5a,0x57,0xeb,0x5a,0x64,0x81,0x7f,0xa5,0x54,0x78,0x94,0xd9,0xdc,0x6d,0x54,0x24,0x1a,0x89,0x93,0x42,0x86,0x52,0x04,0xe5,0x0f,0x87,0xa5,0xa6,0xf1,0x20,0x36,0x72 }, { 0x39,0x5a,0x32,0x4d,0x1e,0x57,0xe6,0x3f,0x9a,0xa9,0x9e,0x4f,0x2d,0x0b,0xd8,0xd2,0xd2,0xc9,0x48,0xb3,0xaf,0x46,0x00,0xa0,0xfd,0x16,0x76,0x3d,0xe3,0x4b,0x18,0x35 }, { 0x54,0x9a,0x41,0x66,0x4e,0x15,0x5e,0x82,0x4d,0x55,0xd5,0xf2,0x06,0xe1,0x5c,0x42,0x0f,0x3f,0xca,0x6e,0x1e,0x10,0x74,0xb9,0xc5,0xdf,0x3f,0xd4,0xa4,0xea,0x82,0x63 }, { 0xba,0x41,0x12,0xac,0xc6,0xbc,0x0d,0xa1,0xbf,0x6e,0x46,0x35,0xce,0xa3,0xc8,0x27,0xd5,0xc3,0xca,0x23,0xb4,0x7a,0x6e,0xa0,0xf5,0x12,0x85,0xba,0x68,0x21,0xd1,0x41 }, { 0x11,0x05,0x66,0xed,0x9e,0x34,0x2a,0x8f,0xcf,0x7a,0xfa,0xf9,0x1a,0xb1,0x53,0xda,0xa9,0x1f,0x6b,0x57,0x41,0x8d,0xd6,0xc7,0xfb,0x43,0x77,0x78,0x72,0x12,0x40,0x6e }, { 0x88,0x04,0xda,0xef,0xc3,0x2f,0xa9,0x6f,0xc5,0x1a,0x96,0xfe,0x79,0xe0,0xff,0xe8,0xc3,0xe3,0x2a,0xca,0xfe,0xc1,0x08,0x3a,0x84,0xdc,0xe2,0x5b,0xc9,0xe9,0xbd,0x13 }, { 0x22,0x10,0x47,0xe5,0x29,0x9a,0xe5,0xfb,0x78,0x8f,0xf8,0x62,0xb4,0xa5,0xcc,0x17,0xf8,0x79,0x3f,0x97,0xb1,0x10,0x99,0xb3,0x36,0x8f,0x77,0xe8,0x6c,0x96,0x19,0x72 }, { 0x0a,0xc2,0xe7,0xd2,0x55,0xe2,0x2e,0x63,0xe6,0xca,0xbf,0x71,0xfb,0x69,0x07,0xce,0xe5,0xe7,0xb3,0xe3,0xe1,0xb7,0x53,0x56,0xc5,0xa2,0x8c,0xbe,0x94,0x1f,0x9c,0x76 }, { 0x80,0x05,0x7b,0x53,0xce,0x7d,0xa3,0x10,0x77,0x23,0x71,0xd2,0x33,0xdf,0x39,0x78,0x88,0x87,0x42,0x5c,0xd1,0x5b,0x20,0x08,0x0e,0xa0,0xa7,0x4b,0x90,0x07,0x0e,0x2b }, { 0x33,0x79,0x18,0xcc,0x0d,0xcb,0x4f,0xd1,0x05,0x91,0x90,0xad,0x21,0xe8,0x74,0xbd,0x13,0x7f,0xb1,0x85,0x28,0xab,0xea,0x2e,0x24,0x32,0x3b,0x14,0xf5,0x2b,0x3d,0x08 }, { 0x7d,0x31,0xcd,0xd2,0xf1,0x14,0xcb,0x4a,0x7b,0x1d,0x93,0x1c,0x10,0xa9,0xef,0xb4,0x6c,0x18,0x00,0x45,0x04,0xbd,0x4c,0x13,0xde,0xa2,0xb3,0x84,0x8e,0xe6,0x86,0x34 }, { 0x04,0xbe,0xe7,0x7d,0x02,0xdc,0xc1,0x0c,0x41,0xc9,0x93,0x6c,0x18,0x71,0x79,0x7d,0x48,0x4f,0xee,0xe8,0x54,0xbf,0x88,0x74,0x47,0x58,0x98,0x95,0xbc,0x08,0x19,0x12 }, { 0xb3,0x66,0x4f,0xa5,0xe1,0x25,0xfd,0x47,0xd2,0xc9,0xf7,0x6a,0x20,0x93,0x49,0x22,0xba,0x85,0x12,0x4a,0xcc,0xcb,0x36,0xcb,0x30,0x30,0x07,0x83,0x0b,0x47,0x89,0x1b }, { 0x7a,0x2e,0x26,0xd3,0x1c,0x5c,0x08,0xd7,0x46,0x34,0x54,0xa7,0x51,0xd3,0x53,0xbf,0xa8,0x2c,0xa9,0x1e,0x92,0x1f,0xd0,0xc2,0x13,0xe1,0x1b,0x74,0x5e,0xf0,0x1b,0x44 }, { 0xce,0xe6,0x82,0xa5,0x9f,0x98,0x8d,0x6e,0xc5,0xb2,0x32,0xbe,0xa2,0xbd,0x8f,0x6d,0x4d,0x1e,0x71,0x59,0x01,0x3f,0xc8,0x76,0x36,0xcf,0x77,0x0a,0x9f,0xdb,0xb1,0x65 }, { 0x1d,0x39,0x81,0x29,0x6e,0xd6,0xe2,0xdb,0x29,0x1a,0x21,0x34,0xc5,0x9f,0xaa,0xd8,0xde,0x33,0x62,0xec,0x00,0xbe,0xf5,0x8f,0x89,0x9d,0xd9,0xf3,0x00,0x57,0xb5,0x60 }, { 0x96,0x02,0x12,0xff,0x43,0x17,0xda,0x3a,0x0b,0x81,0xa3,0xc0,0x8c,0x4a,0x55,0xb8,0x15,0xcb,0xfe,0x90,0x10,0x02,0x3d,0xfc,0x8d,0x47,0x02,0xbb,0xf8,0x17,0x75,0x72 }, { 0x94,0x65,0x14,0xda,0x30,0x50,0xb8,0x6c,0x6f,0xa4,0xcd,0xfc,0x2c,0xd5,0x3d,0xdd,0x59,0x4a,0x3f,0xd8,0xf6,0x0d,0x8d,0xf6,0x54,0x56,0x58,0xc6,0x42,0x53,0xbd,0x44 }, { 0x86,0x5c,0x86,0x83,0x9a,0xd4,0x1d,0xe4,0xa8,0x5d,0x6c,0x38,0xef,0xee,0xe4,0x40,0x94,0xcf,0x21,0x43,0x93,0x54,0x3f,0xb8,0xf8,0x3f,0x4d,0x26,0xf0,0x48,0xd1,0x25 }, { 0x10,0x9d,0xa2,0x2e,0xa2,0x67,0x16,0x7a,0xc7,0x23,0x64,0x50,0x1b,0x2d,0xef,0x7d,0x51,0xfc,0xd7,0x2a,0x34,0x7b,0x65,0x7e,0xae,0x66,0x01,0xb3,0xf4,0xb6,0x78,0x2f }, { 0x03,0x1a,0xbf,0x47,0xa2,0x50,0x33,0x86,0xe3,0xc4,0x06,0x9d,0xff,0x57,0x1a,0x5e,0x0d,0xe0,0xb7,0x73,0xdb,0x53,0x7e,0xc8,0x20,0xaf,0x74,0xbf,0x5d,0x90,0xca,0x5b }, { 0xd7,0x31,0xa8,0xfe,0x20,0x47,0x14,0xae,0x4f,0xbf,0x0d,0x77,0xae,0x97,0x32,0x5d,0xb5,0xc5,0x2c,0x87,0xa9,0xa6,0x4c,0x81,0x78,0xeb,0xb4,0x1f,0x40,0x96,0xeb,0x53 }, { 0x41,0x3e,0xf1,0x7c,0xa4,0xc9,0xb2,0x6e,0xaa,0xd8,0x58,0x84,0x06,0x4c,0xdb,0xcc,0x1a,0xdc,0xf2,0x07,0xbf,0xcd,0xc5,0xba,0x3c,0x58,0x67,0xd4,0xd8,0xbd,0x18,0x7e }, { 0x3f,0x0e,0x67,0x27,0x9f,0x5e,0xc5,0xd1,0x10,0x23,0xc9,0x97,0x5c,0xe7,0x41,0x98,0xcc,0xef,0x8a,0x84,0xf7,0x3f,0x44,0x24,0x6c,0x6a,0x31,0x74,0xb6,0x18,0x73,0x24 }, { 0x4c,0xfc,0x47,0x83,0x4f,0x90,0x31,0xf8,0x75,0x44,0x58,0x6d,0x79,0xb5,0x25,0xc4,0xd8,0x64,0xeb,0xf8,0x31,0xe8,0x08,0x25,0x1a,0x9f,0xaf,0xc1,0x39,0xc0,0x07,0x63 }, { 0xc6,0xc9,0x48,0xbd,0xd4,0x2b,0xee,0xec,0xb1,0x0c,0xbe,0xdc,0x69,0x4e,0x04,0xb4,0xd7,0xca,0x24,0x6e,0x8a,0x66,0x30,0x2f,0x1e,0x4c,0x94,0x8c,0xdb,0x77,0xa0,0x0c }, { 0xf5,0x99,0x3e,0x8d,0x54,0x54,0x4d,0x8a,0xae,0xf3,0x8e,0x72,0xdd,0xda,0xa3,0xc1,0x49,0x3e,0x47,0xd6,0x5e,0xef,0xc3,0x16,0x70,0xa3,0x18,0x86,0x57,0x86,0x3a,0x32 }, { 0xd6,0x62,0x45,0x9b,0x91,0x17,0x54,0xe9,0x6b,0xc3,0x06,0x8d,0xa0,0xba,0x1a,0xc8,0x78,0x4c,0xd1,0xce,0x49,0xa9,0x19,0x51,0xb0,0xcd,0x19,0x07,0x2b,0x03,0x97,0x51 }, { 0x69,0xdb,0x0d,0xb4,0x80,0x20,0xd2,0xfc,0x91,0x48,0x3e,0xea,0xa0,0x28,0xa9,0x45,0xec,0x0d,0xef,0x61,0x78,0x5a,0xaa,0xea,0x43,0xd6,0xe1,0x0a,0x86,0x59,0x3f,0x1a }, { 0x69,0xfa,0x46,0x1e,0xc4,0x92,0x82,0xf2,0x47,0x32,0x71,0xc9,0xbf,0x51,0xee,0x89,0xb5,0x46,0xb6,0x41,0x32,0x76,0x40,0xcc,0x98,0xd3,0x2e,0xec,0x06,0x36,0x5b,0x10 }, { 0xe0,0xd9,0x28,0xc9,0xf8,0x32,0x93,0xcf,0xc9,0x0b,0xc0,0x9c,0x77,0xea,0xb6,0x79,0xe5,0x5d,0x38,0x06,0x4c,0x32,0x31,0xee,0x9b,0xec,0x2a,0x31,0xf4,0x59,0xa4,0x13 }, { 0x7c,0xf8,0xf8,0xd4,0x2a,0x9c,0x23,0x9f,0xaf,0xfb,0xb2,0x94,0x2d,0xaf,0xb0,0xf2,0x79,0xf5,0x2c,0xb5,0x5c,0xad,0xce,0xaf,0xef,0xe5,0x5c,0x63,0xe1,0x5f,0x68,0x50 }, { 0xf3,0x9d,0xd0,0xb9,0x27,0xaa,0x2c,0x77,0x07,0xc8,0x29,0xa5,0x8c,0x7c,0xbe,0x70,0x6d,0xad,0xf6,0xf2,0xea,0xab,0x22,0x38,0x56,0x92,0xaa,0x89,0x58,0xd2,0x83,0x21 }, { 0x94,0xf6,0xce,0x64,0xe0,0x68,0x59,0x81,0xff,0xa9,0xa3,0xd0,0x16,0x62,0xe6,0xfa,0x5a,0x5f,0x8c,0x5a,0x1e,0xf0,0xf1,0x58,0x3e,0xb6,0x95,0x2f,0x3f,0x8a,0xb1,0x58 }, { 0x0d,0xf6,0xdf,0xe6,0x22,0xe4,0x39,0x17,0x49,0xbf,0xa7,0x83,0xf6,0x78,0xdd,0x31,0xd1,0xff,0xb5,0x8f,0xb7,0xe4,0xe8,0xe3,0xcc,0x32,0x3a,0x80,0xa9,0x9e,0x8f,0x78 }, { 0xe8,0x51,0xc7,0xfe,0x0c,0xad,0xe4,0x65,0x34,0x2e,0x2b,0x88,0xbf,0xaa,0x30,0x18,0x5e,0x56,0x1f,0xf3,0x48,0x71,0x21,0xa7,0x4d,0x55,0x4b,0x0b,0x05,0xc2,0x94,0x2a }, { 0x10,0x2d,0xa9,0xaf,0xad,0x92,0xec,0x34,0x6d,0x45,0x03,0xb7,0xca,0xa3,0xc2,0xa1,0x98,0xe2,0x89,0xb9,0x13,0x2a,0xbe,0x3a,0x46,0xf2,0xdc,0xed,0x06,0xdf,0xa5,0x36 }, { 0x49,0xc0,0x0a,0x84,0x13,0x70,0xd2,0xfe,0xa1,0x38,0xc4,0x0b,0x72,0x9a,0xac,0xfb,0x6c,0xb8,0x4a,0x00,0x1e,0xb4,0x90,0x3f,0xba,0x41,0x1c,0xd5,0x5d,0xcb,0x1e,0x1c }, { 0x7f,0xaa,0xac,0x89,0x5f,0x71,0xbc,0xa1,0x46,0xe4,0xff,0x63,0x59,0x94,0x59,0x40,0xe5,0x4e,0x69,0x08,0x53,0x07,0xf9,0x9c,0xf5,0xe4,0x8e,0x59,0x1c,0x88,0x64,0x07 }, { 0xc9,0xca,0xee,0xe1,0x1c,0x67,0xfa,0x50,0xf2,0x28,0x89,0x75,0x1f,0xcb,0x4b,0xdb,0x13,0xb3,0x0e,0x5b,0xec,0x39,0xf0,0x4c,0x22,0x93,0xfe,0x38,0xec,0x05,0x92,0x28 }, { 0x88,0x6d,0xe3,0x8d,0xea,0x38,0x28,0x0d,0x70,0x9a,0xd5,0x0a,0x85,0x00,0x4a,0x33,0x75,0x3e,0x93,0x7c,0x66,0x1b,0x18,0xa7,0x4d,0xf7,0x9e,0x09,0x1f,0xd7,0xb1,0x53 }, { 0xf1,0x39,0x62,0xbc,0x23,0x52,0x48,0x4e,0xe0,0x59,0xff,0x27,0x4d,0x74,0x30,0x20,0x8a,0xa2,0x38,0xe0,0x4d,0xc4,0x41,0x37,0x01,0x50,0xff,0xa6,0x2a,0x22,0x53,0x3f }, { 0x61,0xf2,0x66,0x78,0xe8,0x35,0x72,0xa9,0xe1,0x9f,0x74,0x00,0x1f,0x97,0xba,0xac,0xe3,0xa0,0xc8,0x20,0xe0,0xca,0x00,0xb5,0xcd,0xa8,0x12,0xf6,0xca,0xe4,0x26,0x24 }, { 0x1f,0x74,0xf1,0x59,0x71,0x8f,0x41,0x05,0x51,0x62,0xa3,0x6f,0xf5,0x98,0xdd,0x37,0xe5,0xff,0x5e,0x15,0x1b,0x0a,0x02,0xd9,0x34,0xe4,0xfb,0x2a,0xc3,0xf3,0xd5,0x72 }, { 0xad,0x7b,0xf1,0x0a,0x44,0xf2,0xbd,0xe1,0x94,0x36,0x7c,0x8b,0x6b,0x1e,0x94,0xd6,0x0d,0x3c,0xe1,0x4a,0xfb,0x1f,0x31,0x8f,0xf0,0x67,0x95,0x1e,0xec,0x01,0x7f,0x2e }, { 0x26,0xb5,0xe9,0x51,0x78,0xa5,0x1e,0x59,0x90,0xdd,0xc9,0x5d,0x75,0xe7,0x7b,0xfe,0x3f,0x32,0x39,0x14,0xcc,0x3b,0x68,0x20,0x6b,0x33,0x69,0x0b,0x5e,0x40,0x29,0x52 }, { 0xe9,0x0c,0xe6,0x6d,0xa6,0x8c,0x40,0x21,0xb3,0x3a,0x50,0x13,0x3d,0xf0,0xe7,0xbf,0xf9,0xf3,0x4d,0x2b,0x4a,0x3b,0x29,0xc4,0x0a,0x89,0x76,0x7c,0xe8,0x33,0xc6,0x75 }, { 0xf8,0x3c,0x9f,0x1e,0xca,0x7d,0x61,0x51,0x31,0xd6,0x3d,0xae,0x9f,0x87,0xb6,0x1e,0xdc,0x58,0xa9,0x70,0xad,0xd7,0x6f,0xbe,0xa7,0x2e,0xe1,0xfa,0x2f,0x4f,0xe4,0x3f }, { 0xb4,0xcd,0x51,0xc8,0xe7,0xa1,0x0a,0xe6,0x55,0x4c,0xfd,0xf7,0xb2,0xf2,0xac,0x0b,0x09,0x8d,0xed,0x5e,0xdb,0x52,0xf4,0x1f,0xe8,0x25,0x9b,0x37,0xc6,0x07,0xbe,0x06 }, { 0xe7,0x35,0x4e,0x3f,0xad,0x48,0x38,0xc0,0x1d,0xd3,0xdb,0xf0,0xb2,0xaf,0xc0,0x77,0x9c,0x21,0x79,0x31,0x93,0x7c,0x31,0x9b,0x19,0x36,0xaf,0xc2,0x53,0x00,0x32,0x36 }, { 0x00,0x75,0x23,0xdc,0xda,0x35,0x4d,0x9d,0x9a,0x84,0x92,0x08,0x37,0x66,0x18,0x16,0xf6,0xb8,0x34,0x4c,0xf3,0x14,0x2b,0xda,0xe9,0x94,0x7f,0xed,0x90,0x1a,0xcc,0x7e }, { 0xee,0x8a,0x05,0x95,0xf3,0x9d,0x3e,0x8e,0x8b,0xa2,0x3b,0x94,0x80,0xa7,0xab,0x92,0x38,0xf4,0x2a,0x37,0x2d,0xee,0x4a,0xc5,0xbe,0xb9,0x25,0x6e,0x24,0x5b,0xe1,0x79 }, { 0x9d,0x2c,0x86,0x1a,0x11,0x8e,0x98,0xb1,0xe1,0x58,0x5a,0xf7,0xa4,0x1f,0xaf,0x30,0x15,0xe3,0x00,0xbb,0x5a,0xce,0xd0,0x64,0x5a,0xaf,0x89,0x9c,0x21,0x95,0x04,0x0f }, { 0xe6,0x22,0x0f,0xab,0xcf,0x17,0x61,0x6d,0x4a,0x99,0x7d,0x0c,0x92,0x43,0xef,0xed,0xdb,0x4f,0x9d,0xe1,0xa8,0x54,0x3c,0x4a,0x42,0x26,0x19,0xc3,0xf6,0x69,0xca,0x12 }, { 0x17,0x24,0xff,0x37,0x41,0x36,0xa0,0x27,0xb9,0xc3,0x9f,0xea,0x4f,0xaa,0x3b,0x78,0x71,0xf1,0x6e,0x45,0xce,0xf0,0x6a,0x33,0xa8,0x21,0xd6,0x29,0x06,0xcc,0x7e,0x7d }, { 0x82,0xa1,0xc2,0xfd,0x2b,0x00,0xcb,0xaf,0xe0,0x74,0x62,0xef,0xad,0xf3,0xdc,0x86,0x12,0x20,0x67,0x5a,0xea,0x87,0x16,0x02,0xc9,0xa7,0xed,0x04,0xd9,0x17,0xee,0x28 }, { 0x2b,0x1f,0x06,0xab,0x4e,0xa2,0x55,0x83,0x75,0x6b,0x68,0x70,0x3b,0xbc,0x0f,0x10,0xc9,0xca,0x79,0x0a,0x78,0xba,0x9a,0xb9,0x22,0xd3,0x28,0x37,0xa4,0xcb,0x5b,0x01 }, { 0x30,0x16,0x4c,0xfc,0x55,0x87,0x7a,0xcf,0x33,0x01,0x0d,0xdc,0x0a,0x0d,0x7f,0xa3,0xca,0x72,0x3f,0xad,0x87,0x95,0xec,0xe1,0xa6,0x79,0x28,0xa1,0xaa,0x81,0x25,0x7e }, { 0x5e,0x6e,0xb2,0x07,0x0c,0x9b,0x47,0xbf,0xe5,0x9f,0xc3,0x66,0xe2,0xa5,0xca,0x62,0x12,0xd5,0x74,0xc9,0xac,0x3a,0x6d,0x1e,0xb7,0xa5,0xaf,0x03,0x29,0x9b,0x91,0x13 }, { 0xfd,0x0e,0x45,0x86,0x5d,0x42,0x5c,0xee,0xae,0x28,0xc1,0x3e,0xd0,0xa8,0xce,0x2d,0x98,0x62,0xbf,0x6c,0x46,0x85,0xda,0xd6,0xb5,0xf3,0xf9,0x61,0x4f,0x59,0x22,0x13 }, { 0x5a,0x91,0x60,0xe4,0xba,0x68,0x58,0x13,0xf0,0x34,0x1a,0xc9,0x4e,0x96,0xc4,0x54,0xd9,0xd1,0x5b,0x6d,0xfd,0x1f,0x1f,0xb0,0x10,0x45,0xc9,0x12,0xda,0x3c,0xde,0x00 }, { 0x67,0xc0,0x01,0xdb,0x4d,0x3c,0x2d,0xc4,0x8d,0x57,0x97,0xea,0x23,0x78,0x43,0x86,0xd9,0x60,0xf0,0xdc,0xad,0x22,0x6c,0xdf,0xa0,0x1c,0x18,0xa8,0x43,0xca,0x5d,0x1a }, { 0x70,0xaa,0xa6,0xd2,0x4e,0xd2,0x79,0x2c,0x09,0x63,0xbb,0x3d,0x8e,0x0f,0xbc,0xa3,0xa6,0x35,0x7e,0x46,0x68,0x0c,0x1b,0xdc,0x37,0x02,0xee,0x9f,0xa3,0xa9,0x48,0x13 }, { 0x86,0xc5,0xbb,0x2d,0xd9,0xf9,0xef,0x4a,0x70,0xb7,0x30,0x30,0x3e,0x24,0x20,0xd6,0xd3,0x9a,0xbd,0x3a,0x06,0x0a,0xc7,0xa0,0xf1,0x2c,0x73,0x1f,0x0b,0x53,0xe1,0x51 }, { 0xe2,0xff,0x88,0x59,0x92,0xcf,0x11,0x6f,0x47,0x4a,0x3d,0xf3,0xda,0x74,0x99,0xe0,0x13,0x44,0x60,0x50,0x4f,0xa4,0x14,0x8b,0x9f,0xff,0x7f,0xde,0xd6,0xfc,0x2e,0x30 }, { 0x28,0x6f,0x27,0x1e,0xd4,0xce,0xf4,0x76,0xea,0xed,0x75,0x20,0xcf,0x7f,0x88,0xad,0x23,0x27,0xbd,0x01,0x26,0x54,0xe9,0x8c,0x77,0x9a,0x6b,0xe7,0x58,0x8b,0xb4,0x02 }, { 0xa1,0xd0,0x81,0xea,0xb3,0x5a,0x21,0x65,0x7f,0x60,0x00,0x9a,0xb7,0x8a,0x6e,0x05,0x2b,0x1c,0xc4,0x74,0xbf,0x7a,0xd3,0x09,0xb4,0x80,0xaf,0xd0,0x97,0x06,0x9e,0x44 }, { 0x36,0x17,0xc5,0xd5,0xad,0x5a,0xe3,0x94,0x1e,0x77,0x3b,0x8f,0x3d,0xe1,0xf8,0xe3,0x0e,0xdc,0x34,0x96,0x71,0xb2,0xb3,0x05,0x7e,0x49,0x6a,0x06,0x49,0x67,0x79,0x2f }, { 0xb4,0xe3,0x01,0x0d,0xba,0x1f,0xe2,0x4e,0xee,0x08,0xae,0xfc,0x2c,0x19,0xf9,0xa4,0x9d,0xf8,0xe4,0x5f,0x94,0x38,0x9e,0x06,0xbb,0x21,0xfb,0x3b,0x87,0xcb,0x6f,0x62 }, { 0xc7,0x76,0x0f,0xfb,0x4a,0xd2,0xeb,0x53,0x85,0xd8,0x14,0xa9,0x08,0x40,0xad,0xcc,0x0f,0x79,0xf2,0x29,0xb8,0xb5,0x7d,0x20,0xd1,0x4f,0x24,0xbe,0xad,0xab,0xe6,0x2d }, { 0x52,0x64,0x76,0xdb,0x1f,0x80,0x92,0x47,0x3d,0x15,0x33,0xc1,0xf1,0xd3,0x8c,0x55,0x05,0xd1,0xd6,0xcd,0xb4,0xd0,0x6e,0x55,0x6d,0x83,0x47,0xcf,0xfa,0x00,0x0b,0x50 }, { 0x35,0xf4,0x96,0x70,0x24,0x75,0x0b,0x47,0x6f,0xc6,0x3e,0x43,0x59,0x44,0x3f,0x8b,0x3c,0x98,0xf2,0x09,0x05,0x9e,0x79,0x81,0xe9,0x7b,0xa6,0xb8,0x1c,0x08,0xf5,0x71 }, { 0xf8,0x38,0x0e,0x1d,0x45,0x9a,0x1b,0x06,0xbc,0xa3,0x59,0x9f,0x83,0x0c,0x44,0x1a,0xd8,0xc9,0x1f,0xc4,0xdc,0xf1,0x6f,0xe4,0xa8,0x34,0xee,0x57,0xd2,0x54,0x2b,0x77 }, { 0xc6,0x19,0x37,0x27,0x6f,0xee,0x76,0xb4,0x2b,0xe0,0x77,0x08,0x55,0x37,0xf7,0x50,0x82,0xfc,0xaf,0xd5,0xd1,0xca,0xa2,0xe9,0xda,0x8f,0x33,0x65,0xea,0x8e,0x2a,0x16 }, { 0xd2,0xb5,0x9b,0xaa,0x6c,0x51,0xf4,0x2e,0x71,0x39,0x52,0xdb,0xef,0x43,0x2d,0xfc,0x4f,0xae,0x24,0xde,0x4d,0xdf,0x5e,0x6d,0x07,0x3c,0xf6,0x6c,0x72,0x29,0xbd,0x00 }, { 0x00,0x58,0x2c,0xdc,0xa9,0x73,0xdb,0x16,0xa7,0x56,0xa6,0x6a,0xb2,0x77,0x52,0x17,0xd9,0xc3,0x88,0x2b,0x7d,0x0d,0x79,0x19,0x88,0xae,0xd2,0x13,0x47,0xf0,0x4f,0x6c }, { 0xb9,0xe4,0x19,0x44,0xd4,0xb4,0x29,0xd8,0x8f,0x44,0xb8,0xcd,0x96,0x04,0xbf,0xff,0xee,0xfb,0x06,0x01,0xf0,0x97,0x29,0x4f,0x52,0xf6,0x75,0x56,0xd8,0xf6,0x53,0x60 }, { 0xed,0xf5,0x78,0xe3,0x49,0xd6,0x9a,0x29,0xb8,0x4c,0x84,0xff,0xf3,0xff,0x14,0x0c,0xa1,0x2a,0xf0,0xd9,0xed,0x3c,0xd3,0xa3,0x16,0x52,0xb7,0x92,0x18,0x63,0xbc,0x57 }, { 0x89,0x19,0x17,0x8a,0x17,0xbb,0x74,0x64,0xf4,0xdc,0x1a,0x25,0xe6,0x3d,0x2f,0xb3,0x7a,0xb3,0xc4,0xaf,0x52,0x30,0xc4,0xc9,0x93,0x01,0x1f,0xd7,0x9a,0x79,0xd2,0x6a }, { 0x0d,0x27,0xa8,0x55,0x15,0xc0,0x9a,0x9f,0x82,0x6a,0xfd,0x2d,0x42,0x21,0x6a,0x2b,0x6a,0x9d,0x03,0x36,0x29,0x31,0xca,0xe7,0xac,0x3d,0x55,0x24,0x93,0x0c,0x32,0x1f }, { 0x7d,0x33,0xfb,0x91,0x05,0xaa,0x60,0x3d,0x8b,0x27,0xa4,0xea,0x4f,0xc1,0x16,0x07,0xc5,0xc1,0xa4,0xed,0x48,0x7a,0xb1,0x56,0xeb,0xac,0x58,0x6f,0x94,0x0f,0xa4,0x7b }, { 0x40,0x96,0xad,0xfd,0x0f,0xf3,0x8f,0xe9,0x32,0x3f,0xa8,0x8e,0x9e,0xe1,0xac,0xf1,0xad,0x7d,0x84,0xee,0x75,0x65,0x33,0x1b,0x54,0x07,0x93,0xd8,0xfd,0x24,0xd0,0x4d }, { 0x9f,0xab,0x5e,0x1f,0x9c,0xea,0x54,0xa2,0x0e,0xa9,0xaf,0x1a,0xf8,0x7e,0xba,0xdd,0x15,0x21,0x19,0x82,0x38,0x59,0xfe,0xe8,0xcf,0xe5,0x13,0xd5,0xe0,0xe4,0x09,0x37 }, { 0x0a,0x38,0x41,0x32,0xfe,0x52,0xf7,0xd3,0x0f,0x2d,0xea,0x67,0x4a,0x85,0xbf,0xa4,0xcd,0xa5,0xbb,0xbe,0x11,0xca,0x2e,0xd0,0x5a,0x79,0x62,0x87,0xa9,0x32,0xf2,0x04 }, { 0x32,0x18,0xbc,0x96,0x81,0xec,0x1f,0xdb,0x2c,0x37,0x87,0xa8,0x9e,0x66,0x2d,0x4a,0x52,0xdf,0xb8,0x9e,0xf6,0x66,0x7c,0x62,0x69,0x09,0x4d,0x82,0x79,0x06,0xa0,0x3c }, { 0xf2,0x0a,0x94,0x43,0x69,0x74,0x6e,0x53,0x5a,0x92,0xee,0xaf,0xc2,0x1b,0xb9,0x61,0x4b,0xda,0x07,0xae,0x15,0xc4,0x9b,0xcf,0x99,0x11,0xe1,0x79,0x7a,0xf5,0xe0,0x26 }, { 0xe2,0x2a,0xe2,0xff,0x47,0x0a,0x6f,0xfa,0x29,0x02,0x8f,0x3b,0xcf,0xdd,0x99,0x9a,0x10,0x08,0x29,0xb4,0xec,0x00,0x60,0x46,0x31,0xed,0x6e,0x8a,0x2f,0x94,0x91,0x20 }, { 0x44,0x17,0x3b,0xe4,0x2b,0xdd,0x0a,0xfd,0x2a,0x85,0xcb,0x14,0xb2,0x9e,0x7a,0x33,0x2d,0x85,0x21,0xc3,0x1f,0x42,0x4d,0xd0,0xb4,0x78,0x65,0xbc,0x84,0x04,0x91,0x76 }, { 0xab,0x48,0x5a,0x16,0x4e,0x03,0xb3,0xa4,0xf5,0x86,0xe7,0x58,0x53,0x70,0x42,0x84,0x28,0x16,0x2e,0xe3,0xab,0x4d,0xeb,0x0f,0xca,0x97,0x8a,0x00,0x5e,0xe6,0x7a,0x2f }, { 0x87,0xb4,0x87,0xe4,0xe5,0x92,0xdb,0x44,0x45,0x94,0xf8,0x4d,0x30,0x0d,0x51,0x8e,0xbe,0x42,0x0f,0xaf,0x49,0xd3,0x85,0x37,0x0e,0x14,0xf5,0xa3,0x86,0xd2,0x74,0x67 }, { 0xc7,0x65,0x04,0x1b,0xbd,0xa2,0x61,0x48,0x93,0x5e,0x58,0x8d,0x73,0xb4,0xca,0xbb,0xf9,0x1d,0xdc,0xdc,0xde,0x05,0xbc,0x9f,0x23,0xcd,0x6a,0x79,0x9c,0x8e,0x3b,0x67 }, { 0x91,0x5b,0x03,0x72,0x98,0x48,0xef,0xfe,0xed,0x53,0x54,0xc4,0x48,0xa1,0x67,0x15,0xdd,0x29,0xdd,0x52,0x39,0xed,0x94,0x64,0x57,0x30,0x08,0x67,0xf3,0x32,0xf4,0x68 }, { 0x35,0x78,0xd3,0x1e,0xeb,0x79,0xe2,0xa6,0x1f,0x2a,0xd6,0x06,0x3b,0xf8,0x0e,0x6f,0x35,0x90,0x5c,0x52,0x7d,0xd6,0x48,0xa5,0x83,0xc0,0x7d,0xe5,0x50,0xda,0x6e,0x11 }, { 0x3c,0xb6,0xb7,0x2e,0xea,0xcf,0xd1,0xde,0x08,0x84,0xc1,0x5c,0x3c,0x2b,0xa5,0xc0,0x21,0xac,0xc2,0xcd,0xe3,0xf7,0x98,0x9e,0x1b,0xb5,0xee,0xa0,0x42,0x44,0x74,0x0d }, { 0x4a,0x76,0xf6,0xdb,0x1b,0x8e,0x6b,0xda,0x78,0xb8,0x54,0xdf,0xf7,0xf4,0xc4,0xee,0x7a,0xf3,0xdb,0xe5,0xf7,0x43,0x68,0x96,0xdd,0xd5,0xb1,0xc3,0x88,0xb4,0x7a,0x12 }, { 0x28,0x65,0xad,0x3e,0xca,0x0c,0xba,0xbc,0x9e,0x8c,0x2d,0x85,0x60,0xcc,0x55,0x66,0x2d,0x22,0x07,0xed,0x9f,0x8f,0xc4,0xbf,0xaf,0x73,0x20,0xa7,0x7c,0x6d,0x7a,0x67 }, { 0xfc,0x05,0xcd,0xfe,0xd7,0x02,0xa4,0xba,0xac,0x34,0x9b,0xf9,0xbc,0x04,0xa5,0x23,0xe8,0x04,0xa7,0xab,0x57,0xaa,0x76,0xb0,0x0f,0x9a,0x12,0xdd,0x7f,0x0f,0xaf,0x5c }, { 0xfe,0x00,0x25,0xaa,0x7b,0xf1,0x00,0x0f,0x6c,0xaf,0x6e,0x34,0xb9,0xed,0xcd,0x3f,0x41,0x37,0xed,0x74,0x4b,0x19,0x72,0x26,0xd0,0x7a,0x7a,0x5b,0xe1,0xcd,0xf7,0x45 }, { 0x8b,0xe3,0x02,0x95,0xe8,0x33,0xe3,0x7a,0xb4,0x90,0x21,0xc8,0xbb,0x0c,0x8c,0x5e,0x9d,0x63,0xf2,0xa2,0x56,0x5d,0x08,0x72,0x7f,0x9b,0xea,0xfb,0xaf,0x93,0x80,0x40 }, { 0x95,0xbc,0xce,0x33,0x7b,0x0a,0x65,0x5b,0xe0,0x26,0x1a,0x40,0x68,0x28,0x4f,0xb4,0xb1,0x21,0x11,0x1b,0xd2,0x7a,0x64,0x43,0xb2,0x39,0x75,0x34,0x01,0x05,0xdc,0x17 }, { 0x36,0x12,0x3f,0xe0,0x92,0x37,0xfe,0xbf,0xcc,0xb6,0xc5,0x4a,0x14,0x14,0x7d,0xab,0xd1,0x22,0xaa,0x1b,0x08,0xf2,0x97,0xb0,0x0c,0xdb,0x21,0x2c,0xfa,0x7f,0x60,0x4c }, { 0x54,0xbc,0x2f,0xf4,0x02,0x89,0x70,0x2c,0x69,0x78,0x5d,0xe5,0x16,0x65,0xf0,0xc8,0x69,0x2e,0xc7,0xde,0xca,0x6a,0x64,0x63,0x53,0xec,0xe0,0xd1,0xd3,0xd9,0xd1,0x09 }, { 0xb5,0xb9,0x1a,0x6b,0xb0,0xc1,0x94,0x9a,0x52,0x24,0x48,0xb8,0x71,0x3e,0x1b,0xfe,0xb5,0x56,0x23,0x3c,0x18,0xb3,0xdf,0x81,0x10,0xe7,0xd5,0x63,0x04,0xc3,0xb7,0x46 }, { 0x51,0x4f,0xd2,0xb3,0xf8,0xac,0xe2,0x23,0xfb,0x3a,0xee,0x33,0x23,0xea,0x95,0xd3,0xa2,0xec,0x58,0x37,0xd9,0x80,0x45,0x0c,0x0d,0x2f,0xb4,0x33,0xb6,0xe0,0x4a,0x32 }, { 0xaf,0x0e,0x94,0xaa,0x48,0xd9,0xf8,0xb6,0x79,0x2a,0x2c,0xe6,0xfa,0x9d,0xd3,0xa0,0x54,0xaf,0x84,0xa8,0xfb,0xcf,0xcf,0xe1,0x0b,0x24,0xa7,0xce,0xb8,0x97,0xe6,0x12 }, { 0x92,0xed,0xc3,0x77,0x1b,0xf5,0xfc,0x7e,0xbe,0x08,0x9e,0xfc,0x51,0x5f,0x2a,0x50,0x51,0x4c,0xc5,0x90,0xf0,0x14,0x7c,0x9c,0xcb,0xd4,0x3e,0xd4,0x88,0x6d,0xc0,0x49 }, { 0x11,0xd9,0x98,0x18,0x64,0xfe,0x46,0x51,0x14,0xe9,0xda,0xe6,0x9d,0x2d,0xc3,0x11,0x6c,0x72,0x67,0x93,0xd2,0xc9,0xd0,0xbc,0x74,0x31,0x7c,0xb7,0x96,0xd0,0x99,0x0b }, { 0xbe,0x10,0x07,0x57,0x28,0xa1,0x6b,0x76,0xa8,0x14,0x31,0x8b,0x27,0x4d,0x2d,0xa7,0x90,0x3c,0xc2,0xaa,0x53,0x32,0x04,0x4a,0xd6,0x13,0x2d,0x8e,0x00,0xea,0xb1,0x05 }, { 0x61,0x52,0xc2,0x38,0xc7,0xc7,0x20,0xe8,0xb6,0xfe,0xf8,0xd4,0xf1,0x06,0x26,0x0d,0xcb,0x02,0xbe,0x51,0x9f,0x9f,0xd7,0xad,0x64,0x65,0xf7,0x62,0xac,0x32,0xf9,0x0f }, { 0x9a,0x3e,0xe0,0xae,0xb0,0x2b,0x46,0x04,0x12,0x7f,0x98,0x1e,0x2f,0x75,0xbb,0x92,0x01,0xbe,0xe0,0x24,0xb6,0x8d,0xa0,0x8b,0x43,0x01,0x65,0x67,0x8a,0xa9,0x1b,0x72 }, { 0xfa,0x00,0xc4,0xd8,0xe4,0xf5,0xbe,0x7b,0x68,0xa9,0xa6,0xf4,0xd5,0x1a,0xb6,0x2e,0xbf,0x92,0x19,0xf7,0xc8,0x1c,0x31,0x65,0x52,0xef,0x30,0x93,0x34,0x60,0xb4,0x62 }, { 0x6d,0x0f,0xad,0xfd,0xff,0xd6,0xa5,0xc4,0x16,0x6c,0x72,0x4a,0x1b,0x42,0xf2,0xe3,0xb8,0xe9,0x2a,0xeb,0x33,0x35,0x69,0x2e,0x22,0x3a,0xbf,0x61,0x34,0x2c,0x37,0x61 }, { 0x6f,0x6c,0x90,0x82,0x65,0x23,0x00,0x05,0x30,0x70,0x5f,0xa3,0x94,0x10,0xbd,0xf7,0x5c,0xd7,0x75,0xbd,0xd4,0x48,0xc2,0x6c,0x6e,0x03,0x50,0x8c,0x71,0xe4,0x80,0x39 }, { 0x40,0x7e,0x18,0xcf,0xb4,0x80,0x56,0x72,0x3c,0x05,0xb6,0x68,0xad,0x2f,0x32,0xa8,0x15,0xe7,0x0a,0x92,0x2d,0xe3,0x67,0xe7,0x8d,0x1e,0x7e,0x8d,0xf1,0xc4,0xe1,0x25 }, { 0x53,0x4e,0xb9,0x93,0xce,0x36,0xd6,0x35,0x71,0x0c,0x98,0x3d,0xa2,0x2f,0x9a,0xe9,0xc9,0x36,0x4e,0xc4,0x1d,0x7d,0x8d,0x26,0xe9,0xe4,0x5f,0x3a,0xda,0xfe,0x42,0x60 }, { 0xe1,0x09,0xb0,0x74,0xf6,0xbe,0xde,0x7f,0x3d,0xfd,0xde,0x31,0xa4,0x70,0x11,0xab,0x24,0x01,0x05,0xea,0x0d,0xd3,0x7a,0x9c,0x65,0x16,0x55,0x49,0x10,0xab,0x0c,0x3c }, { 0x46,0x07,0xd6,0x3b,0x28,0x61,0x5e,0xcb,0x83,0xc5,0xe1,0xdc,0xbc,0x2f,0xd9,0x3a,0x34,0x6e,0x62,0xec,0x4a,0xb6,0xe3,0xf6,0xd0,0x16,0x23,0x3f,0xaf,0x24,0x2f,0x19 }, { 0xec,0x42,0x64,0x86,0x00,0xbd,0xe6,0x7b,0x28,0xf8,0xf8,0x38,0xcb,0x37,0xfc,0x59,0x5a,0x77,0x0c,0x60,0x78,0x86,0x41,0xbd,0x47,0xc3,0xf1,0x24,0xf3,0x20,0x00,0x3b }, { 0xfa,0xee,0x54,0x77,0x92,0x10,0x27,0xfc,0x1b,0x4a,0x93,0xfa,0xcc,0x11,0x57,0x45,0x05,0x02,0x0f,0x9a,0x61,0x77,0x58,0xa7,0xdd,0xfe,0xa4,0x03,0xa8,0xdb,0xcf,0x02 }, { 0xae,0x10,0xc7,0x2a,0x6c,0xa5,0xf7,0x5c,0x0a,0x4a,0x7e,0x1b,0xbe,0x9d,0xaf,0x6f,0x25,0x72,0xe3,0x20,0x03,0x53,0xc7,0x34,0xa5,0xc9,0xaf,0x47,0x72,0x2f,0x53,0x18 }, { 0x77,0xb4,0x0f,0x1d,0xcc,0xb1,0x89,0x72,0x82,0x9b,0xd5,0xfc,0x4a,0x64,0x0e,0xd5,0x46,0xda,0xb1,0x05,0xf0,0x10,0x1b,0xdd,0x3a,0x15,0x0e,0xb4,0xf4,0x93,0xfa,0x75 }, { 0xf4,0x41,0x4b,0x80,0x09,0x92,0x67,0x8f,0x7a,0x4d,0x0f,0x71,0x1f,0xba,0xaf,0xf4,0x14,0x06,0xcf,0x9c,0xa3,0x8d,0x92,0x24,0x20,0x61,0xea,0xe0,0xaf,0xd4,0x5c,0x34 }, { 0x08,0x08,0x32,0x73,0x5e,0x47,0x2c,0xef,0xa3,0x7c,0xfd,0x1a,0x93,0x70,0xc7,0x11,0x13,0x85,0xa6,0x91,0x3f,0x9a,0x99,0x7f,0xbe,0x0d,0x03,0xc2,0x79,0xb2,0x58,0x7f }, { 0x0f,0xb2,0x76,0xf4,0x09,0x94,0x46,0x07,0x18,0x8b,0xec,0x06,0xb3,0x82,0x60,0x1a,0x0a,0xad,0xf7,0xab,0x09,0x15,0x94,0x4b,0x72,0xeb,0xd6,0x0c,0xea,0x1a,0xf5,0x5a }, { 0xaf,0x03,0x2b,0x91,0xf6,0xf8,0xbd,0x87,0x27,0x10,0xf5,0xe3,0x09,0xc5,0x30,0x81,0x9d,0x08,0x3d,0x05,0xc8,0xf4,0x93,0x9f,0xf3,0xe5,0xfd,0xa4,0xf0,0xd6,0x52,0x13 }, { 0xb4,0xdf,0x30,0x98,0x0d,0xf1,0x18,0x37,0x79,0xcb,0x3c,0x2d,0x13,0x7d,0xa7,0x23,0xe3,0x64,0x38,0x2b,0x13,0x9a,0x32,0x67,0x98,0x94,0x12,0x76,0x05,0x4a,0x75,0x46 }, { 0x00,0x8e,0xb5,0xf0,0x57,0x5d,0xae,0x77,0xc9,0x0d,0x3c,0x8f,0x03,0x09,0x83,0x71,0xac,0xc1,0x16,0xf9,0x3f,0xeb,0x5b,0x24,0x1f,0x7e,0xae,0x9f,0xa2,0xf6,0xf1,0x5a }, { 0xd3,0x29,0x66,0x6e,0x26,0x55,0x29,0x62,0xe3,0xd1,0xae,0xdb,0x33,0xb6,0xfd,0xac,0x43,0xa2,0xb6,0xf8,0x00,0xb0,0xf7,0x04,0x97,0x17,0x94,0x01,0x52,0x4c,0x22,0x6b }, { 0xd2,0x35,0x49,0x4b,0x06,0x43,0xd9,0x28,0x13,0x63,0x8c,0xdd,0xd1,0x26,0xe2,0x8b,0x0c,0xf6,0x56,0x49,0x5e,0x6e,0x91,0xb3,0x5d,0x33,0xe4,0x62,0x73,0x60,0x8b,0x76 }, { 0xb3,0xac,0x71,0x13,0x63,0x15,0xb1,0xa1,0xf5,0xe4,0x96,0xf5,0x8b,0xb2,0x1f,0xea,0x31,0xcc,0x48,0x1a,0x17,0xc6,0x37,0xb6,0x2d,0xee,0x9c,0xb9,0x88,0xa3,0xe0,0x4f }, { 0xd1,0x74,0xe6,0xaa,0x9d,0x4c,0x26,0x86,0x7c,0xbf,0x85,0xff,0xae,0xd7,0x5e,0x88,0xa2,0xda,0x7d,0x0f,0x55,0xf7,0x6e,0x36,0x15,0xb0,0x9a,0x5d,0xa2,0x80,0xdd,0x50 }, { 0xc9,0xcc,0xf5,0x2c,0xc6,0x59,0xa9,0xdf,0x41,0x07,0x91,0xd5,0x48,0x00,0xd1,0x0b,0x4c,0xbe,0xad,0xf0,0x0a,0x3a,0x5b,0x70,0xdd,0x81,0x6d,0x75,0xb3,0x28,0x8b,0x0e }, { 0x28,0x3a,0x77,0xff,0x39,0x9a,0x51,0x68,0x6c,0x2d,0xb7,0xa3,0x36,0x7b,0xb6,0x66,0x7a,0x26,0x9b,0xdc,0x9c,0xb2,0x7a,0x3c,0xd0,0xfc,0x34,0xaf,0x33,0xdd,0x0a,0x48 }, { 0x9b,0xb5,0xb6,0x19,0xfd,0x1d,0x0b,0xfa,0x29,0xb2,0x8e,0xdd,0xad,0xeb,0xf1,0x7d,0x13,0xcd,0xf0,0x62,0x30,0x34,0x5c,0xfc,0x10,0x03,0xd7,0x06,0x2c,0xf8,0xfc,0x1f }, { 0x54,0x63,0x73,0xa5,0xd0,0x3f,0xe2,0x18,0x05,0x14,0xae,0x4e,0xe8,0x5e,0xe9,0xfd,0xb9,0x6b,0x32,0xf4,0x2e,0x0e,0x4b,0x2c,0xab,0x84,0xd7,0x5e,0xd5,0x3e,0x80,0x33 }, { 0xb6,0xea,0x35,0xe4,0xba,0xe6,0x98,0x78,0x06,0xcb,0x8a,0x66,0xec,0xe4,0xc1,0x28,0xf4,0x64,0xff,0x64,0xf2,0xfc,0x36,0x0f,0xbe,0x0a,0xde,0xe5,0xdb,0x3a,0x49,0x12 }, { 0x80,0xeb,0xa2,0x21,0x8a,0x3b,0xed,0x1c,0xcb,0x2d,0x94,0x28,0xf8,0x6b,0xc1,0xdb,0xce,0x76,0xf7,0x8c,0x30,0x68,0x9e,0x7c,0xc3,0x3f,0xf1,0xec,0x8c,0x3a,0xd5,0x12 }, { 0x90,0x92,0xda,0x19,0xa2,0x89,0x74,0xab,0x9f,0xc5,0xad,0x76,0xa9,0x02,0x0e,0x64,0x5a,0x5d,0x57,0x67,0x14,0xd2,0xff,0x06,0x91,0x41,0x20,0xeb,0x01,0xe0,0xa9,0x07 }, { 0xc4,0xa1,0xe5,0x87,0x30,0x0f,0xfa,0x30,0x13,0x0c,0x67,0xda,0xc1,0xc6,0x1a,0xe5,0xb8,0x7d,0xaa,0x4c,0xba,0x69,0x91,0xad,0x6c,0xf5,0x4c,0x38,0xa4,0x7d,0x30,0x00 }, { 0xdd,0x04,0x5f,0xf6,0xf2,0xdb,0x0f,0x98,0x86,0x72,0xcd,0x69,0x5d,0x8f,0xe9,0x3f,0xc8,0x86,0x6c,0xb0,0xa0,0x06,0xd8,0x57,0xa2,0xa6,0x1a,0x2b,0xe4,0xdf,0x7e,0x3e }, { 0x5f,0x67,0x46,0x72,0x1c,0xe8,0x8b,0xc9,0x78,0x24,0xcd,0x54,0xaf,0x5e,0x0a,0x0c,0x66,0x1a,0x7f,0x9a,0xf6,0x26,0xa5,0xa2,0x5b,0x75,0xf5,0x08,0xf1,0x49,0xdc,0x40 }, { 0x95,0x83,0x7d,0x76,0x9a,0x03,0x56,0x2a,0x4a,0x89,0xab,0x4b,0xd8,0x3c,0xe6,0x48,0x9c,0x5e,0x44,0xba,0xb5,0x91,0x33,0xda,0x04,0x88,0x45,0x2d,0xa5,0x17,0x10,0x06 }, { 0x3c,0xc4,0xb4,0xd9,0xe8,0x15,0x93,0x1e,0x1f,0xf4,0xa5,0xaa,0x84,0x4d,0x78,0x88,0x1c,0xd8,0x4e,0x34,0x44,0xf7,0x81,0x0a,0x7c,0xf6,0x05,0x9e,0x3e,0x86,0x43,0x72 }, { 0x7e,0x74,0x85,0x24,0x56,0xde,0x09,0xa5,0xb0,0xd6,0xeb,0xf7,0x63,0x26,0xfb,0xb5,0x78,0x46,0xb4,0x1a,0x07,0xa3,0x41,0xb0,0x38,0x5e,0x7f,0x4e,0xe1,0x17,0x71,0x47 }, { 0xa2,0xdb,0x34,0xf7,0x4e,0x77,0x81,0x47,0x99,0x7e,0x24,0x1e,0x9f,0x6d,0x4f,0x52,0x1a,0xa8,0x0b,0xd5,0x44,0x3d,0x42,0x24,0x42,0x6c,0x9b,0x5c,0xeb,0xb0,0x9b,0x3d }, { 0xf5,0xa7,0xb7,0xf6,0x6f,0x7f,0x17,0xc1,0x6c,0x27,0xe1,0x59,0x38,0x98,0xdf,0x53,0xf0,0xd1,0x1b,0xdd,0x8f,0x02,0x79,0x79,0xca,0xfc,0x24,0xd2,0x06,0xb7,0xe3,0x2c }, { 0xee,0xf3,0x3c,0x17,0x9f,0x81,0x6b,0xda,0x03,0x4e,0x43,0xb0,0x11,0xff,0x1c,0x38,0x73,0x06,0xed,0xc7,0xce,0x5b,0xaa,0x20,0xc6,0x6f,0x1e,0x84,0x92,0xd7,0xa3,0x11 }, { 0x29,0xf9,0x9f,0xa7,0x31,0xa0,0xec,0x1f,0xd7,0x08,0x7d,0xdf,0xbb,0x59,0x7d,0xcb,0x98,0x36,0xd9,0x55,0x29,0x40,0xdf,0xe0,0x45,0x20,0x44,0xdc,0x85,0xd6,0xb0,0x36 }, { 0xe7,0x18,0xcb,0xb1,0x93,0x6f,0x94,0x3b,0x9a,0x68,0xeb,0xaf,0xee,0x1b,0x80,0xa9,0x83,0xae,0x3a,0xe3,0xb9,0x54,0xa7,0xca,0xfc,0x16,0x70,0x2a,0x91,0x87,0x1c,0x2c }, { 0x6e,0x67,0x99,0x76,0x1e,0x15,0x79,0x30,0xfd,0x32,0x9f,0x81,0x91,0xa0,0x83,0xc6,0xd3,0x99,0xbf,0x0f,0xac,0xd5,0x86,0x9f,0xc5,0x9a,0xd3,0x4c,0x67,0xa7,0x5e,0x6c }, { 0x30,0xd5,0x64,0x99,0x1e,0x8b,0x78,0x8b,0x3e,0x27,0x61,0x40,0x58,0x4e,0x41,0x1b,0x40,0xa2,0xcb,0xa5,0xc6,0x6a,0x38,0xf1,0x6f,0xdf,0xa6,0xb4,0x22,0xaf,0xaa,0x71 }, { 0x70,0xa6,0x93,0xf5,0x03,0xa2,0x00,0x0f,0xa5,0x3f,0x0a,0x98,0x10,0x3a,0xc2,0xc8,0x30,0x04,0x7e,0x88,0xa6,0x1c,0xd9,0xc6,0x74,0x04,0xd0,0xe2,0xf1,0x36,0x6a,0x17 }, { 0xbd,0xa2,0xec,0x17,0x87,0xda,0x8e,0xcc,0x23,0x34,0x01,0x26,0xb5,0x8e,0x25,0xd0,0x6f,0x4f,0x24,0xc2,0x03,0xfe,0x12,0xc9,0x97,0xa0,0x94,0x81,0xa8,0xe2,0x2d,0x0e }, { 0x25,0xf1,0x9f,0x49,0xb3,0xc2,0x17,0x34,0x9d,0x1c,0x56,0xfb,0xa5,0xfb,0x01,0xa5,0xed,0x4e,0xec,0xc6,0x83,0x12,0xe7,0xd4,0x29,0xee,0xc2,0xc2,0xb2,0x1a,0x9e,0x4c }, { 0x33,0x1c,0x81,0x26,0xbb,0x5b,0x15,0xd7,0x5a,0x64,0x46,0x2c,0x9c,0x09,0xa8,0x84,0x57,0x13,0xb1,0x49,0x74,0xee,0x9c,0x61,0x21,0x33,0x36,0x26,0xe2,0xd7,0xb5,0x0e }, { 0xaa,0xb0,0x7c,0x63,0xff,0x89,0x3a,0x8a,0x86,0x31,0xd9,0xea,0xb6,0x09,0x48,0x2d,0x1d,0x9b,0x51,0x5a,0x98,0x95,0x33,0x13,0xd4,0x50,0xc8,0x40,0x94,0xb5,0x53,0x0e }, { 0x06,0xc4,0xae,0x12,0x5a,0x8c,0xf6,0xb5,0xa4,0xf9,0x0e,0x72,0xc7,0x5c,0x40,0xe8,0xbc,0x27,0x0e,0x6b,0x6d,0xca,0xba,0x2b,0x19,0xe5,0x80,0x11,0xac,0x4a,0xc8,0x1a }, { 0x91,0xcd,0xf6,0x17,0x85,0x2c,0xa0,0x1f,0xc1,0x2a,0x08,0x69,0x20,0xc1,0x26,0xac,0x87,0x46,0x47,0xd1,0x26,0xec,0x68,0xcb,0x87,0x0c,0x57,0xa1,0x15,0xea,0x18,0x6d }, { 0x19,0xfa,0x34,0xd6,0xfb,0x3c,0xd7,0x4a,0x11,0xcf,0xfd,0x66,0xc2,0x69,0xc1,0x68,0x6d,0x6a,0x62,0xca,0xa2,0x6f,0xff,0x9f,0xe3,0x69,0x6a,0xde,0xd9,0x72,0x8c,0x21 }, { 0x23,0x6d,0x74,0x08,0xd9,0x04,0x9d,0xc5,0x10,0x96,0xb1,0xe9,0x9b,0xe6,0x11,0xa4,0x02,0x4a,0xe1,0x02,0xc6,0x7b,0x84,0x52,0x91,0xf4,0xa8,0xdd,0x0b,0x97,0x6f,0x30 }, { 0xd1,0x29,0x37,0x66,0xb5,0xdd,0xca,0x9a,0xaa,0x27,0x3a,0x41,0x85,0xe6,0x14,0x39,0xc5,0x03,0x0b,0x86,0x87,0xa3,0x31,0xb8,0x8a,0xf0,0x8e,0xa5,0xd9,0x96,0x6a,0x06 }, { 0x70,0xa9,0xad,0x37,0xd7,0xd9,0x84,0x4f,0x27,0x22,0x6d,0xe3,0x0a,0x01,0x90,0xff,0x6a,0x86,0x6b,0xaf,0x5b,0x2c,0xa4,0x6e,0x29,0x61,0x0e,0xd2,0x54,0x7a,0x70,0x3f }, { 0x12,0x17,0xe9,0x90,0x68,0xd4,0x97,0xbe,0xde,0x77,0xd8,0x0d,0xf8,0xfa,0x12,0x58,0x37,0xd3,0x2c,0x78,0xeb,0x32,0xde,0xf6,0x1e,0x30,0x30,0xce,0xd3,0xd5,0xda,0x7d }, { 0x1c,0x92,0xad,0x3f,0x32,0xa3,0x52,0xbe,0xbf,0xb7,0x64,0x1d,0x9d,0x9b,0xb4,0x20,0x08,0x89,0x65,0x3d,0xbd,0x2d,0xfc,0x09,0x20,0xef,0x1e,0xcf,0xdc,0x4a,0x3b,0x65 }, { 0x77,0xb9,0xdf,0xea,0xe8,0x3a,0x16,0x0d,0xe9,0x20,0xf9,0xf8,0xff,0xf6,0xa9,0x4d,0x67,0xd6,0x0e,0x6a,0xf6,0xdc,0x28,0x8a,0xd4,0x12,0xcd,0xa3,0x0c,0xad,0xd7,0x6b }, { 0x5d,0x34,0xbf,0xf2,0x60,0xd1,0xb4,0x31,0xd0,0x3f,0x37,0x10,0x4f,0xf9,0xb6,0x52,0xf6,0x7d,0x74,0xed,0x90,0xc3,0x89,0xbe,0xf5,0xf2,0x32,0x4f,0x01,0xca,0x5b,0x49 }, { 0x85,0xdb,0x65,0xd4,0x14,0x0b,0xd5,0x7f,0x93,0x5f,0xe1,0x24,0x30,0xe2,0xc7,0x78,0x96,0xb4,0x83,0x2d,0x85,0xa7,0x01,0x0d,0x71,0x90,0x42,0xc5,0x0c,0xc9,0xb6,0x56 }, { 0x49,0x39,0xd1,0xab,0xd9,0x34,0x16,0x23,0xdf,0xf4,0x25,0x56,0x07,0xf3,0x31,0xcb,0xed,0x76,0xbe,0x12,0x70,0xb4,0xab,0x6e,0xb3,0x43,0x93,0xfd,0xac,0xab,0x65,0x22 }, { 0xcd,0x94,0x1f,0xb8,0x8b,0x98,0xfa,0xcb,0xfa,0x72,0x00,0x03,0xf8,0xd5,0xaf,0x11,0xa0,0xfc,0x24,0x2a,0x9d,0x99,0x75,0x13,0x80,0xa5,0x67,0xb7,0x6f,0x35,0x72,0x0f }, { 0x0a,0xa8,0xcb,0x6c,0xad,0x0c,0x1e,0x17,0x39,0x69,0x75,0x6a,0x71,0x0a,0x18,0x40,0xf4,0xbf,0xfd,0x27,0x6a,0xb6,0x2b,0x97,0x55,0xcd,0xca,0x2e,0xe1,0x4c,0x30,0x2c }, { 0x07,0x5b,0xe6,0x2f,0x9b,0xc4,0xd9,0xe3,0x4a,0x94,0x16,0x24,0x1e,0xcf,0x96,0x6e,0x9f,0xa3,0xa7,0x6e,0x68,0x32,0x32,0xef,0x08,0xef,0x40,0x46,0x0c,0x9b,0x7d,0x3b }, { 0xe2,0x01,0x62,0x02,0x82,0x4e,0xa1,0x8a,0xea,0x03,0x00,0x6f,0x4e,0xd6,0x84,0xac,0xf7,0xc6,0xbe,0x7e,0x38,0x3e,0x59,0x21,0x95,0x58,0xcc,0xa8,0x21,0xd3,0x84,0x54 }, { 0xb4,0x1b,0xdf,0x72,0x6e,0x1d,0xe6,0x35,0xf7,0x79,0x28,0x65,0xb1,0x8d,0xeb,0xd2,0x21,0xb4,0xb2,0x64,0x65,0x63,0x98,0xa3,0x0e,0xf3,0xb5,0x52,0x2c,0xbe,0xf2,0x77 }, { 0x78,0x1e,0xeb,0x48,0x36,0x14,0xe1,0x85,0xd3,0xd9,0x12,0x45,0xf6,0x03,0x68,0x3a,0xa7,0x40,0x16,0x9c,0x8c,0xd1,0x5d,0xcf,0x05,0x0a,0x1b,0xd7,0x3e,0x1d,0x17,0x6b }, { 0xff,0x26,0x53,0x18,0xa6,0xf1,0x83,0x4e,0x41,0x1a,0xcc,0x0a,0x01,0x3a,0xea,0x11,0xe3,0x6f,0xad,0x48,0xe0,0xab,0x3c,0xe2,0xc1,0x83,0x33,0x27,0x53,0x6e,0xd1,0x70 }, { 0xdb,0x04,0x14,0xac,0x21,0x70,0xcf,0xe4,0x5a,0x12,0x36,0x9c,0x07,0x4e,0x9f,0xae,0x64,0x37,0x04,0x67,0x7d,0x54,0x16,0x6a,0x06,0xda,0xac,0x0e,0x4f,0xe2,0x07,0x2b }, { 0xbc,0x8c,0x7f,0x97,0x0b,0x84,0x9a,0xe6,0xcf,0xf2,0xa0,0xb7,0xb0,0x71,0x52,0xc7,0xf5,0x97,0x0d,0x12,0x39,0x34,0x25,0x51,0x19,0xaf,0x5c,0xd4,0x73,0x76,0x9b,0x01 }, { 0x7b,0x80,0xae,0x2b,0xd9,0x36,0x8f,0x36,0xcb,0x7a,0x00,0xb5,0xbf,0xa5,0xba,0x66,0xc5,0xec,0xca,0xce,0x57,0x3e,0xac,0x20,0x49,0x68,0x17,0x5c,0xf9,0xe0,0xb2,0x79 }, { 0x1e,0x23,0x59,0xf3,0xa4,0xe4,0x1e,0x8d,0x38,0x0b,0xf5,0x9b,0x00,0xb3,0x48,0x2e,0xd1,0x26,0x1a,0xf4,0x44,0x48,0xe5,0x54,0xaa,0x1a,0x0a,0xca,0x5b,0x21,0x77,0x05 }, { 0x96,0x42,0x1d,0x0f,0x6c,0x80,0x63,0xed,0xe2,0x36,0xd0,0x8d,0x8a,0x90,0x3d,0x1b,0x31,0x40,0xdb,0xc1,0xda,0x11,0xf7,0x9b,0x48,0x9d,0xaf,0x40,0x04,0x18,0xe7,0x3a }, { 0x17,0x01,0xd1,0x34,0xb6,0xec,0xf1,0xb4,0x5c,0x06,0x41,0xe8,0xd3,0x55,0x44,0xd0,0xe1,0xa6,0x12,0x5c,0x4f,0x58,0x51,0xc6,0xa0,0x36,0x32,0x18,0x02,0xed,0x7e,0x15 }, { 0x0b,0x87,0x37,0xef,0xac,0x5f,0xcd,0x28,0x44,0x00,0x96,0x21,0xe9,0x41,0x95,0xe7,0x60,0xde,0xd7,0x6f,0x0e,0x73,0x48,0xb1,0x05,0x9a,0x1b,0xd4,0x38,0x94,0x75,0x79 }, { 0x25,0xa5,0xf0,0x4e,0x98,0x31,0x31,0x2d,0x97,0x30,0xd2,0x7f,0x12,0xfa,0x5f,0x66,0x4c,0xa3,0xa2,0x8e,0x8b,0x98,0xec,0xe6,0xb6,0x90,0xf6,0xad,0x74,0xcd,0x4d,0x32 }, { 0x7d,0xbb,0xaf,0x41,0xbe,0xa5,0x8d,0x50,0xef,0x81,0xab,0xca,0x6c,0x3a,0x48,0xc4,0xf3,0xd4,0xed,0x41,0x74,0x14,0x34,0xe1,0x15,0x2c,0x0b,0x2d,0x7c,0x22,0x67,0x1f }, { 0x7e,0xcf,0xa5,0x25,0xcf,0x23,0x7b,0xfd,0x1b,0xfe,0xef,0x21,0xcd,0x34,0x80,0x7a,0xae,0x81,0x39,0x6e,0xd8,0x6d,0xf4,0x4d,0x73,0xce,0xfb,0xd3,0x19,0xf1,0x72,0x73 }, { 0x95,0xfd,0x98,0x6b,0xc3,0x24,0x8e,0x9e,0x4b,0x61,0x16,0x4a,0xb9,0xf0,0x0f,0xf7,0x09,0x31,0xb9,0x41,0x42,0xa0,0xec,0xe3,0x17,0x1b,0x6f,0x3b,0x5c,0x02,0xd2,0x0f }, { 0x40,0x62,0x30,0x73,0x99,0x39,0x3c,0x8f,0x4c,0xa3,0x13,0xfc,0x7c,0x3d,0x03,0x25,0x1c,0xb5,0x7e,0x83,0xab,0x4e,0xfd,0xfe,0x38,0x99,0x01,0xa9,0x32,0x46,0xb8,0x66 }, { 0xe2,0x1b,0xa0,0x85,0x29,0xd0,0x8c,0x31,0x5e,0x5e,0xf8,0xb4,0xdc,0x69,0x33,0x13,0xb3,0x72,0x9e,0x36,0xe8,0x16,0x66,0x5e,0x29,0xfa,0xc0,0x9e,0xf1,0x0f,0xf0,0x1c }, { 0x7a,0x50,0x09,0xec,0x6f,0x95,0x91,0x78,0x6c,0x47,0xde,0x89,0x2a,0x8d,0x42,0xc5,0x46,0xf3,0xeb,0x20,0x0c,0x38,0x77,0x11,0xd8,0x18,0xb5,0xcf,0xc7,0xe2,0x92,0x27 }, { 0xcd,0xd8,0x08,0x86,0x86,0x39,0x90,0xb6,0x7b,0xd4,0x7a,0x33,0xb9,0x73,0x22,0xcc,0xd4,0x9f,0x60,0x55,0xdc,0xf1,0xd3,0xe7,0xfd,0x58,0x04,0xd6,0x7b,0x70,0xa5,0x75 }, { 0x7f,0x20,0x88,0xcb,0x94,0xd0,0xee,0x31,0x14,0x24,0xe9,0xb0,0x73,0x98,0xae,0x97,0x46,0x3d,0xa4,0x99,0x90,0x6b,0xc2,0xa8,0x8a,0xf0,0x81,0x9b,0x8d,0xb6,0x47,0x75 }, { 0x72,0x14,0x93,0x6a,0x4a,0x4d,0x68,0x88,0x91,0xab,0x66,0x9b,0x9f,0xbf,0xf7,0x81,0x1f,0x0a,0x85,0xb8,0x7f,0xfe,0xc0,0x39,0x36,0x56,0x7b,0x7c,0x81,0x2e,0x81,0x34 }, { 0xc7,0x30,0x48,0xf3,0x9e,0x32,0xd7,0xc6,0x9a,0x4e,0x0c,0x16,0xde,0xa7,0xcf,0x34,0x30,0xfc,0xd5,0x0e,0x01,0x9f,0xfe,0x8a,0x1c,0x28,0xe4,0x83,0x2d,0xc8,0x23,0x49 }, { 0xbe,0x79,0x17,0xf1,0xe9,0x45,0x00,0x11,0xaa,0x93,0x7a,0x3a,0x39,0xa0,0xe6,0x06,0x15,0xe0,0x00,0xe5,0xdc,0x32,0x3f,0xfb,0x24,0xe4,0xba,0x34,0x28,0x6d,0x26,0x1f }, { 0x2c,0xfc,0x3f,0x3a,0x4b,0xc6,0x54,0xa8,0x49,0x7b,0x02,0x2a,0xd5,0x26,0x05,0x45,0x90,0x9d,0xf2,0xda,0xf4,0x83,0xb8,0xbc,0x04,0xe6,0x90,0x80,0xf6,0x7a,0x7a,0x34 }, { 0xd8,0x8c,0x25,0x58,0xdc,0x46,0x29,0xd5,0xe7,0x77,0x54,0x63,0xeb,0xb1,0xb3,0x9e,0x31,0xb4,0x3a,0xf7,0xcd,0x34,0xa8,0xf8,0x4e,0x44,0xa7,0xe5,0x82,0xa3,0xf9,0x40 }, { 0x38,0x88,0x70,0xe8,0xdd,0x48,0xaf,0xf9,0x8a,0xd2,0xd7,0x8e,0x70,0xab,0xcf,0x78,0xfe,0x01,0xa0,0x0d,0xc7,0x75,0x6d,0x57,0x48,0x6b,0xfe,0x09,0x30,0x4b,0x8e,0x13 }, { 0x5f,0xb7,0x4a,0x2f,0x8a,0x3c,0xeb,0x84,0x0c,0x0a,0xde,0x07,0xe5,0x5f,0x5f,0x46,0x21,0xf9,0xf9,0xaf,0x21,0x4d,0x63,0x0c,0xf3,0xc2,0x5f,0xc2,0xc4,0xd7,0xf1,0x11 }, { 0x37,0x0e,0xbf,0x83,0x86,0x1b,0xde,0x52,0xb7,0x0a,0x28,0x3e,0x26,0x7f,0x4a,0x89,0xac,0x48,0x0c,0xc9,0x66,0x30,0x9c,0xb6,0x8e,0x5a,0x25,0x79,0xda,0xd5,0x63,0x4e }, { 0xfb,0xc5,0x15,0x0e,0x65,0x75,0x1c,0xbf,0xd0,0x87,0xb9,0xe5,0xc2,0xa3,0x76,0x22,0xcd,0x03,0xab,0x7b,0x34,0x74,0x18,0x7b,0x54,0xca,0xab,0xc9,0x67,0x3b,0x72,0x6e }, { 0xf5,0x03,0x2a,0x75,0x1f,0x2f,0xa2,0x31,0x93,0x4e,0xf0,0x66,0x02,0x73,0xd6,0xae,0xc8,0x9f,0xf6,0xb7,0x22,0x23,0x2a,0x7f,0x1a,0xe9,0x23,0x89,0x53,0xb2,0xd4,0x35 }, { 0xe0,0x72,0x08,0x0f,0xfc,0x79,0x53,0xb8,0xeb,0x0d,0x15,0x7c,0x22,0x26,0xba,0x13,0xe8,0xbe,0xa6,0x36,0x37,0xbc,0xdc,0xe8,0x18,0x45,0x45,0x8f,0xd3,0x34,0xb9,0x33 }, { 0x87,0x85,0xc7,0x3e,0xc4,0x03,0xf7,0x7b,0x19,0x58,0x95,0x5e,0xed,0xeb,0xfd,0xf3,0x96,0xa2,0xa3,0xe5,0x2b,0x90,0x16,0x4c,0xa1,0xa6,0x47,0x1c,0xe1,0xc9,0x0a,0x60 }, { 0xa6,0x84,0x17,0x38,0xe9,0x81,0xef,0xd5,0xce,0x42,0xdf,0x84,0xd7,0x81,0x1c,0xeb,0xd2,0x92,0xe7,0x74,0x19,0x15,0xf0,0x25,0x59,0xd1,0x46,0xe1,0xd9,0x0a,0x1e,0x2d }, { 0x31,0xdb,0x98,0xef,0x5e,0x6c,0x6b,0x10,0xcc,0x68,0xb2,0x97,0x66,0xe2,0x7e,0xc7,0x16,0xb1,0x1c,0x2e,0x84,0xaf,0xb0,0xb2,0xdc,0x19,0xd6,0x3d,0xbe,0xc2,0xec,0x1b }, { 0x1c,0x67,0x9b,0xaf,0xf2,0x92,0x69,0x43,0x06,0x34,0xed,0xae,0xf6,0xc0,0x8c,0x81,0x8c,0xd2,0xa6,0x97,0xaa,0x0c,0x3b,0x63,0x9b,0xb7,0x64,0xbe,0x6e,0x89,0x15,0x6c }, { 0xc2,0x0c,0x8a,0x23,0xbf,0xf9,0x34,0xe0,0x95,0xa9,0x4e,0xc3,0xf8,0x4c,0x61,0x7a,0xdd,0x4b,0x91,0x8f,0x95,0xc8,0x22,0x84,0xa6,0xbf,0xb5,0x34,0x10,0x92,0xac,0x4b }, { 0xe9,0x35,0xf4,0xff,0xe2,0x33,0x7b,0xa0,0xd4,0x08,0x6f,0xc4,0x43,0x0e,0xa1,0x0b,0x4d,0xf0,0x14,0xcb,0xb0,0x46,0x65,0x12,0x68,0x72,0x2a,0x44,0xf5,0xe3,0x88,0x2b }, { 0x8f,0xda,0xd7,0xc0,0x19,0x6b,0xbd,0x2c,0xf2,0x65,0x23,0x6d,0x02,0x88,0xf7,0x95,0xb8,0xfd,0x8b,0xa7,0x5a,0x94,0xc0,0x3a,0xc0,0xdd,0x27,0x34,0xfd,0x25,0xa9,0x5e }, { 0xa1,0x20,0x92,0x8e,0x8d,0x38,0xa1,0x0c,0xc6,0x51,0xd6,0x28,0x26,0xe7,0x38,0x37,0x18,0x4d,0x4f,0xc2,0x06,0x42,0x1c,0x6c,0x74,0xf8,0xe3,0xfd,0xf8,0xa4,0x45,0x17 }, { 0xd4,0x89,0xb3,0x49,0x38,0x18,0xcd,0x59,0x85,0xe0,0x50,0xa9,0xb8,0xf5,0x47,0xd3,0x04,0xea,0xd7,0x1a,0x0e,0x92,0x19,0x6f,0x0d,0xcf,0x1d,0x25,0x1f,0xe1,0xe5,0x48 }, { 0xa1,0x17,0xb7,0xcb,0x84,0xe2,0x04,0xe7,0xed,0x20,0x1c,0x82,0x67,0xd2,0x82,0x65,0x5e,0xa8,0xe9,0x94,0x22,0x51,0xac,0x04,0xfa,0x5d,0xb2,0x59,0xc3,0x1d,0xda,0x48 }, { 0xde,0x2f,0xd8,0xd1,0xfe,0x02,0xf7,0xc0,0x44,0xfb,0x44,0x07,0x43,0x4e,0x98,0xfe,0xa3,0x79,0x9a,0x33,0x64,0x01,0x43,0xaf,0x9b,0xab,0x94,0xc3,0xee,0x82,0xbd,0x6e }, { 0xc8,0x85,0x03,0x7e,0x45,0x82,0x04,0xac,0x35,0xbe,0x4e,0xef,0x9c,0x07,0xe2,0x76,0xf3,0x7d,0x03,0x4f,0xec,0x35,0xa4,0x37,0xcd,0x19,0x33,0x19,0xc3,0x56,0xf8,0x06 }, { 0xbb,0xa5,0x35,0x5b,0xe7,0x3d,0xb2,0x32,0x23,0xfb,0xf5,0x75,0x73,0x63,0x10,0xee,0xf5,0xb8,0x63,0x52,0x97,0xdd,0x64,0x12,0x14,0x83,0xf7,0x5d,0x05,0xbe,0x5d,0x77 }, { 0x6a,0xe7,0x8c,0x73,0x96,0x82,0x73,0x54,0xd7,0x69,0xd3,0x70,0xa0,0xfe,0xc0,0xf1,0x68,0x85,0x49,0x67,0x53,0x26,0x6e,0x35,0x31,0xd4,0x71,0x4d,0xbe,0x55,0xb3,0x24 }, { 0xf9,0xe0,0x1b,0x11,0x76,0x2b,0xd4,0x76,0x21,0xae,0x19,0x78,0xd1,0x55,0x16,0x67,0xcc,0xb1,0xcc,0xb8,0x68,0x13,0x1f,0x00,0xf5,0xca,0x12,0x46,0x6d,0x05,0x61,0x33 }, { 0x0c,0x62,0x13,0x9a,0x0f,0x55,0x40,0xd2,0x33,0x69,0xaa,0xa2,0x71,0xc3,0xf1,0xad,0x11,0xfe,0xff,0x73,0x08,0x69,0x82,0x9f,0x41,0x0d,0x38,0xb8,0x6b,0x82,0x29,0x12 }, { 0xfe,0xd0,0x80,0xa2,0x58,0x66,0xdf,0x61,0x54,0x38,0x70,0x07,0x3c,0xe2,0x3e,0xb5,0x96,0x6b,0x4e,0xda,0xfe,0x15,0x96,0xb1,0x6c,0xc3,0x96,0xc3,0x84,0xc2,0x64,0x7a }, { 0xba,0x0b,0x92,0xef,0x62,0x24,0x75,0xe1,0xab,0x69,0x8f,0x71,0x6a,0x65,0x02,0xf3,0x72,0xfa,0x37,0xba,0x97,0x22,0xd3,0x8b,0x51,0x8c,0xbf,0xc0,0x2d,0xd6,0xb2,0x27 }, { 0x96,0x1e,0x1b,0x00,0x6d,0xf4,0xb1,0x6b,0xc2,0x3c,0x23,0xb4,0xc0,0xdc,0x25,0x00,0x03,0x30,0x0d,0xfe,0xc4,0x2b,0x64,0x1d,0xe4,0x12,0xef,0x31,0xce,0xb6,0xeb,0x59 }, { 0x0e,0xd0,0x49,0x47,0x73,0xbf,0x3c,0x7d,0x9e,0xf1,0x66,0x28,0x17,0x9c,0x55,0xa1,0x61,0xcb,0x69,0x9f,0xd4,0xed,0x44,0x69,0xaf,0x39,0x37,0xc7,0x46,0xb3,0x21,0x49 }, { 0xdc,0x1f,0x97,0xba,0x62,0x0d,0x73,0x49,0x93,0xa5,0x80,0x78,0x79,0x99,0x5b,0x54,0x9e,0xd9,0xd5,0x1e,0x5d,0x5d,0x95,0x16,0x9f,0xb9,0x82,0xc9,0x82,0x5d,0xc1,0x53 }, { 0x5f,0x3a,0xe8,0x08,0x9a,0x85,0x40,0x6d,0x74,0x8a,0xc7,0xfb,0xf0,0x10,0xb6,0x84,0xc7,0x34,0x41,0x77,0x75,0x34,0x6e,0x0c,0xef,0x65,0x40,0xb1,0x62,0x5b,0x1f,0x07 }, { 0x11,0x14,0x7c,0x95,0x3e,0xe9,0xa2,0x9b,0x1d,0x4f,0x19,0x2c,0xfd,0xf5,0x65,0x7d,0x48,0x2b,0x45,0xf6,0x3d,0x8a,0x31,0xfe,0xe0,0xaa,0x6b,0x31,0x85,0x35,0xdc,0x23 }, { 0x20,0x42,0xc3,0xa1,0xd6,0x6a,0xb2,0xc7,0xcb,0xa6,0x71,0xb4,0x82,0xe1,0x8e,0x9f,0x29,0x3a,0x5e,0x0d,0x2a,0xeb,0x9a,0x17,0x48,0x85,0x5a,0x38,0x56,0xfc,0x35,0x7c }, { 0x71,0xea,0x4a,0x4b,0xf1,0xcf,0x3a,0xf2,0xc7,0x5d,0xcd,0xb1,0xc6,0xf9,0xd3,0xe5,0x79,0xf8,0xb7,0x51,0x4b,0x1f,0xa1,0x40,0xfd,0xe1,0x3f,0x0e,0x64,0xc4,0x9c,0x71 }, { 0x68,0xae,0x94,0x4e,0x3f,0xbf,0x6a,0x99,0x7f,0x97,0x15,0xa0,0x2b,0x11,0xc7,0xc2,0xf3,0x38,0xa6,0xae,0x6b,0x12,0x44,0xe3,0xdc,0x5d,0x16,0x67,0x74,0x76,0xeb,0x42 }, { 0xf0,0xaa,0x8e,0x0c,0x39,0x0e,0xee,0x39,0x0d,0x52,0xd1,0x4f,0xec,0x4d,0x62,0x69,0x98,0x48,0x2c,0xb4,0x1f,0x04,0xa8,0xa2,0x7c,0xb2,0x46,0x7d,0xa9,0x15,0x2f,0x6e }, { 0xa8,0xda,0x18,0x99,0x28,0x82,0xdb,0x96,0x67,0x95,0xef,0x37,0xea,0x97,0x79,0x5c,0x9c,0xe5,0xdd,0x1c,0xf7,0xd4,0xe7,0x73,0x74,0xdb,0x3f,0xd2,0x54,0xa7,0x07,0x7c }, { 0x19,0xf3,0x33,0x40,0x8a,0x11,0x8b,0xbb,0xf8,0x3f,0xc7,0x8c,0x2e,0x02,0x8b,0x67,0x0d,0x90,0x22,0xf7,0x9a,0x01,0x7f,0xe5,0x05,0xdf,0x13,0x77,0xf3,0xfd,0x60,0x3a }, { 0x25,0x8f,0x3e,0xaa,0x41,0x4a,0x8c,0x45,0x39,0x39,0x15,0x57,0xd1,0xc8,0x60,0x5c,0x05,0x72,0x3c,0x14,0x2f,0x80,0x02,0x63,0x0b,0xf4,0xd3,0x22,0x78,0xfb,0x03,0x5c }, { 0x26,0x22,0xec,0x21,0x5b,0x20,0x22,0x12,0xc5,0x8e,0xb8,0xec,0xdb,0x9e,0x8d,0x0b,0xff,0x0b,0x19,0x3c,0x9f,0x05,0xbe,0x13,0x1d,0xa5,0x71,0x66,0xce,0x50,0xaf,0x3f }, { 0x92,0xc6,0xca,0x59,0x75,0x46,0x50,0x35,0x8a,0x7f,0x74,0x13,0xf5,0xc5,0xe0,0xf5,0x74,0x62,0x77,0x10,0xa5,0x8a,0x95,0x16,0xd9,0xd4,0x8a,0x4e,0xd3,0xa5,0xca,0x51 }, { 0x61,0x17,0x1a,0xf5,0x67,0x79,0xf8,0xc0,0x6e,0xef,0xfc,0xe4,0x8a,0x08,0x1c,0xec,0x70,0x22,0xb9,0x14,0xe8,0xee,0xb5,0xee,0xd3,0xf1,0x55,0xd0,0x30,0x53,0xe7,0x23 }, { 0x5d,0x7d,0x9c,0xa5,0x2a,0xf7,0x72,0x2a,0xe9,0xd0,0x0d,0xda,0xaa,0x84,0x85,0x28,0xf4,0xff,0xc4,0xb0,0x8e,0x5f,0xae,0xf6,0x20,0xd6,0x41,0x4a,0x7c,0xe2,0x64,0x10 }, { 0x4d,0x78,0xf3,0x0b,0xf2,0xfd,0xe3,0xaa,0x3f,0xb4,0x5d,0x57,0x38,0x6a,0x09,0xad,0x8e,0xa9,0x89,0xf8,0xf0,0xfe,0xe0,0xa9,0x1a,0x5e,0x6f,0xbe,0x86,0xaf,0x13,0x18 }, { 0xe4,0x24,0x17,0x05,0x5d,0x25,0x20,0xae,0x2e,0x56,0xf9,0x06,0x6e,0x4f,0x7f,0xab,0xb8,0x69,0xa1,0xd6,0x9a,0xc6,0x3d,0x26,0x39,0x0f,0x84,0x6f,0xf6,0xfb,0x1f,0x21 }, { 0x38,0x25,0xd5,0x9e,0xc4,0x6d,0xe3,0xe2,0x9e,0x45,0x50,0x47,0x2e,0x2e,0xbc,0x5e,0x05,0x1f,0x31,0xaf,0x0f,0x67,0xe7,0x52,0xc3,0x7f,0x7f,0x37,0xa7,0xf2,0xef,0x42 }, { 0x67,0xf1,0x26,0xe8,0xfc,0xd0,0x97,0xbe,0x74,0xbf,0xfb,0x3f,0x13,0x54,0x87,0x08,0x39,0x88,0x57,0x7c,0x0c,0x8e,0x54,0x55,0x92,0x1e,0x12,0xf5,0x61,0xde,0x26,0x23 }, { 0x70,0x90,0x9d,0xf5,0xe7,0x0e,0x17,0xc0,0xdc,0x0b,0x37,0xd8,0x58,0xd0,0x77,0x89,0xd7,0x64,0xec,0xd1,0x7f,0x1b,0x6b,0x96,0x29,0x63,0x7f,0xaf,0xa2,0xf8,0x97,0x4e }, { 0xb2,0x8d,0x4a,0x7a,0xaf,0x85,0xbf,0xa5,0x29,0x72,0x23,0xa0,0xcc,0x09,0xad,0x01,0x3b,0x3b,0x59,0x31,0x2d,0x86,0x1e,0x92,0xb6,0xc5,0x6e,0xe7,0xaf,0x9d,0x4c,0x1d }, { 0xa8,0x75,0x30,0x95,0x6d,0x85,0x9d,0xd2,0xd7,0x6e,0xc6,0x88,0xc1,0xbc,0x36,0x24,0x9a,0xb2,0x50,0xcd,0xa7,0x45,0xff,0xe2,0x17,0xb0,0x0e,0x3e,0x48,0x46,0x22,0x5e }, { 0xfe,0xd6,0xb6,0x2d,0x3a,0xd5,0x6f,0x3f,0x6a,0x92,0x5a,0x6c,0x97,0xdd,0x62,0x49,0xde,0x27,0xbf,0x2c,0x4f,0xbe,0x3d,0xe9,0x6b,0x3d,0xd1,0x02,0xb9,0x86,0x28,0x69 }, { 0x81,0x44,0x04,0x84,0xb4,0xa2,0xbb,0x64,0xe9,0x58,0x25,0x0f,0x6a,0x3c,0xc0,0xea,0x55,0x9b,0x0c,0xdc,0x88,0xee,0x55,0xc3,0x26,0xe3,0x10,0xc0,0x68,0xdb,0xfd,0x0b }, { 0xd5,0x50,0x20,0x79,0x86,0xf2,0x01,0xe3,0xec,0x13,0x47,0xf9,0x67,0x43,0x9a,0x8a,0x36,0xd4,0x47,0x6a,0x65,0xa9,0x7c,0x23,0x79,0x1a,0xc0,0x97,0x51,0x68,0xed,0x5e }, { 0xd6,0x64,0xd7,0x43,0x2f,0x76,0xcd,0x58,0xdc,0x47,0xe5,0x12,0xd9,0x67,0xe5,0xe5,0xea,0xb9,0xb8,0x3d,0xad,0x48,0x82,0x5f,0x55,0x1b,0xd7,0x51,0x8b,0xd9,0x5c,0x40 }, { 0x79,0x3c,0x76,0x47,0x03,0x5a,0x74,0x27,0xce,0x63,0x0b,0xb1,0xa8,0x27,0x1b,0xa2,0x2a,0xbd,0xe5,0x6e,0xba,0x7f,0xf9,0x7a,0x79,0x14,0x18,0x0d,0x1e,0x55,0xca,0x71 }, { 0x0d,0xa9,0xe8,0xcf,0x31,0x54,0x67,0x4a,0xf5,0xec,0xd1,0xff,0x02,0xf1,0x16,0x6e,0xc7,0x59,0xa8,0x37,0xac,0x4a,0xb7,0xe2,0x7f,0xb0,0x3d,0xb9,0x96,0xf5,0x8f,0x46 }, { 0x11,0x4c,0x26,0xb2,0xd9,0x49,0x73,0x9c,0x4e,0xa2,0x90,0x57,0x59,0x96,0x27,0x8b,0x49,0x57,0x67,0xbe,0x5f,0x7b,0x15,0xea,0xe5,0x09,0x73,0x16,0xfd,0x21,0x1c,0x0b }, { 0x3e,0x24,0x29,0x6d,0x65,0x98,0xc3,0xd3,0x68,0x95,0xf6,0x0b,0xec,0xe2,0x19,0xd7,0x9c,0x77,0xb9,0x0b,0xf1,0x92,0xab,0x3d,0x41,0x58,0xec,0xd0,0x30,0xf6,0x51,0x27 }, { 0xfa,0xd2,0xe4,0x1f,0x54,0xf2,0xaf,0xb0,0x19,0x0b,0x4b,0x29,0xd1,0x1a,0x84,0xa5,0x5f,0x69,0x66,0x59,0xa4,0xb2,0x03,0x74,0xe1,0x46,0x81,0x75,0x38,0x8c,0x7f,0x32 }, { 0x41,0x0e,0x63,0x5f,0xa3,0x9c,0x86,0x64,0x91,0x1e,0x2a,0x6c,0xc3,0x7d,0x1e,0x6b,0x15,0x4c,0x54,0x64,0x57,0x69,0xa8,0x15,0x01,0x37,0xc5,0xba,0xf2,0xe1,0x52,0x19 }, { 0xee,0x67,0x56,0x4d,0x15,0x40,0x67,0x32,0x2d,0x3d,0xfd,0x5b,0x29,0xf4,0x65,0x06,0xd8,0x21,0x27,0x4e,0xcf,0x5f,0xfd,0x37,0x2f,0xdc,0x3f,0x42,0x85,0xce,0xc3,0x08 }, { 0xd1,0x94,0x7b,0x09,0xb2,0xdd,0xc3,0x3f,0xfc,0xad,0x6d,0x3d,0xa1,0xe8,0x38,0x1d,0xb0,0x47,0x1a,0x50,0x4f,0x5d,0x30,0x1e,0x49,0xd4,0xc5,0x9d,0x39,0x8f,0x1f,0x47 }, { 0x8b,0x31,0x7f,0x50,0x1e,0xbd,0xe1,0xbe,0x17,0x6b,0x8e,0xa5,0x6e,0x02,0x42,0x7e,0x0d,0xb9,0x08,0x78,0xba,0x09,0x8b,0xc5,0xff,0x64,0xde,0x59,0xaa,0x23,0x5f,0x43 }, { 0xa5,0xff,0x46,0xb0,0x15,0xc2,0xb4,0x66,0x38,0x5e,0x02,0xe1,0x9e,0xf9,0xa1,0xd3,0x1d,0x46,0x9d,0xa5,0x4c,0x8e,0xc4,0x92,0x5a,0x29,0x4d,0x46,0xd8,0xf2,0xe0,0x68 }, { 0xf1,0x6b,0x4b,0xec,0x9e,0x8d,0x46,0xb4,0xb8,0xda,0xec,0x57,0x35,0x4b,0xde,0x9e,0x67,0xb3,0xdd,0xac,0x5f,0x63,0x7c,0xb6,0xf4,0x9f,0x27,0x02,0xa6,0x02,0x59,0x21 }, { 0xf0,0x70,0x11,0x80,0x7f,0x09,0x79,0x97,0xb3,0x8c,0x33,0xb1,0xaa,0x24,0xbe,0x27,0x07,0xa8,0x8a,0xf2,0x89,0x31,0xf8,0x0d,0x81,0x6d,0x8e,0xb2,0xa1,0x75,0x04,0x55 }, { 0x53,0xad,0xaa,0xa1,0x1f,0xe6,0x29,0x82,0xa7,0xbb,0x4b,0xc3,0x6d,0x03,0x0a,0x68,0x9a,0x86,0xbd,0x93,0xee,0xc0,0xdf,0x4c,0x08,0xbc,0xc3,0x37,0x84,0x2f,0x26,0x01 }, { 0xd7,0x71,0xe8,0xbc,0x57,0x53,0x65,0x66,0x4a,0xe8,0x8f,0xda,0x9b,0xd3,0xf9,0xa9,0xe4,0x09,0x4c,0xdb,0x86,0x06,0x82,0x13,0x68,0xf9,0x1e,0x1a,0xf8,0xc0,0x66,0x6c }, { 0xd2,0x73,0x30,0xc3,0xc3,0x97,0xe8,0x44,0x0a,0x9d,0x73,0xd2,0xec,0x3c,0xbf,0x16,0x23,0x55,0xed,0xc3,0x7e,0x4c,0x41,0xe4,0x37,0x00,0xb4,0xa9,0xab,0x74,0xd0,0x5d }, { 0x47,0xa6,0x59,0x5b,0x59,0x3e,0xa7,0x4b,0x0e,0x51,0x8c,0x77,0xb5,0xa2,0x2f,0x6e,0x03,0x23,0x35,0xe9,0xc7,0x46,0x35,0x2c,0xca,0xe2,0x73,0x25,0xe6,0x67,0xec,0x0b }, { 0xb0,0x9e,0x1d,0x45,0xbe,0x2f,0x0c,0x6e,0x13,0x52,0xae,0xe2,0x6d,0xe1,0x3d,0xb7,0x9f,0x58,0x8a,0x9b,0x8f,0xa7,0x1b,0x2f,0x60,0x8f,0x53,0x0f,0x1e,0xb9,0xaf,0x63 }, { 0x15,0xe7,0x42,0x02,0x3d,0x87,0x92,0xed,0x6a,0xe5,0xb7,0x45,0x70,0xf1,0x35,0xfc,0xff,0x5d,0xc9,0x7c,0x19,0xdc,0x34,0xd2,0x5c,0x06,0xc3,0xc5,0xeb,0xb0,0x88,0x08 }, { 0xa0,0x5c,0xb2,0xa1,0x83,0xb8,0x25,0xb2,0xba,0x28,0x01,0x14,0xdb,0x08,0xf5,0xc4,0x47,0x33,0x79,0x64,0xdd,0x11,0x26,0x2e,0x92,0x36,0xef,0xb6,0xa3,0xe2,0x42,0x42 }, { 0x06,0xe4,0x60,0x7b,0x75,0x63,0x99,0x41,0xa8,0x71,0x3b,0xfd,0x54,0xa4,0x8b,0x81,0x54,0x9d,0x49,0x5e,0x73,0x36,0xcc,0xda,0xb8,0xa6,0x52,0x69,0x95,0x01,0x48,0x35 }, { 0x84,0x09,0x4e,0x31,0xfa,0x6d,0x0c,0x01,0x68,0x39,0x85,0x81,0x9c,0x77,0x19,0xa0,0x19,0x64,0x26,0x57,0x0a,0xa6,0x8a,0x90,0xba,0x09,0x7a,0xf8,0xbe,0xfd,0x85,0x23 }, { 0x07,0x55,0x4a,0x94,0x80,0xbf,0x2a,0x85,0x98,0x6d,0x81,0x09,0xd0,0xa5,0x73,0xca,0x66,0xe8,0xe5,0x10,0x39,0x3d,0x2e,0xe8,0x51,0x18,0xbc,0xed,0x68,0xa2,0x9e,0x15 }, { 0x41,0x04,0xd6,0xe2,0x1e,0xd1,0x56,0x3d,0x09,0x8f,0x75,0x69,0x55,0x71,0x23,0xda,0xe5,0x95,0x90,0x56,0x7a,0x7f,0x0b,0x79,0x1c,0xc1,0x57,0x13,0x56,0x60,0xf3,0x34 }, { 0xad,0x33,0xd5,0xe2,0xc1,0xfe,0xa5,0x70,0x8f,0x72,0x03,0xd7,0x59,0xa3,0x82,0x6f,0x3d,0xf7,0xb1,0xfe,0x73,0xfc,0x7d,0x74,0x93,0xbe,0xa6,0xa0,0x4f,0xb5,0xd1,0x54 }, { 0x09,0x85,0x94,0x14,0xf1,0x95,0x4b,0xc0,0x0a,0x94,0x42,0xea,0xc5,0xa1,0x7a,0x26,0x3d,0x86,0x6c,0x18,0x8f,0xb6,0xe0,0xaa,0x81,0x78,0xb1,0x92,0x24,0xb2,0x1b,0x72 }, { 0x9a,0x7c,0x39,0x3f,0x85,0x13,0x7b,0x3e,0xe5,0x12,0x7b,0x6b,0x3c,0x25,0x17,0x90,0x88,0xef,0x8a,0x10,0x98,0x43,0xe2,0x9f,0xcf,0xe9,0xb9,0x51,0x71,0xc3,0xf2,0x1a }, { 0x49,0x32,0xf0,0xf4,0x4d,0xf2,0x22,0x0c,0xa0,0x3e,0xa3,0x80,0x22,0x2b,0xdc,0xbd,0x01,0xfc,0xe7,0x3a,0xdf,0xa3,0xc5,0x8f,0x9a,0x5c,0x23,0xd2,0xb6,0x31,0x4b,0x6c }, { 0xd6,0xc8,0xdc,0x97,0xed,0x56,0x3d,0xef,0x3a,0x02,0x90,0x6a,0x78,0x5a,0x59,0x9e,0x4d,0x8b,0xf7,0xca,0xe2,0x0d,0x58,0x32,0x9c,0x99,0x42,0xb9,0xe8,0xe0,0xf4,0x06 }, { 0x3a,0xe2,0x99,0xc2,0x6a,0xf6,0x43,0x9e,0x2d,0x48,0x7f,0x5d,0x22,0xd1,0xf8,0x52,0x57,0x6f,0x2d,0xd3,0x97,0x17,0xf6,0xbd,0xd4,0xc8,0x06,0xbf,0x39,0x67,0x93,0x2d }, { 0x3a,0x70,0x9a,0x8f,0x42,0x5a,0x83,0x7b,0xef,0x2e,0x35,0xb5,0x2d,0xcc,0x93,0xb2,0x8a,0x4f,0xca,0x0a,0xdd,0xe0,0x17,0x17,0x10,0xee,0x43,0x1f,0x4b,0xfc,0x86,0x75 }, { 0x99,0xa6,0xcb,0x7b,0x5d,0x12,0xa7,0x10,0x44,0x0d,0x17,0x7c,0x11,0x19,0x72,0xc4,0xe4,0xc2,0x26,0xaf,0x4b,0xd9,0xb4,0x4b,0x94,0x42,0xc5,0x24,0xd5,0x6d,0xf0,0x31 }, { 0xd7,0x36,0xb5,0xe5,0x8e,0x83,0x6b,0xbe,0x47,0x3b,0x2c,0xa7,0x31,0xc4,0xa2,0xfb,0x6f,0x0f,0xbc,0xb5,0x31,0x44,0xa4,0xf3,0x4d,0x9c,0x12,0x6f,0x36,0xb7,0x4b,0x77 }, { 0xe9,0xa3,0x3a,0x6f,0x01,0x13,0x6e,0x24,0x72,0xed,0x9e,0xca,0x68,0x76,0x56,0x45,0xc2,0x32,0xc5,0x58,0xe0,0xa5,0x83,0x5a,0x51,0x09,0x0f,0x40,0x0b,0x90,0xf7,0x56 }, { 0x51,0x0b,0x24,0x5c,0x76,0xf5,0x63,0x7e,0x5e,0x20,0x4e,0xd7,0x4a,0x39,0xcd,0x59,0x3d,0x6c,0xbe,0xfb,0x96,0x9c,0x17,0x42,0xaf,0x5e,0xc8,0x9b,0xa2,0xe8,0x93,0x3a }, { 0x42,0x12,0xda,0xbc,0x51,0xac,0x75,0x91,0xf7,0x8d,0xc8,0x65,0x02,0x1a,0x6f,0x2b,0xdf,0x4a,0x2c,0xf4,0xf5,0x50,0x82,0x58,0x16,0x75,0x4c,0x7b,0x69,0xa0,0x0c,0x6e }, { 0xa9,0xe9,0x83,0xb9,0x46,0x50,0x8a,0x24,0x9b,0xfd,0x1f,0x89,0x0a,0x18,0xbb,0x62,0xe0,0xcb,0x57,0xc6,0x18,0xcc,0xa8,0x34,0x8f,0x4e,0xc7,0xfc,0x46,0x2e,0xa3,0x20 }, { 0x7e,0x1e,0x93,0x61,0x51,0xf6,0xe5,0x17,0x14,0x7c,0x65,0x1a,0x07,0x8a,0xf6,0x4e,0x9d,0x66,0x11,0x6f,0x98,0x2b,0x40,0xb1,0x65,0x06,0x40,0x69,0x41,0xa9,0x6b,0x7f }, { 0x39,0xb1,0x4a,0xa1,0x97,0x89,0xcd,0xdd,0x96,0x46,0x48,0xd8,0x5f,0xef,0xb8,0x7b,0xd4,0xcb,0x53,0x42,0xe4,0x53,0x5f,0xcd,0xd4,0xf6,0xd6,0xc1,0x88,0x8f,0x48,0x1d }, { 0x2f,0xe5,0x7d,0xa3,0x47,0xcd,0x62,0x43,0x15,0x28,0xda,0xac,0x5f,0xbb,0x29,0x07,0x30,0xff,0xf6,0x84,0xaf,0xc4,0xcf,0xc2,0xed,0x90,0x99,0x5f,0x58,0xcb,0x3b,0x74 }, { 0x39,0xb1,0x4a,0xa1,0x97,0x89,0xcd,0xdd,0x96,0x46,0x48,0xd8,0x5f,0xef,0xb8,0x7b,0xd4,0xcb,0x53,0x42,0xe4,0x53,0x5f,0xcd,0xd4,0xf6,0xd6,0xc1,0x88,0x8f,0x48,0x1d }, { 0x2f,0xe5,0x7d,0xa3,0x47,0xcd,0x62,0x43,0x15,0x28,0xda,0xac,0x5f,0xbb,0x29,0x07,0x30,0xff,0xf6,0x84,0xaf,0xc4,0xcf,0xc2,0xed,0x90,0x99,0x5f,0x58,0xcb,0x3b,0x74 }, { 0x39,0xb1,0x4a,0xa1,0x97,0x89,0xcd,0xdd,0x96,0x46,0x48,0xd8,0x5f,0xef,0xb8,0x7b,0xd4,0xcb,0x53,0x42,0xe4,0x53,0x5f,0xcd,0xd4,0xf6,0xd6,0xc1,0x88,0x8f,0x48,0x1d }, { 0x2f,0xe5,0x7d,0xa3,0x47,0xcd,0x62,0x43,0x15,0x28,0xda,0xac,0x5f,0xbb,0x29,0x07,0x30,0xff,0xf6,0x84,0xaf,0xc4,0xcf,0xc2,0xed,0x90,0x99,0x5f,0x58,0xcb,0x3b,0x74 }, { 0x39,0xb1,0x4a,0xa1,0x97,0x89,0xcd,0xdd,0x96,0x46,0x48,0xd8,0x5f,0xef,0xb8,0x7b,0xd4,0xcb,0x53,0x42,0xe4,0x53,0x5f,0xcd,0xd4,0xf6,0xd6,0xc1,0x88,0x8f,0x48,0x1d }, { 0x42,0x2c,0x8e,0x7a,0x62,0x27,0xd7,0xbc,0xa1,0x35,0x0b,0x3e,0x2b,0xb7,0x27,0x9f,0x78,0x97,0xb8,0x7b,0xb6,0x85,0x4b,0x78,0x3c,0x60,0xe8,0x03,0x11,0xae,0x30,0x79 }, { 0x25,0xd7,0x28,0xb2,0xd4,0x1a,0x1d,0x0a,0xe0,0xf4,0x0e,0xe6,0xb5,0x69,0xe8,0x3c,0x01,0xb2,0x03,0x9a,0x56,0xb7,0x54,0x5a,0x93,0x63,0x22,0x8f,0x00,0x56,0x14,0x10 }, { 0x8d,0x20,0xf8,0xc7,0xbb,0xfb,0x9a,0xf3,0xda,0x4e,0xf5,0x32,0xed,0x44,0xef,0xc6,0x8c,0xe6,0x42,0xbc,0x5d,0x0c,0x5c,0xb1,0xd7,0xb9,0x1b,0x96,0xc7,0x4e,0xdf,0x02 }, { 0x28,0xbb,0xdf,0xad,0x41,0x7a,0x93,0xe3,0xe0,0x84,0x3b,0xab,0xf4,0x32,0x46,0xd3,0x26,0xaa,0x16,0x9b,0x27,0x89,0x6d,0x1c,0x16,0x76,0xa7,0xf9,0xee,0x71,0xa1,0x59 }, { 0x0f,0x52,0x4b,0xef,0x7e,0x12,0x25,0x8f,0xd9,0xee,0xfc,0xd9,0xe4,0x68,0xb2,0x1e,0x54,0x3d,0x90,0xcc,0x4a,0x54,0xb3,0x47,0xf4,0x8c,0xc5,0x96,0x9f,0xeb,0xf4,0x32 }, { 0xc8,0x14,0xe2,0xff,0x82,0xb7,0x8e,0x7f,0xaf,0xf9,0x27,0xcd,0xd3,0xb0,0xb4,0x2e,0xc8,0xf8,0x92,0x34,0x8d,0xee,0x2c,0xb4,0xf1,0xc1,0xc3,0x7a,0x64,0xb4,0xa7,0x6b }, { 0xaf,0x6c,0x6b,0xe0,0x37,0xcc,0x06,0x22,0xe8,0x8a,0x73,0x5a,0x98,0xf7,0x7a,0xc0,0x6f,0x37,0x2b,0xad,0x85,0x42,0xbc,0x0f,0x65,0xc0,0xc5,0x80,0xb0,0x95,0xae,0x4e }, { 0xe5,0x76,0xa1,0xa6,0xfe,0xc7,0x93,0x78,0xaf,0xb7,0xf1,0x91,0xac,0xda,0x33,0x96,0xad,0x56,0xf7,0x84,0xce,0x33,0x65,0x8e,0x96,0x7a,0xe9,0xe4,0x61,0x76,0xf7,0x27 }, { 0xa4,0xc3,0xe7,0x49,0x66,0x4d,0x13,0x8f,0x80,0xa1,0x34,0x88,0x89,0x87,0x23,0x44,0xc1,0x1a,0x86,0xe9,0x56,0x23,0xb1,0x5f,0x8d,0xb7,0xec,0xf8,0x3a,0xde,0xd9,0x27 }, { 0x78,0x74,0x53,0x5e,0xaa,0x3a,0x6b,0x9f,0x7f,0xa1,0xe6,0xd9,0xda,0xd1,0x21,0xa5,0xf3,0x99,0x24,0x83,0x55,0x7e,0x05,0xc3,0xb3,0x65,0xa6,0xaf,0x74,0xf7,0x4d,0x03 }, { 0x9e,0x34,0x3c,0x34,0x94,0x80,0x8b,0x3b,0x50,0x23,0x76,0x19,0xa9,0xd0,0xad,0xf9,0x09,0x03,0xe8,0x14,0x46,0x73,0x9a,0xc8,0x9e,0x4b,0x8a,0x8c,0x9d,0x80,0x6c,0x59 }, { 0xa5,0x6f,0x45,0x98,0x6e,0xbc,0x86,0x35,0x0c,0x98,0xfb,0xe1,0xaf,0x21,0x21,0x44,0x1b,0x0d,0x2c,0x17,0x34,0x14,0xd4,0x16,0xa6,0xff,0x00,0x14,0x15,0x0e,0x45,0x31 }, { 0x7d,0x5c,0xcc,0xae,0xa1,0x0a,0x82,0x2a,0xcb,0x99,0x0f,0x8e,0x7b,0xca,0xd8,0x3d,0x59,0x6b,0x5d,0x7d,0x2a,0x02,0xc9,0x1a,0x86,0x9c,0xe7,0x01,0x10,0x0d,0xbc,0x14 }, { 0x21,0xf6,0x48,0x7d,0x01,0x15,0x2d,0x72,0x5c,0xc6,0x43,0xf9,0xf5,0x9e,0x79,0xd2,0xfd,0xa0,0x22,0xad,0xd8,0xfc,0x66,0x1e,0xb7,0x9d,0xbf,0x90,0x30,0x0a,0xed,0x38 }, { 0xdb,0xf8,0xd6,0xe5,0xf0,0x51,0x92,0x77,0x84,0xd5,0x1b,0xb5,0xdc,0x45,0xa4,0xb9,0xb1,0x7d,0x36,0x71,0xce,0xfd,0x09,0xd1,0xa4,0xa0,0x6e,0xdb,0xea,0x51,0x14,0x25 }, { 0x05,0x22,0x89,0x13,0xd8,0xe4,0x79,0x86,0x6f,0x1f,0x37,0xe4,0x90,0x76,0x06,0xed,0x98,0x04,0x6b,0xb4,0xbe,0xdb,0x28,0x7e,0xae,0x2d,0x87,0x07,0xc1,0x2c,0x34,0x4c }, { 0xe0,0x33,0xbc,0xa7,0xa0,0x40,0x8c,0xde,0xba,0xe8,0xca,0x21,0x74,0xb5,0x76,0xc1,0x72,0xad,0xb7,0x7d,0x78,0xa5,0x68,0x6c,0x11,0x39,0x86,0x54,0x97,0xa2,0x4f,0x41 }, { 0x84,0x7c,0x0d,0x2c,0x37,0x52,0x34,0xf3,0x65,0xe6,0x60,0x95,0x51,0x87,0xa3,0x73,0x5a,0x0f,0x76,0x13,0xd1,0x60,0x9d,0x3a,0x6a,0x4d,0x8c,0x53,0xae,0xaa,0x5a,0x22 }, { 0xe0,0x33,0xbc,0xa7,0xa0,0x40,0x8c,0xde,0xba,0xe8,0xca,0x21,0x74,0xb5,0x76,0xc1,0x72,0xad,0xb7,0x7d,0x78,0xa5,0x68,0x6c,0x11,0x39,0x86,0x54,0x97,0xa2,0x4f,0x41 }, { 0x84,0x7c,0x0d,0x2c,0x37,0x52,0x34,0xf3,0x65,0xe6,0x60,0x95,0x51,0x87,0xa3,0x73,0x5a,0x0f,0x76,0x13,0xd1,0x60,0x9d,0x3a,0x6a,0x4d,0x8c,0x53,0xae,0xaa,0x5a,0x22 }, { 0xe0,0x33,0xbc,0xa7,0xa0,0x40,0x8c,0xde,0xba,0xe8,0xca,0x21,0x74,0xb5,0x76,0xc1,0x72,0xad,0xb7,0x7d,0x78,0xa5,0x68,0x6c,0x11,0x39,0x86,0x54,0x97,0xa2,0x4f,0x41 }, { 0x84,0x7c,0x0d,0x2c,0x37,0x52,0x34,0xf3,0x65,0xe6,0x60,0x95,0x51,0x87,0xa3,0x73,0x5a,0x0f,0x76,0x13,0xd1,0x60,0x9d,0x3a,0x6a,0x4d,0x8c,0x53,0xae,0xaa,0x5a,0x22 }, { 0xe0,0x33,0xbc,0xa7,0xa0,0x40,0x8c,0xde,0xba,0xe8,0xca,0x21,0x74,0xb5,0x76,0xc1,0x72,0xad,0xb7,0x7d,0x78,0xa5,0x68,0x6c,0x11,0x39,0x86,0x54,0x97,0xa2,0x4f,0x41 }, { 0x1c,0x18,0xa4,0x09,0x5c,0x2b,0x9f,0x76,0x78,0xc8,0xfb,0x23,0x84,0xea,0xb7,0xd4,0xfe,0x4f,0x78,0x8f,0x25,0x80,0xd6,0xbb,0x0e,0x06,0xcf,0x6e,0x13,0x12,0xf3,0x0b }, { 0xf1,0x32,0xe4,0x22,0x0c,0x71,0x0a,0xac,0xf5,0x61,0xbf,0x0f,0xc3,0x07,0x35,0xad,0x61,0xbc,0x84,0xb6,0x3e,0x90,0xd5,0xbf,0x54,0xcf,0x81,0xb5,0x62,0xea,0xda,0x42 }, { 0x2b,0x39,0x08,0x80,0xe7,0x24,0x4e,0x37,0x84,0xe3,0x04,0x73,0x09,0x50,0xe6,0x3e,0x91,0xf4,0xbe,0xec,0x78,0x66,0x70,0x54,0xcf,0x02,0x26,0xc5,0x88,0x0d,0xd3,0x2c }, { 0xf4,0x5b,0xce,0x45,0x30,0x25,0x5b,0x17,0x63,0x17,0xbb,0xf0,0x5b,0x0b,0x18,0xbc,0x8d,0xd6,0xbc,0x7a,0xbd,0x16,0x41,0x4e,0xbf,0xb9,0x06,0x1b,0xd6,0x2f,0x6f,0x19 }, { 0x1d,0x01,0xaa,0xc0,0xc7,0xe3,0x8f,0xfb,0x3e,0x25,0xee,0xc4,0x32,0x59,0xd8,0x56,0x29,0xbe,0xb4,0xc3,0xd9,0x4f,0x7f,0x38,0x13,0x8c,0xf9,0xca,0x97,0x82,0xeb,0x79 }, { 0x6c,0x9a,0x29,0xd1,0x8c,0x26,0x90,0x78,0xfd,0xed,0x27,0x34,0x60,0x8a,0xd1,0x98,0xa3,0x6c,0xe7,0x57,0x9b,0x7f,0xf8,0x62,0xa2,0xc5,0x15,0xf8,0x51,0xe1,0x1a,0x54 }, { 0x2c,0x52,0xe1,0x5e,0x14,0x31,0xf5,0x0e,0x88,0xdd,0x30,0x02,0x9f,0x56,0x34,0x23,0xc1,0xfa,0x53,0x0b,0xba,0xcb,0x9d,0xb6,0x23,0x46,0x0c,0xee,0xb0,0xf6,0x4b,0x63 }, { 0x04,0xd4,0x40,0x9f,0x02,0xa3,0xc9,0x7e,0x50,0x70,0x02,0xdc,0xe8,0xb8,0xee,0xc7,0x7f,0xac,0x1a,0xa1,0xba,0xeb,0x0f,0x25,0xec,0xa2,0x8a,0xc4,0xb6,0xa3,0xe6,0x25 }, { 0xf0,0x87,0x27,0xb3,0xb2,0x2f,0x2e,0xff,0xaa,0xc3,0x55,0x75,0xf2,0xea,0x0b,0x67,0xed,0x8c,0xa4,0x81,0x02,0x14,0x07,0xac,0xaf,0x46,0x63,0xdc,0x8d,0x8c,0xc3,0x7c }, { 0x49,0xe0,0x3c,0x89,0x4b,0xe3,0x3f,0x85,0xa2,0xbf,0xa5,0x65,0x30,0x39,0x3c,0x8d,0xd4,0x3f,0xea,0x89,0x77,0x1f,0x6b,0x13,0xf4,0x90,0x6f,0x42,0x91,0x57,0xd6,0x36 }, { 0xdf,0x01,0x8e,0xd9,0x9f,0x9a,0x8d,0xd5,0xdd,0x38,0x69,0x44,0xd3,0x9a,0x7b,0xd1,0xa6,0x0b,0x9e,0xc2,0x1f,0x65,0xcd,0xcc,0x74,0xd2,0x15,0x9e,0xa7,0xe7,0x84,0x3d }, { 0xf7,0x12,0x31,0x18,0x91,0xc1,0x3a,0x7f,0x16,0xb1,0x8f,0xab,0x7c,0x1b,0x20,0x9f,0x78,0x7f,0x99,0xf2,0x05,0x57,0x1b,0x8e,0x99,0x03,0xa2,0x96,0xe6,0xec,0xc0,0x56 }, { 0xcb,0xda,0x00,0xfe,0x5a,0xbe,0x61,0x68,0xc9,0x3e,0x68,0xce,0xa5,0x11,0x62,0xc0,0xbf,0x15,0xe1,0x71,0xb9,0x8e,0x36,0xd9,0x54,0x16,0xce,0x14,0xbd,0xf6,0xf6,0x5d }, { 0x04,0xd5,0xfe,0xbb,0xf9,0xa4,0xe5,0x49,0x0e,0x72,0x74,0x57,0xd7,0xb6,0xec,0xbd,0x02,0x21,0x19,0xa8,0x63,0xc9,0x95,0xe3,0xc5,0x80,0x2c,0xe6,0x37,0x4b,0x83,0x74 }, { 0x24,0x08,0x85,0x93,0x52,0x14,0x28,0x50,0x24,0xef,0xbf,0x83,0xc9,0x0d,0x51,0x53,0xb8,0x23,0x0a,0x46,0x5d,0x09,0x9f,0x67,0xe6,0x25,0xd8,0x57,0x06,0xf9,0x70,0x5e }, { 0x4d,0x16,0xaa,0x5d,0xde,0x81,0xbc,0xe7,0xf2,0xd7,0x5c,0x3e,0x6a,0xa9,0xc0,0x67,0x23,0x22,0x07,0xa2,0xd7,0x97,0x59,0xf7,0x17,0x90,0xb0,0xd9,0x41,0x4f,0xc4,0x6a }, { 0x8c,0xec,0x23,0xc6,0x8c,0x4f,0x98,0xb0,0xb8,0x73,0xc9,0x37,0xde,0xd1,0xb8,0xcf,0x4e,0x94,0x12,0x5f,0x8e,0x24,0x4e,0x29,0x05,0xbb,0xa4,0xc3,0x0e,0x80,0x39,0x1c }, { 0x8f,0x3f,0xa2,0xd6,0x13,0x25,0x1f,0x62,0x30,0x36,0x9f,0x9d,0xe1,0xe6,0xd2,0xf0,0x39,0x5a,0x8a,0xb6,0xcf,0x82,0x04,0xc0,0x9e,0x79,0x04,0x8b,0x43,0x29,0x68,0x4a }, { 0x5b,0xd9,0x99,0xc3,0xcc,0x16,0x23,0x21,0xdd,0xe3,0x64,0xc0,0x13,0xc0,0xa1,0x76,0x13,0x03,0x09,0x4c,0xf1,0xbc,0x84,0xa9,0xa1,0x02,0x81,0xc9,0xe3,0xaa,0xaf,0x0c }, { 0x4f,0x51,0x65,0x12,0x33,0xb3,0xf8,0xcd,0x48,0xdc,0x0d,0x09,0x55,0xe8,0x70,0xe2,0x94,0x9b,0x78,0x5c,0xa2,0x7b,0x1c,0x0f,0x37,0x4e,0x35,0xce,0x98,0x8b,0xc0,0x1d }, { 0x3c,0xf8,0xc7,0x4b,0x41,0xa7,0x0b,0xc1,0x41,0x81,0x3f,0xd3,0x1c,0xfd,0x36,0xc2,0x29,0x04,0xcd,0x62,0xec,0x01,0xc0,0xbf,0xe6,0xa6,0xeb,0xe6,0xa4,0x5c,0x1f,0x31 }, { 0xd0,0xa7,0xc1,0xf6,0xeb,0xbd,0xeb,0xcd,0x9e,0x56,0x1f,0x6c,0x12,0x20,0x9f,0x8f,0x5c,0x8c,0xf5,0x33,0xf5,0x30,0x86,0xb9,0x77,0x7d,0xf1,0x7c,0xe1,0x4f,0x2b,0x71 }, { 0x78,0xf8,0xf4,0xda,0x51,0xa8,0x45,0x68,0x60,0xa3,0x22,0xc0,0x2b,0xa5,0xc0,0xe9,0xdd,0x0c,0xbb,0x03,0x0f,0x3c,0x36,0x04,0x3e,0x32,0x77,0xd1,0xab,0xa5,0x61,0x71 }, { 0x19,0xc8,0x3a,0x7e,0xc0,0xce,0x1c,0x50,0x25,0xc4,0x68,0xab,0x40,0x8f,0x06,0xaa,0x1e,0xa6,0x35,0xbe,0x6b,0x66,0xf8,0xec,0xba,0xf4,0xfc,0x22,0x91,0x31,0x7d,0x3b }, { 0xc9,0x9d,0x33,0xdb,0xcd,0x7b,0x0b,0xbc,0xc2,0xe9,0xc9,0x96,0x13,0x94,0x5c,0x82,0x8d,0x05,0x0b,0x96,0xa7,0x60,0x52,0x6b,0xa1,0xcc,0x30,0xea,0xbf,0x37,0xea,0x16 }, { 0x33,0xaf,0x11,0x57,0x3f,0x60,0x22,0x18,0x06,0xf4,0x39,0xab,0x6b,0xf3,0xe2,0xdd,0xde,0x5d,0x2e,0xd7,0x59,0xb6,0x41,0x5e,0x86,0x21,0x9f,0x28,0xc7,0x2b,0x01,0x41 }, { 0xba,0x5e,0x80,0x3b,0x00,0x58,0xad,0xb0,0xef,0x58,0x67,0xcf,0x6a,0x09,0xe6,0xcc,0x7d,0xd3,0xe5,0x30,0x3c,0x7c,0x6a,0xbb,0x44,0x52,0x42,0x03,0x83,0xd0,0x98,0x38 }, { 0xf9,0x4b,0xa0,0x87,0x73,0x8b,0x21,0xf7,0x64,0x6a,0x1d,0xad,0x76,0x35,0x4a,0x5f,0x5a,0xd1,0xff,0x6d,0xc2,0xde,0xcd,0x6d,0x8a,0x22,0x7f,0x75,0xc5,0xe2,0x2c,0x1b }, { 0x3f,0x75,0x94,0xc2,0xfe,0x33,0x4d,0xa3,0x23,0x49,0xb4,0x51,0x2b,0x4a,0xa4,0xf7,0xb4,0xdc,0xc5,0xf3,0x9e,0xfd,0x8c,0xec,0xdf,0xe1,0xf5,0x55,0x2d,0xbe,0x13,0x5a }, { 0x80,0x17,0x67,0x7f,0xf2,0x49,0x5a,0x3d,0x20,0x0b,0x97,0x72,0x18,0x8a,0xd0,0xe5,0x3f,0xf9,0xfd,0xba,0x69,0xfa,0x64,0x53,0x8f,0x2e,0x24,0x05,0x60,0x66,0x39,0x42 }, { 0x1a,0xa3,0xcb,0xcd,0x4e,0x56,0xd6,0xa1,0x8d,0xd6,0x6e,0x01,0xe4,0x32,0x4a,0xfe,0xfd,0x8b,0x31,0x9d,0x78,0xb9,0x16,0x37,0xdc,0x90,0x06,0xcc,0xee,0x03,0x91,0x48 }, { 0x0b,0xe5,0x80,0x3a,0xfc,0x26,0x52,0xc5,0x7d,0x74,0x0f,0x85,0x9e,0x8b,0xaa,0x55,0x68,0x1a,0x47,0x2f,0x1f,0x71,0x5d,0xc6,0x0e,0x14,0x5e,0x99,0x22,0x7e,0x3c,0x67 }, { 0x1a,0x94,0xa1,0x95,0xe9,0x50,0x8c,0xdc,0x70,0x85,0x93,0x1a,0xcf,0x7c,0xf6,0x38,0xa7,0x78,0x36,0x4b,0x3f,0x54,0x1e,0xed,0x6e,0x7f,0xbd,0x64,0x60,0x20,0x6d,0x55 }, { 0xcf,0x2a,0x5c,0xd1,0x37,0x38,0xec,0xd6,0x0f,0x03,0x5e,0x0b,0xd1,0xbe,0x4f,0x5e,0x23,0x04,0xd7,0x09,0xf4,0xcc,0x19,0x39,0xf2,0x5c,0x56,0x2d,0x58,0x36,0xb5,0x52 }, { 0x8a,0xe0,0x9b,0xad,0x6c,0xb3,0x3c,0x83,0xaa,0x22,0x00,0xba,0xb7,0xd2,0x77,0x64,0x0f,0x6d,0xb4,0x50,0xd7,0xd9,0x2f,0x7c,0x27,0x79,0x52,0x63,0x94,0xd2,0x3b,0x29 }, { 0x73,0xc1,0x7c,0x41,0x03,0xb7,0x27,0x83,0x1d,0xc5,0xbe,0x14,0x0e,0x21,0x97,0x81,0x06,0xaf,0xab,0xf7,0x60,0x2d,0x40,0x65,0x50,0x18,0x16,0x3e,0xbe,0xe1,0xe0,0x0c }, { 0x13,0x16,0x3d,0x11,0xfa,0xd9,0x09,0x56,0x3d,0xea,0xee,0x72,0xee,0xe7,0x16,0xef,0x7b,0xf9,0x08,0x9d,0xd6,0xaf,0xd1,0x37,0xf4,0xcd,0x31,0x2e,0xcf,0x35,0x5d,0x49 }, { 0xf0,0xf1,0xf4,0xf8,0x39,0x98,0x66,0x4f,0x20,0x15,0x63,0xdb,0x12,0xd8,0xaa,0x42,0xc2,0x3b,0xc1,0xad,0x36,0xf6,0xa7,0xfd,0xe3,0x62,0xe7,0xe5,0xa5,0x3a,0xc8,0x36 }, { 0x79,0x8c,0x3f,0x22,0x0c,0xbf,0x99,0x55,0x71,0x14,0xbc,0x3f,0xba,0x6c,0xcd,0x20,0x43,0xa3,0xed,0x24,0x80,0x59,0x95,0x0b,0x33,0x44,0xeb,0x6a,0x7f,0x93,0x2f,0x23 }, { 0xcb,0x38,0xd9,0xbd,0x0e,0xb8,0x65,0xbb,0x01,0xde,0x7c,0xc7,0x6f,0x69,0x60,0x08,0x28,0x55,0xb2,0xec,0x74,0x51,0x4c,0x46,0x5e,0xb9,0x79,0x74,0xa3,0xb1,0xb4,0x40 }, { 0x89,0xd8,0xb2,0xff,0x9f,0xd2,0x7a,0xbe,0x37,0xc8,0x15,0x0c,0xc0,0xc6,0x98,0xdc,0x91,0x69,0x45,0x13,0x18,0x80,0x21,0x29,0x57,0x88,0x7d,0xd9,0xef,0xaf,0xa7,0x4d }, { 0xe7,0x13,0x88,0xb8,0x73,0x22,0xa5,0xe3,0x30,0x5a,0x34,0x12,0x3d,0xcc,0xeb,0xab,0xd2,0xf1,0x4d,0xea,0xbd,0xbb,0xe0,0xed,0x16,0x88,0x44,0x86,0xf5,0x01,0x52,0x23 }, { 0x9c,0x72,0x65,0x54,0x95,0x2e,0xee,0x6e,0x0d,0x62,0x5a,0x30,0x28,0x0c,0x78,0x20,0xd5,0xe9,0x99,0xcf,0x60,0x4e,0xc9,0xfe,0x2e,0xdb,0xf7,0xc9,0xf3,0x18,0x65,0x1e }, { 0x78,0xfd,0xcf,0xc5,0x8e,0xf5,0xf9,0xac,0x03,0x33,0xf0,0x33,0x83,0xba,0x95,0x5e,0x63,0x42,0xa3,0xe4,0x1b,0xe7,0x13,0x00,0x56,0x23,0x47,0x7d,0x8a,0x1c,0xf0,0x37 }, { 0xc0,0x0b,0xce,0x80,0x1d,0x0f,0xd0,0x90,0x69,0x03,0xc4,0x4d,0x87,0x40,0x87,0x05,0x79,0x48,0x6c,0x35,0x9a,0x35,0xd9,0x6c,0xbf,0xc5,0x8e,0xd9,0xd6,0x5f,0x6c,0x55 }, { 0x99,0xb2,0x8e,0xe5,0xfe,0x43,0x22,0xc7,0x87,0xa3,0x77,0x6d,0x5e,0xfb,0x4f,0xe6,0xc9,0x71,0xb4,0x40,0xd2,0xfa,0x59,0x35,0x8c,0x3b,0xdf,0x88,0x1e,0xef,0x69,0x5a }, { 0xc8,0x34,0xd5,0x94,0xf5,0x11,0xa6,0x6c,0x1b,0x1d,0x37,0x7d,0x64,0x9b,0xff,0xa9,0x0d,0x2d,0xf2,0x9e,0xc9,0xe5,0xf8,0xc8,0x72,0x60,0xc0,0x7b,0xbd,0xe0,0x81,0x7b }, { 0xb0,0x07,0xcb,0x85,0x56,0xa8,0x9a,0x1e,0x97,0x0e,0x3a,0x6f,0x6d,0x92,0x72,0x41,0x3a,0xba,0xe8,0xdc,0x1e,0xfc,0xb6,0xa5,0xc2,0x0c,0xa8,0x63,0xe0,0x89,0xc5,0x65 }, { 0x3e,0x57,0x80,0xa2,0x55,0x33,0x80,0x72,0xad,0x9a,0xc8,0xae,0x1b,0xf4,0x04,0xaf,0xd5,0xe7,0x07,0xc0,0xdd,0xa6,0x3a,0xb2,0xc8,0xf6,0xce,0x8b,0xb5,0x81,0x9d,0x1e }, { 0x9c,0x28,0xe6,0xc7,0x97,0x62,0xa0,0xcf,0x34,0xa5,0x4c,0x79,0x37,0x3e,0x79,0x8b,0x2c,0x2e,0x39,0x37,0x8b,0x65,0xb4,0x90,0x74,0x89,0xb8,0x0f,0x6e,0x4f,0x1e,0x3f }, { 0xe8,0x11,0x13,0xdd,0x23,0x1f,0x54,0xc8,0xe4,0xd1,0x28,0x55,0xb1,0x5f,0x9d,0xb3,0x38,0x68,0x97,0x0e,0x9b,0xcf,0x76,0xfa,0x08,0x74,0x56,0x30,0x30,0x06,0xc1,0x63 }, { 0xf2,0x44,0x87,0xa4,0x13,0x4d,0x55,0x9b,0x51,0x38,0x9f,0x02,0xda,0x1e,0xf4,0x8f,0x5a,0x90,0x4a,0x2f,0xdd,0x5a,0x6e,0xed,0x20,0x94,0xee,0x45,0x9e,0x64,0x36,0x32 }, { 0x09,0x09,0x6c,0xe1,0x96,0xa3,0x26,0x8c,0x3f,0x76,0x58,0x22,0xf5,0xd5,0x41,0xc3,0x7f,0x6a,0x98,0x13,0x2d,0x9f,0x41,0x88,0x98,0xf4,0xcb,0x6e,0x48,0x63,0x85,0x5c }, { 0x16,0xfb,0x11,0xd1,0x84,0x18,0x0f,0x05,0xf8,0x84,0x4d,0x19,0x37,0x86,0x6d,0x0d,0x89,0x68,0x47,0x47,0x55,0xdb,0x7a,0x7b,0x1a,0x47,0x54,0xc1,0x6c,0xfd,0x70,0x17 }, { 0x99,0x13,0xcc,0xd1,0x06,0x7e,0xf5,0x22,0x36,0xb5,0xc9,0x4f,0xbc,0x46,0xfa,0x6b,0x14,0x08,0x35,0x2a,0x69,0x1d,0x65,0x35,0x81,0x3e,0xa7,0xa9,0x98,0x78,0x0e,0x56 }, { 0x7c,0x9d,0x44,0x3c,0xee,0xb6,0x28,0x0f,0x2e,0x0d,0xf2,0x87,0x83,0x00,0x8d,0x0a,0x97,0xae,0x5f,0x0b,0x59,0xd0,0x8d,0xff,0x02,0x56,0x83,0xe7,0x08,0xe7,0x19,0x3d }, { 0x1c,0x56,0x21,0x8a,0xc1,0xc0,0xbe,0x47,0x7a,0x3b,0xdc,0xeb,0x3b,0xb3,0x54,0x75,0xcc,0x4c,0xb3,0xd8,0xcf,0x6d,0x0e,0xfa,0x97,0xdb,0xa8,0xc2,0x5b,0xe2,0x8f,0x3b }, { 0x5a,0x7d,0x39,0x2f,0xb3,0x17,0x79,0xdd,0x68,0xec,0x64,0xd3,0x89,0xb7,0x0f,0x05,0xe7,0x57,0x36,0xa3,0xd0,0x45,0xc3,0xbf,0x78,0x2d,0x51,0xd4,0x68,0xd9,0xc2,0x40 }, { 0x05,0xc4,0x90,0xfe,0xe1,0xd0,0x8b,0x1c,0x27,0xe8,0x68,0xd8,0x27,0x10,0xee,0x9e,0xfc,0x19,0xc5,0xda,0x96,0x87,0x35,0x60,0x27,0x36,0xe0,0xaa,0x2c,0xba,0x1f,0x0d }, { 0x84,0x99,0x64,0xc1,0x23,0x3f,0x4e,0xc8,0x0b,0x61,0x5a,0x7c,0xfa,0x94,0xc8,0xba,0xe0,0xd0,0x00,0x3d,0xc6,0x53,0x92,0x07,0x54,0x0a,0x03,0x9b,0xfa,0x5a,0x57,0x39 }, { 0xd9,0x47,0x32,0xdf,0x95,0xe0,0xf8,0xe1,0x6b,0x5e,0xfa,0xb6,0xbf,0xa0,0x8f,0xaa,0x80,0xad,0x3f,0x1e,0xa1,0x3c,0x3a,0xeb,0xa1,0x50,0xa9,0x89,0x87,0x30,0xa6,0x7f }, { 0x8c,0x27,0x13,0x5e,0xf8,0x8e,0x05,0x28,0x2b,0x34,0x11,0x80,0x8c,0xfc,0x5f,0x85,0x09,0x51,0xf3,0xe9,0xab,0x6e,0xca,0xda,0x4e,0x02,0xcb,0xf2,0x3f,0x3e,0x79,0x02 }, { 0x22,0xa4,0x01,0x66,0x79,0x81,0x02,0x65,0xdc,0xce,0xe3,0x21,0x0a,0x3f,0x52,0x46,0x5f,0xf3,0x7c,0xd3,0xe6,0xb8,0x0c,0x1e,0x5e,0xda,0x5d,0xb1,0xb5,0x77,0xa0,0x47 }, { 0xcc,0xea,0xb8,0x7f,0x45,0xfe,0x0d,0x35,0xb0,0x02,0xcc,0x79,0xe6,0x0b,0x26,0x22,0x9b,0xdf,0x93,0xe0,0x99,0x5e,0xfb,0x73,0x4a,0xba,0x8b,0xb2,0xcd,0x38,0x95,0x38 }, { 0x33,0x6d,0x5d,0xa3,0xd0,0x0f,0x71,0x81,0x36,0x64,0x1f,0x6b,0xc4,0xb4,0x75,0xb9,0x6d,0xbb,0x8e,0x38,0x7a,0x04,0x81,0xef,0x64,0x02,0x99,0x45,0x80,0xd4,0x83,0x6b }, { 0x50,0x46,0x01,0x09,0xa2,0x85,0x6f,0x6c,0xfd,0x04,0xc0,0x76,0xae,0xed,0xea,0x5c,0xe5,0x29,0x85,0x48,0xa6,0x3a,0xc6,0xb5,0x18,0x01,0x11,0x19,0x67,0xd8,0xa5,0x08 }, { 0xde,0x7c,0x1c,0x5c,0x7c,0x81,0xbd,0x92,0x23,0x93,0xde,0x07,0x4f,0x52,0x3d,0x48,0x99,0xbf,0xbb,0x88,0x93,0x7c,0x49,0x7f,0x1b,0x41,0xee,0xb6,0xc3,0xd2,0xaf,0x62 }, { 0x0d,0x98,0x4d,0xf1,0x84,0xeb,0xd1,0xd8,0x58,0x2e,0x5f,0x97,0x31,0xbd,0x2c,0xdc,0x2b,0xcc,0x3d,0xd6,0x59,0xdb,0x21,0x45,0x61,0x57,0x25,0x12,0x6c,0x05,0x92,0x1c }, { 0x1a,0x23,0xac,0x3f,0xe1,0x20,0xc7,0x3a,0x33,0x02,0x83,0xcb,0x50,0x66,0x3a,0xb4,0x87,0x85,0xb9,0xd1,0x7f,0x7f,0xbf,0x9d,0xdc,0x4c,0x0c,0x4b,0x20,0x91,0xf9,0x06 }, { 0x88,0xff,0x40,0x77,0x59,0x19,0xb1,0x25,0x8c,0xb7,0x04,0x1c,0x05,0x33,0x46,0xee,0x99,0xb0,0x45,0x24,0x60,0x97,0x31,0xaf,0x86,0xa4,0x99,0x9e,0x70,0x19,0x49,0x0c }, { 0x2e,0x4a,0xe6,0x4d,0x98,0x3e,0x61,0x35,0xb0,0x71,0xf3,0x5d,0xf1,0xb4,0x16,0x4f,0xe6,0xb8,0x2d,0x02,0xf7,0xd6,0xa4,0x43,0x90,0x2c,0x28,0xfc,0xda,0x42,0x95,0x4b }, { 0x65,0xfa,0x48,0x29,0x75,0xa2,0x6f,0x4b,0x7f,0xbf,0x37,0xde,0x89,0x0b,0xa9,0x8c,0xc3,0x0b,0x32,0x2c,0x60,0x40,0xda,0xb1,0x97,0x7e,0x0b,0xca,0x3e,0x34,0xf5,0x1d }, { 0xce,0xab,0x4e,0xac,0x72,0x86,0xd8,0xd7,0xa6,0x64,0x4e,0x92,0x91,0x56,0x81,0x3b,0xc7,0x71,0x6f,0x30,0x8e,0xec,0x2f,0x7a,0x8c,0x81,0x9e,0x4b,0x2f,0xa4,0x6f,0x02 }, { 0x8b,0xa4,0x48,0xc6,0x24,0x26,0x9a,0x73,0x90,0x6c,0x33,0xa2,0xc1,0x40,0xbc,0x06,0xb8,0x01,0xd3,0x09,0x52,0xd8,0xdb,0xbb,0x78,0xa5,0xfa,0xf8,0x2a,0x98,0xa3,0x69 }, { 0xfd,0xe8,0x59,0xe0,0x14,0xda,0x34,0x5b,0xed,0xe3,0x7c,0x08,0x9a,0xd5,0xe2,0x5d,0x29,0xda,0x2e,0x7e,0x93,0x13,0xd7,0xc0,0x35,0xac,0xf9,0x3f,0xee,0x56,0xf4,0x7d }, { 0x09,0x19,0x7e,0xbb,0x7b,0xab,0x01,0xc0,0xa8,0x0a,0xcd,0x40,0x3f,0x89,0x34,0x85,0xed,0x1b,0x3d,0xbc,0x98,0xb4,0x11,0x73,0x3b,0x26,0x76,0x17,0xe4,0xc7,0x3f,0x25 }, { 0x42,0xb7,0x5f,0x25,0xf4,0x18,0xd1,0xb5,0x8d,0x81,0xbd,0xff,0xc6,0x50,0xb7,0x2a,0xde,0xf3,0x3b,0x93,0x1f,0x31,0x1a,0x87,0xb7,0xd6,0x52,0x3d,0xc7,0x30,0x58,0x25 }, { 0x5a,0xa4,0x2b,0xd6,0x01,0x06,0x58,0x46,0xbd,0x6d,0x8d,0xb1,0xd4,0xa8,0x47,0x74,0x16,0x8e,0x1d,0xcd,0xf1,0x11,0x2f,0xfd,0xc8,0x6d,0x46,0x38,0x52,0xd0,0xf8,0x5c }, { 0x2e,0x1c,0x3d,0x7b,0x9e,0xc5,0x6f,0xf9,0xee,0x7a,0xd6,0x23,0x6e,0xd6,0x4e,0xb3,0x92,0x2a,0x36,0x66,0x38,0x02,0xac,0x74,0x99,0xa4,0xc1,0x4f,0x35,0x0b,0x4c,0x5d }, { 0x69,0x9e,0x2d,0x4a,0xa3,0x69,0xc9,0x50,0x91,0xeb,0x4b,0xee,0x0c,0xf9,0x12,0xf6,0x29,0x05,0x77,0x5a,0x70,0xd4,0xf6,0x85,0x66,0xe2,0xad,0xe3,0xff,0xac,0xb9,0x14 }, { 0x08,0x67,0xf4,0x61,0x2f,0x58,0xf0,0xe1,0x3c,0x3d,0x6c,0x15,0x66,0x22,0x68,0xda,0xb0,0xe3,0x3a,0x05,0x91,0x22,0x52,0x25,0x58,0x36,0xf2,0x8f,0x3a,0xc0,0x25,0x4f }, { 0x72,0x40,0xcd,0x93,0x03,0xb0,0x0e,0x12,0xdc,0x07,0x16,0x91,0x1a,0x12,0xe2,0xbb,0x00,0x3c,0x6f,0x6f,0xbf,0xb0,0x0c,0x1e,0xc2,0x4e,0x0f,0xec,0xeb,0x23,0x8c,0x45 }, { 0x21,0xea,0x0b,0x55,0x9f,0xb9,0x73,0xe6,0xe0,0x14,0x8f,0xae,0x2e,0xdc,0xec,0x8f,0x1f,0x5c,0x8b,0x7d,0xc3,0x1e,0x7b,0xab,0x3d,0x1e,0xb7,0xe9,0x6f,0xa7,0x9b,0x10 }, { 0x26,0xbd,0x5a,0x9c,0x33,0x73,0x35,0x09,0x7b,0xd1,0xc8,0xdf,0xa0,0xaf,0x03,0xc6,0x5a,0xee,0x5d,0xf2,0xa9,0x3f,0x14,0x7f,0xee,0x1d,0x06,0xb3,0x3a,0xfe,0xd6,0x30 }, { 0xcb,0xb6,0x0f,0x43,0xff,0x3d,0xb8,0xc4,0x1e,0x60,0xbe,0x88,0x9d,0x30,0x95,0x93,0xb4,0xf2,0x9b,0x4b,0x17,0x60,0xf4,0x14,0xb8,0xa1,0x22,0x2f,0x71,0xa8,0xde,0x2b }, { 0x7b,0xab,0x4f,0x7b,0x96,0x44,0xb3,0xa0,0x8c,0xc3,0x69,0x56,0x37,0x23,0x7b,0x50,0xc0,0xcc,0x38,0x9e,0x0b,0x75,0xfd,0xb6,0x56,0xb5,0x9a,0x55,0x48,0x4d,0x1b,0x7b }, { 0x24,0xa6,0x5f,0x6e,0xc5,0xfc,0x80,0xe2,0xa6,0x5d,0xd1,0x12,0x49,0x3c,0x77,0x4b,0xf4,0x98,0x63,0xfe,0x3b,0x16,0x89,0x03,0x1c,0xbd,0x40,0xa3,0xe0,0x63,0xf3,0x55 }, { 0x6b,0x95,0xde,0x82,0x50,0x6f,0xac,0xa0,0x65,0x36,0xf6,0xe2,0xf7,0xfd,0xa6,0xd0,0xa1,0xba,0xad,0x8d,0x5e,0xa4,0x13,0x7d,0xec,0xbd,0x7b,0x91,0xfd,0x7d,0xde,0x50 }, { 0x35,0xfd,0x92,0x37,0x66,0xce,0x1a,0x64,0x42,0x66,0xfd,0x82,0x25,0x76,0xc1,0xbd,0xf8,0x19,0x15,0xa5,0xfa,0x74,0xae,0x90,0x0b,0x94,0xea,0x60,0x5a,0xa3,0x51,0x5a }, { 0x4d,0x92,0x56,0x24,0xd1,0xb9,0x3a,0x0c,0x16,0x4a,0x07,0x16,0xe7,0x7c,0x10,0xb9,0xfe,0x61,0xd4,0x8b,0xb8,0x50,0x22,0xb1,0xbd,0xdf,0x19,0xbf,0x42,0x7a,0xd8,0x0b }, { 0xca,0xb8,0xe5,0x03,0x68,0xee,0x1f,0x1e,0x1b,0x58,0x6a,0xe2,0x19,0x55,0x3c,0x46,0x75,0x1a,0xec,0xb7,0xfc,0xc6,0xb2,0x3f,0x9f,0x54,0x07,0x44,0xa6,0x5a,0x23,0x31 }, { 0x8b,0x0d,0x45,0x80,0xad,0x80,0x9a,0x4c,0x29,0x90,0xcf,0xcc,0x7a,0x55,0x62,0x6c,0x8e,0xac,0x2e,0xec,0xc2,0xb6,0x68,0x77,0x94,0xed,0x85,0xaa,0x8d,0x70,0x21,0x2e }, { 0x77,0xb0,0x51,0x61,0xe7,0x65,0xfb,0xb3,0xbf,0xe4,0xd4,0xaf,0x32,0xfb,0xd9,0xfa,0xfe,0x3b,0x07,0x01,0x17,0x8b,0xbd,0xdd,0x71,0x15,0x3b,0xe2,0xf0,0xd7,0x00,0x25 }, { 0xb5,0x36,0x45,0x6c,0x82,0x5f,0x2f,0x57,0xa1,0x14,0x0d,0x76,0xc2,0x87,0x53,0x6a,0x70,0x8c,0xd6,0x9a,0x3c,0x7f,0x78,0x9f,0x5b,0x26,0xa7,0xa6,0xc0,0x3b,0xde,0x67 }, { 0xcb,0xb3,0x91,0x3b,0x12,0xb4,0x13,0x85,0xca,0x5b,0x9c,0x30,0x29,0x7d,0xc1,0x2c,0x6f,0x5c,0xba,0x2a,0x6d,0xc1,0x92,0x26,0x0d,0x5d,0xeb,0x01,0x7d,0xa9,0xe9,0x54 }, { 0xf5,0x45,0x8c,0x2c,0x90,0x7e,0x09,0xcd,0x34,0xb4,0x62,0x59,0x8c,0x1c,0xd2,0x6d,0xb5,0xd9,0x64,0xea,0xad,0xcf,0x07,0xed,0x4e,0xb5,0x81,0x6e,0x07,0x35,0x76,0x3b }, { 0x60,0x20,0x58,0xa1,0x70,0x1a,0x07,0xfa,0x38,0xa8,0x56,0x42,0x7c,0x09,0xec,0x2b,0x14,0xab,0x8f,0x99,0xc1,0xef,0xb2,0x1f,0xb7,0x39,0xf5,0xfc,0xe3,0xf4,0x84,0x6d }, { 0xd8,0x29,0x4f,0x38,0x93,0xdb,0xb8,0xca,0x85,0xe0,0x45,0xab,0xa2,0xe4,0x6b,0x88,0x49,0x62,0x6f,0x1f,0x6f,0x1d,0xab,0xea,0x81,0xd1,0xf8,0x38,0x39,0x8e,0xab,0x55 }, { 0x94,0xdd,0xfe,0xfc,0xa5,0x60,0x39,0xca,0x6f,0xe3,0x0f,0xb6,0xb0,0xf9,0xc2,0x6e,0x6e,0x52,0x5a,0x59,0x04,0x83,0xc4,0x56,0x59,0x43,0x88,0x00,0x5f,0xfe,0x9d,0x46 }, { 0xd7,0xcc,0xf3,0xc4,0x63,0x63,0x3a,0xa3,0x82,0x89,0xbc,0x55,0xe9,0x78,0x17,0xbc,0xef,0xfc,0x8f,0x31,0x0c,0x9f,0xc3,0xde,0xa9,0xc6,0x0d,0x11,0x8b,0x36,0x3c,0x6d }, { 0x63,0x1c,0x64,0xf1,0x1b,0x9b,0xf2,0xb0,0xad,0xcb,0x9a,0x97,0xa4,0x7f,0x04,0xf0,0x02,0xf2,0x9d,0x10,0x32,0x16,0xfe,0x85,0x9f,0xee,0x74,0x76,0xd8,0x39,0xd3,0x2b }, { 0xcb,0x44,0xeb,0x34,0xa6,0x07,0xe2,0x95,0x2b,0x7a,0xbe,0x5a,0xbf,0xdc,0x5f,0xc5,0xa8,0x4d,0x29,0x7b,0xe8,0x27,0x3b,0xa9,0xa2,0x20,0x07,0xf0,0x98,0x10,0x0c,0x56 }, { 0x4b,0xd4,0x30,0x8b,0x91,0xb6,0x25,0x22,0x88,0x4d,0x08,0x49,0xbc,0x6b,0xad,0x93,0xbd,0xbb,0x7f,0x51,0x11,0x71,0x61,0x44,0x37,0xad,0x7c,0xc3,0x85,0xb1,0x8a,0x4e }, { 0xc6,0xfc,0x9f,0x0f,0x4d,0xc3,0x5d,0xcc,0x27,0x36,0xd5,0x2c,0x63,0x87,0x5b,0x0d,0x15,0x9a,0x04,0x4a,0x73,0x96,0x35,0xf7,0x00,0x98,0xd8,0x8c,0x2c,0x84,0xb6,0x55 }, { 0xb7,0xdb,0xe3,0x5f,0x0b,0x4e,0xb2,0xf5,0x2e,0x6e,0xaa,0xaa,0xad,0xa6,0x97,0x3f,0x7b,0xa2,0x15,0xb8,0x23,0x20,0x12,0xdd,0xcc,0xff,0x75,0x33,0x1a,0x0f,0xc6,0x5a }, { 0xe3,0x6c,0x82,0xe6,0x45,0x87,0x49,0x49,0x1f,0xd5,0xf0,0xf2,0x3d,0x87,0x37,0x56,0xaf,0xc3,0xb7,0xb8,0x68,0x71,0xc8,0x50,0x5d,0xad,0xda,0x18,0x16,0x1a,0x29,0x2f }, { 0xd1,0x70,0xd3,0x0b,0xad,0x9e,0x52,0xa1,0x66,0x7e,0x46,0x2f,0x69,0xd5,0xf4,0xa2,0x74,0xac,0xf6,0xcb,0x82,0x74,0xa4,0xf5,0x9b,0x2f,0x8b,0xc3,0xf3,0x3e,0xc9,0x60 }, { 0xa3,0x43,0x8b,0x92,0x04,0xde,0xc6,0xf9,0x40,0xdd,0xb0,0xc2,0xc4,0x40,0x09,0x89,0x61,0x35,0xdf,0xc3,0x0e,0xc3,0x2d,0x0f,0x49,0x45,0x1c,0x6a,0x96,0xc4,0x3a,0x2f }, { 0x5a,0x71,0xb5,0x08,0x26,0x71,0x5d,0x99,0x1f,0x30,0xe8,0x35,0xe8,0xec,0xcc,0x6d,0x89,0xa2,0x6d,0x10,0x4c,0x37,0x90,0x66,0x80,0xbd,0xe1,0xba,0xbb,0x87,0xca,0x11 }, { 0x37,0xef,0x71,0xf6,0x9e,0x26,0x5e,0xce,0x65,0xc2,0x3f,0x09,0x74,0x37,0x6b,0x17,0xde,0x8c,0xa1,0xa0,0x7c,0x4a,0x81,0x3f,0x20,0xd4,0xe9,0xe4,0xd2,0x30,0x93,0x14 }, { 0x23,0xce,0x67,0xac,0x57,0x09,0x50,0x1d,0x9f,0x13,0x40,0x30,0x92,0xbc,0xc0,0x1f,0xf0,0xcd,0x15,0xc8,0x52,0x0b,0x6c,0x35,0xd7,0xbe,0x43,0x6d,0xc8,0x58,0xed,0x17 }, { 0x0e,0x96,0x0e,0x39,0xbc,0xe1,0xea,0xfc,0x55,0x0a,0x7c,0xb6,0xd1,0x45,0x55,0x5d,0x5a,0x74,0x78,0x31,0xed,0xd4,0x8d,0x84,0x97,0x11,0x55,0x12,0x25,0x7c,0xcd,0x20 }, { 0x53,0x5f,0x6f,0xb9,0x4e,0xdf,0xec,0x30,0x1f,0x4e,0xd4,0xea,0xb5,0xaa,0xf7,0xbf,0xd2,0x53,0x1c,0x2a,0x7c,0xe2,0x90,0xd5,0x6b,0xb3,0x28,0xfa,0x04,0xb9,0x3b,0x5e }, { 0xc3,0x40,0x13,0x85,0xed,0x41,0x0e,0xbe,0x1d,0x30,0xbe,0x31,0x49,0x51,0xe0,0xf8,0x31,0x7c,0xcd,0x29,0xa5,0x36,0xdb,0xfa,0x78,0x99,0xc7,0x92,0x0b,0x4c,0x20,0x4b }, { 0x88,0x3b,0xec,0xdb,0x44,0xd3,0x98,0x79,0xc7,0xc6,0xca,0x1c,0x1f,0x97,0x0d,0x07,0xb7,0x20,0xc5,0x34,0x69,0xe4,0xd0,0x0f,0x03,0xd5,0x6c,0xa0,0xe6,0x1c,0x77,0x5a }, { 0x11,0xd2,0x5b,0x8d,0xe7,0x69,0x7c,0x48,0x1d,0xfc,0xd3,0x35,0xa9,0x58,0x3e,0xd9,0x00,0x96,0xf1,0xe0,0xc8,0x66,0xcb,0x3d,0x63,0x5f,0x08,0xf1,0x2a,0xb1,0xfe,0x36 }, { 0xd0,0x44,0x10,0x28,0x45,0x3f,0xd7,0x4d,0x80,0xa2,0xf4,0xf7,0x40,0x9f,0x67,0xa5,0x48,0xa3,0xe8,0xe2,0xc3,0x6e,0x0c,0x80,0x8b,0x0e,0x50,0x8e,0xe7,0xe9,0x7f,0x00 }, { 0x03,0x9a,0x16,0x84,0x12,0x56,0xcd,0x99,0x67,0x10,0xed,0xae,0x26,0x14,0x7e,0xe0,0x1b,0xf4,0x21,0x25,0x50,0xf6,0x27,0x5e,0x39,0xa9,0x89,0x09,0x49,0xca,0x91,0x63 }, { 0xf6,0x90,0x93,0x64,0x48,0x7e,0x14,0xe6,0x1a,0x1b,0x40,0xff,0x23,0x51,0x3b,0xb9,0x87,0x5f,0x26,0xdb,0xbe,0x4d,0x0a,0xa7,0x3f,0x5b,0xaf,0xb2,0x73,0xfa,0x6e,0x3f }, { 0x13,0x25,0x9e,0x9d,0x9e,0x8d,0x7e,0x2f,0x13,0xeb,0x09,0x37,0xdb,0x07,0x46,0x91,0x97,0xf1,0x0b,0x91,0x09,0x00,0xb4,0xe8,0x2a,0x7f,0x7a,0xe4,0x09,0xa5,0x53,0x06 }, { 0xcf,0xbe,0x26,0x15,0x99,0xde,0xae,0x02,0x23,0x59,0x12,0x3f,0xa9,0xfc,0x26,0xa5,0xa1,0x29,0x71,0x2e,0x22,0x05,0xa8,0x4f,0x69,0x3d,0x88,0x16,0x1e,0xb9,0xba,0x3a }, { 0xb9,0xad,0xa3,0x9e,0x8b,0x45,0x08,0xcf,0x7e,0xd0,0x3d,0x02,0x35,0x04,0xd2,0x87,0xc5,0x96,0xeb,0xe5,0x6f,0x2d,0xd2,0xc3,0x92,0x9e,0xd3,0x36,0xca,0x0f,0x26,0x08 }, { 0xaa,0xe3,0xc0,0x74,0x20,0x55,0xa9,0x41,0xb3,0x41,0x8c,0xeb,0xee,0x8b,0xc4,0x47,0x6f,0xa1,0x28,0x38,0x68,0x3b,0xf1,0x12,0x5e,0x6b,0x79,0x6e,0x49,0x56,0x5c,0x0d }, { 0x36,0xee,0xce,0x3b,0xc4,0x94,0xe0,0x48,0xca,0xc3,0xa0,0xef,0x31,0x98,0xcd,0x51,0x5d,0x5e,0x27,0x33,0xc3,0x62,0xcb,0xdd,0x12,0xca,0xd0,0x4f,0x1a,0x83,0x84,0x57 }, { 0x39,0x7d,0x36,0x87,0x9e,0x93,0xa5,0x58,0xfb,0x40,0x88,0x94,0xa9,0x5e,0xfe,0xc0,0x42,0x6e,0x29,0x70,0xb8,0x43,0xb1,0x9e,0x7d,0xa2,0x25,0x87,0xae,0xf9,0xee,0x63 }, { 0x9f,0x3a,0x6c,0x42,0x7e,0xe6,0xa9,0xb2,0x1c,0x70,0xed,0x24,0x96,0x36,0xe2,0xe5,0xfb,0x0f,0xe7,0x34,0xfd,0xbc,0x97,0x44,0x76,0x5e,0x37,0x7a,0x62,0x92,0x2b,0x24 }, { 0x98,0x74,0xa4,0x80,0x92,0xb3,0x40,0x8f,0x73,0x73,0x46,0x70,0xa5,0xa5,0x37,0x4b,0xeb,0x45,0x59,0xd3,0xd2,0x43,0xdf,0xf9,0xd8,0xd4,0x81,0x22,0x1f,0xfa,0x41,0x1d }, { 0x96,0xbf,0x97,0x96,0x12,0x38,0x26,0x43,0x3a,0x8a,0x6f,0x61,0x09,0x75,0xfc,0x01,0xf5,0xbe,0x20,0x0d,0x9e,0xc7,0x06,0x2d,0x7f,0x77,0x33,0x20,0x81,0x61,0x2d,0x15 }, { 0x53,0xd6,0x7d,0x7b,0xaa,0x79,0xe1,0x9f,0x6f,0x52,0xd3,0x1b,0x61,0xdc,0x0d,0x53,0xd0,0xa7,0xfc,0xfa,0xdc,0x65,0xb4,0x79,0x6b,0x95,0x0a,0x7f,0xed,0x02,0x89,0x46 }, { 0x4f,0x12,0xfd,0x93,0x4c,0xbd,0x76,0x56,0x1e,0x17,0xb1,0xaf,0x6f,0xf8,0xe9,0x9a,0xc6,0x98,0xfa,0x0a,0xe3,0x49,0x79,0x15,0xbe,0x41,0x32,0x84,0x44,0x72,0x47,0x76 }, { 0x2f,0x59,0xcc,0x8b,0x85,0x2b,0x81,0x61,0x8f,0x8b,0x42,0xf0,0x29,0xa7,0x82,0x9e,0x89,0xe3,0x41,0x9f,0xd9,0xd3,0x44,0x31,0x33,0x2e,0xaa,0x0d,0x71,0x5e,0xa3,0x10 }, { 0x4a,0xb9,0xe8,0x1c,0xb8,0x71,0x9a,0x3f,0x74,0x3e,0xb6,0xf3,0xa9,0x52,0x0b,0x5e,0xe0,0xb1,0x23,0x97,0x59,0x20,0xd3,0x9e,0x15,0x05,0x9e,0xb8,0x33,0x9f,0x9c,0x13 }, { 0x70,0xcf,0xa6,0xdf,0xe8,0x62,0xbd,0xd8,0x0c,0xdc,0xd1,0x1a,0xf4,0xbd,0x31,0x89,0x93,0x25,0x03,0x59,0x40,0x53,0x44,0x02,0x9c,0x52,0x24,0x71,0x20,0x0c,0x4a,0x44 }, { 0xdd,0xb7,0xc1,0xb6,0xff,0x10,0xcc,0x96,0x20,0x26,0x31,0x42,0x84,0x25,0x22,0x9d,0x80,0xd5,0x5a,0x1e,0x72,0x72,0xe4,0xe9,0xc3,0xf3,0x8f,0x9f,0x7f,0xb9,0x08,0x7d }, { 0x2b,0xfc,0x02,0xc9,0x82,0x35,0x42,0x10,0xad,0x84,0x98,0x4d,0x9f,0x9a,0xaa,0xad,0x41,0x01,0xd9,0xbb,0x20,0xab,0xa2,0x88,0x22,0x39,0x76,0x14,0x60,0xa8,0x35,0x31 }, { 0x55,0x5f,0xb7,0x42,0xc2,0x47,0x67,0xfc,0x55,0xaf,0xad,0x77,0x6f,0x63,0x19,0x90,0x65,0x36,0x5a,0xa4,0x26,0x24,0xd6,0xc7,0xf2,0xf4,0xf3,0xd9,0xb4,0xa2,0x58,0x1b }, { 0x45,0x24,0x44,0x6e,0x9a,0x5f,0xa8,0x78,0x31,0x7c,0xfa,0xf7,0x47,0x23,0x37,0x1a,0xca,0x26,0xb2,0xbb,0x8e,0xd0,0x35,0x89,0x4f,0x28,0xee,0x72,0xf0,0xf1,0x07,0x76 }, { 0x4d,0x16,0x71,0x08,0xd5,0x48,0xd8,0x46,0x92,0x92,0x81,0xbc,0x27,0xa0,0xe0,0xfe,0x65,0x10,0x1c,0x23,0xc3,0x11,0x17,0x63,0x9a,0x01,0xce,0x13,0x74,0xd4,0x00,0x14 }, { 0xf6,0x26,0x20,0x9c,0xd8,0x09,0xcb,0xe2,0x07,0xbf,0x12,0xf6,0xb2,0x0d,0x1b,0x9f,0xe6,0x6e,0x29,0xb9,0x1d,0xf4,0x76,0x40,0xae,0x7a,0xa1,0xd7,0x29,0x4e,0xef,0x35 }, { 0x05,0x54,0x0b,0x63,0xf2,0xac,0xb0,0x27,0xf7,0xfc,0x62,0x75,0x5a,0x9d,0x6f,0xd0,0x4f,0xe9,0x76,0x18,0x41,0x53,0xb9,0x69,0x4b,0x11,0x20,0x21,0xe4,0xff,0xf8,0x16 }, { 0xf8,0x82,0xb1,0x6d,0x41,0x8f,0xe8,0x9f,0xd7,0x86,0xbf,0xe9,0x9b,0xc9,0x28,0x7d,0x38,0xc9,0x21,0x56,0xbe,0x62,0x00,0xca,0x5f,0x4c,0xc3,0x3b,0x92,0xad,0x51,0x31 }, { 0xfb,0x72,0x53,0x97,0xed,0xfd,0xd8,0xd3,0xf0,0x50,0x7c,0xe4,0x61,0xdb,0xaf,0x1b,0xe8,0xe5,0xfe,0x28,0xef,0xe2,0x44,0x23,0x40,0x22,0xbc,0x1d,0x51,0x57,0x03,0x4a }, { 0xad,0x07,0xe1,0xc3,0x80,0x7f,0x52,0xe0,0x1a,0xaf,0x90,0x4f,0xb7,0x14,0xec,0x9b,0xf5,0xeb,0x42,0x3a,0x15,0xd4,0x5d,0x20,0x1e,0xb8,0x5a,0x74,0xcb,0x6b,0xf1,0x6e }, { 0xd2,0xdd,0x68,0x8c,0x52,0x98,0x9f,0x1a,0x7c,0xae,0xe7,0x21,0x3a,0xb4,0x0b,0xee,0x30,0x59,0xa9,0xeb,0x37,0x80,0x8b,0x7d,0xc4,0x56,0xba,0x2a,0x8f,0x9c,0xb7,0x4e }, { 0xf3,0x18,0x88,0x90,0xb9,0x85,0x88,0x52,0x20,0xbb,0x14,0xd2,0xe1,0x07,0x98,0x5e,0xb6,0xd2,0xc0,0xcc,0xeb,0xb8,0xaa,0xb6,0xcf,0x4e,0x42,0x27,0xcb,0xe0,0x59,0x1f }, { 0x6c,0x81,0x9c,0xb3,0xc7,0x8c,0x6d,0xb9,0x9f,0xb9,0x61,0xf4,0xf6,0x56,0xfe,0x0e,0xc0,0x7e,0x2f,0x5d,0x4d,0x18,0x9a,0x6f,0xbd,0x62,0x2d,0xe8,0x7b,0x4a,0xaa,0x30 }, { 0x9c,0x79,0x6a,0xa4,0xa8,0x7a,0x82,0xad,0x32,0x3e,0x77,0xdc,0x98,0x5b,0xbb,0xbe,0xe2,0xfa,0xa9,0xa7,0x7f,0x5b,0x52,0xfd,0xf0,0x7c,0xca,0x6e,0x5b,0x24,0xf1,0x48 }, { 0xf3,0x38,0xdf,0x7d,0x18,0xbc,0x35,0xe6,0x57,0x5d,0x11,0xac,0xc6,0x70,0x75,0x57,0x7a,0x93,0x9a,0xbd,0x63,0x1f,0x5c,0x0a,0x0a,0x82,0x4c,0x37,0x13,0x15,0x34,0x75 }, { 0x0e,0x2d,0xc2,0x78,0xe7,0x85,0x7c,0x21,0x8d,0x3d,0x35,0x98,0x8a,0xca,0xe7,0xaa,0xc9,0xe6,0x6a,0x58,0x93,0xe4,0x13,0xb8,0xa9,0x51,0x76,0x03,0x1f,0x90,0x56,0x50 }, { 0x20,0xe0,0x60,0xc9,0x70,0x47,0x4d,0xfe,0x00,0x51,0x26,0x6d,0x4b,0xa0,0x34,0x06,0xe0,0x93,0xd6,0x13,0xe2,0x75,0x44,0xc3,0xbc,0xd5,0xa1,0xbc,0x72,0x55,0xcf,0x39 }, { 0x4f,0xa2,0x05,0xaa,0x8e,0x2b,0x52,0x66,0xbb,0xe1,0x19,0x5c,0x2a,0xb1,0x1a,0x35,0x92,0xb3,0xee,0xca,0x78,0x69,0x87,0x19,0x4c,0xcf,0x59,0xd9,0x4a,0xb2,0xf9,0x18 }, { 0x55,0x0e,0x8e,0xb2,0x9a,0x61,0xcf,0x35,0xb4,0x19,0x7f,0xd5,0xbb,0xe4,0xa1,0x53,0x8b,0x26,0x80,0x97,0xb4,0x93,0x15,0xcc,0xd1,0x56,0x5d,0x2b,0xf3,0xb8,0x9d,0x56 }, { 0xfd,0x23,0x70,0xe3,0xd7,0x4e,0x24,0xb8,0x7d,0x3d,0x5f,0xfe,0xdb,0x6e,0x4b,0xf2,0x6f,0x69,0x25,0x3e,0xdd,0x0a,0x88,0x2e,0x7a,0xd8,0x71,0xb9,0x0f,0x58,0x11,0x01 }, { 0xb9,0xf5,0x5c,0xb4,0xc7,0x87,0x5b,0x9a,0x67,0xb5,0x5e,0xe8,0x93,0xc5,0x5c,0x47,0x49,0xae,0x90,0x65,0xa1,0x78,0x65,0x61,0x2a,0xeb,0xd5,0x7f,0xe2,0xc8,0x74,0x29 }, { 0xcf,0x62,0x94,0x20,0xc2,0x4f,0x83,0x3c,0xaa,0xb2,0x8e,0x75,0x6f,0x36,0x27,0xb2,0x8d,0xd1,0xa7,0x85,0xcf,0x64,0x03,0x49,0xad,0xb8,0x74,0xa5,0x7e,0x47,0x8f,0x18 }, { 0xb0,0x17,0x71,0x70,0x1f,0x05,0xb0,0xc8,0x98,0x41,0x74,0x82,0x2d,0x0d,0x74,0x90,0xf6,0x4e,0xa5,0x9e,0x17,0xdf,0x93,0x70,0xbe,0x8d,0x9b,0x3a,0xfc,0x24,0x63,0x5d }, { 0x97,0xc3,0x5f,0xf1,0x3c,0x9f,0xa3,0x8a,0xe4,0x72,0x7f,0x46,0x6f,0xd0,0x5b,0xf7,0xbd,0x6e,0x5f,0x30,0x3c,0x9e,0xab,0x3e,0xab,0x5e,0x41,0xf7,0x5a,0x8b,0x95,0x39 }, { 0xf9,0x9d,0x8a,0x0f,0x73,0x61,0xa8,0x98,0x55,0x6e,0xde,0x2d,0x1e,0x06,0x3f,0xef,0x89,0x6b,0xd3,0x34,0xb6,0xcc,0xd4,0xde,0x02,0x74,0xf8,0x26,0xf8,0x89,0xb5,0x55 }, { 0x5b,0x83,0x0c,0x73,0x7f,0x17,0xf1,0xd4,0x6c,0x69,0x76,0x50,0x98,0x73,0xbc,0xf9,0xc1,0x57,0x8f,0x8b,0x8e,0x4c,0xb5,0x23,0x84,0x3a,0xca,0xa5,0x3f,0x8f,0x16,0x64 }, { 0x49,0xb0,0x27,0xa8,0xf0,0x36,0x57,0xdb,0x0b,0xf1,0x0d,0x14,0x07,0x4d,0x7b,0x75,0xd9,0x9a,0xfd,0x05,0xa5,0x5c,0x5c,0xd9,0x93,0xe1,0x0d,0x84,0x9e,0x88,0x0c,0x72 }, { 0xe4,0xe8,0x2f,0x06,0x32,0x3f,0xf3,0xcf,0x83,0x2f,0x0a,0x66,0x68,0xe5,0x5a,0x15,0xd7,0xfa,0x8b,0x77,0x40,0xd0,0x4b,0x51,0x77,0x6c,0xb4,0x39,0x5e,0xdf,0x91,0x54 }, { 0x3e,0x41,0x41,0x5d,0xf1,0x02,0x51,0xf0,0x37,0x32,0x11,0xea,0x00,0x28,0x27,0x4f,0x13,0x83,0x2b,0x6d,0x0e,0x42,0x52,0xbd,0x5e,0xf9,0x25,0xdc,0x4c,0x31,0x04,0x75 }, { 0xa5,0x4f,0xbf,0x86,0x00,0xd4,0x32,0x77,0x5a,0x39,0x7a,0x7b,0xa3,0xa9,0xe2,0x64,0xf2,0x55,0x3a,0x84,0xdf,0xf5,0x18,0x06,0x3a,0x89,0x12,0x87,0xc7,0x4c,0xbc,0x09 }, { 0x6b,0x5a,0x7b,0xee,0x4c,0x83,0x3d,0xaf,0x0c,0x48,0x1e,0x44,0xac,0xa9,0x4d,0x91,0x8f,0xda,0x46,0xdc,0x61,0x2f,0xc8,0x70,0x77,0x48,0x76,0xec,0x43,0xed,0xa4,0x51 }, { 0xe8,0x07,0x92,0x2c,0x44,0x7e,0xde,0xea,0x74,0x12,0xe4,0xf2,0x84,0x61,0x4f,0xe3,0xa4,0x13,0x7d,0xf4,0x43,0xd3,0xce,0x3d,0x21,0xf5,0x7c,0xb5,0x64,0x9e,0x53,0x72 }, { 0xb7,0x3d,0x1b,0x4e,0x2c,0xf5,0xe0,0x59,0x42,0x3b,0x10,0xf6,0x25,0x1c,0xc2,0xa9,0x7f,0x60,0xf4,0x10,0x74,0x0f,0x95,0x14,0x19,0xe0,0x52,0x9b,0x95,0x12,0x36,0x55 }, { 0x94,0x6c,0xc3,0x09,0xc8,0xe5,0x85,0xbb,0x2d,0x44,0xc7,0x13,0xd6,0xbb,0x5e,0xb0,0x04,0xa4,0xfa,0x6c,0xc6,0x0f,0xce,0x06,0x36,0xf7,0xfa,0x5b,0xdd,0xa9,0x84,0x17 }, { 0x02,0xdf,0xdd,0x1e,0x79,0x55,0x89,0x72,0xaf,0xf0,0x4b,0xa2,0x0e,0xa0,0xe3,0x10,0xef,0xe0,0x65,0xac,0x0c,0xdd,0xef,0x93,0xc9,0xd9,0x54,0x11,0xe4,0x47,0x02,0x36 }, { 0xd6,0xa1,0x76,0x6b,0x9f,0x3a,0x49,0x14,0x55,0xb5,0xca,0xdc,0xb6,0x83,0x79,0x48,0x1f,0xc7,0x8f,0xb3,0x9d,0x71,0x1c,0xd0,0xe0,0xf1,0x15,0x90,0xc8,0x6d,0xce,0x57 }, { 0xac,0xba,0xef,0xe1,0x4b,0xca,0x69,0x86,0xb9,0x2b,0x0d,0xe8,0x31,0xf3,0x3c,0x24,0xae,0xde,0x4a,0x40,0xf3,0xab,0xd9,0xbf,0xb5,0x1e,0x1c,0xec,0x2c,0x07,0xb9,0x08 }, { 0xac,0x3e,0x85,0x27,0x46,0x3a,0xb9,0xd8,0x61,0x2b,0xb2,0xab,0x69,0x72,0xf7,0x6d,0xc1,0x46,0xf7,0xc1,0x62,0x73,0x55,0x8a,0xac,0x45,0x3e,0xaa,0x69,0x8f,0xf6,0x6a }, { 0x2f,0xeb,0xfa,0xa7,0xef,0x48,0x9e,0x60,0x4e,0xed,0x58,0xc1,0x71,0x1f,0xf6,0x7f,0x55,0x87,0x38,0xdc,0xad,0x5f,0x55,0x90,0xfe,0xd0,0xc4,0x5a,0xfa,0x9b,0xcc,0x57 }, { 0x4c,0xf2,0xf7,0xd4,0x1c,0x4c,0xef,0x90,0x42,0x42,0xce,0xf1,0xeb,0x94,0xe2,0x1b,0x9a,0xe6,0xf2,0x90,0xcf,0x5c,0xe1,0xca,0x0a,0x39,0xdc,0x25,0x2e,0x83,0x6f,0x0e }, { 0xcf,0x39,0x1f,0xbc,0xc6,0x56,0xff,0x72,0xeb,0xd5,0xfa,0x1e,0xd1,0x7a,0x7f,0x34,0xfd,0xfd,0xa2,0xa4,0xf6,0xb9,0xef,0x3c,0x78,0x96,0x81,0x7f,0x65,0xdf,0x31,0x7a }, { 0x2e,0xbe,0xfd,0x73,0x71,0x4e,0x7a,0x66,0xb2,0xba,0xc0,0x37,0xb0,0xac,0x85,0xcf,0x26,0xc3,0xc0,0xd4,0x46,0xb4,0x16,0xfd,0xdc,0xb3,0x56,0xcc,0x80,0xac,0x4d,0x44 }, { 0x16,0x2c,0x49,0xd1,0x74,0x11,0xf1,0x32,0x6e,0xe5,0xdc,0x57,0x72,0xa0,0x7d,0xb3,0xeb,0xb3,0x41,0xa8,0x45,0x04,0xa5,0xa6,0x6d,0xb9,0xa2,0x68,0xfe,0x2e,0xe6,0x0f }, { 0x99,0xd9,0xe2,0x80,0x20,0xb4,0x86,0xbc,0xae,0xbe,0xd9,0xb6,0x88,0x5e,0x72,0x64,0xe9,0x31,0xca,0xb7,0x3d,0x07,0x53,0xcd,0xa5,0x3f,0x80,0xe0,0x76,0x4b,0x64,0x60 }, { 0xaf,0xe9,0xd1,0x94,0xf9,0xfe,0x36,0x24,0x63,0x24,0x0e,0x7d,0x2d,0xb5,0x28,0x7d,0x6c,0x36,0x01,0xb2,0xfa,0xd5,0xbd,0xfa,0xcf,0x27,0xa5,0x59,0x7b,0x7b,0x4b,0x14 }, { 0x0f,0x1b,0x65,0x89,0x58,0x78,0xe2,0x65,0x47,0x24,0x2c,0x56,0xfd,0x98,0x6f,0x79,0xcb,0xb4,0x5c,0x4f,0x72,0x2a,0x3b,0x0f,0x66,0xcf,0x4a,0xb2,0xa4,0xa5,0x23,0x69 }, { 0x42,0xfa,0x67,0xf6,0xce,0x49,0x43,0x78,0x62,0x44,0xb8,0xdf,0xdb,0xe0,0x45,0x0d,0x10,0x2a,0x2e,0x05,0xa9,0x86,0x3c,0x1f,0x37,0x48,0xc3,0xca,0x00,0xfd,0xad,0x64 }, { 0x15,0x24,0x0a,0xfe,0x3c,0xe2,0x92,0x20,0xbf,0x0b,0xb9,0x06,0x9b,0x8c,0xca,0xc5,0xc9,0x2d,0x1b,0x66,0xef,0x36,0x01,0x43,0x09,0xf8,0xd9,0xaf,0xe1,0x52,0x3d,0x2a }, { 0xb5,0xbb,0xeb,0x00,0x9c,0x6c,0xb8,0x1f,0x43,0xa3,0xee,0x95,0xc6,0xc1,0xc1,0x45,0xd4,0x5a,0x3f,0x7f,0x4b,0xac,0xc8,0x88,0xc3,0xb7,0x81,0x82,0xa2,0x1b,0x53,0x20 }, { 0x36,0x71,0xf3,0x30,0x67,0xd7,0x65,0x8d,0xc6,0x58,0x0d,0xf5,0x53,0xfe,0x1e,0x13,0x76,0xfd,0x95,0x50,0x06,0x35,0x09,0x21,0xc1,0xa3,0xe0,0x0d,0x5b,0x33,0x1c,0x4e }, { 0x9d,0xbd,0x5a,0xe0,0x99,0xb2,0x91,0xf4,0x6f,0xbf,0x5e,0x70,0x5f,0x8d,0x28,0x98,0xe1,0x75,0xd2,0x4f,0x31,0x00,0x38,0x24,0xe4,0x73,0x1b,0xda,0x94,0x21,0xbf,0x1f }, { 0x91,0x29,0xd2,0xc6,0x58,0x18,0x64,0xc8,0xd0,0x85,0x39,0xe8,0x0c,0x3a,0x97,0xb3,0x1c,0x3b,0xca,0x40,0xbb,0xd0,0x5e,0x2e,0x0f,0xaa,0xf4,0xdf,0x5e,0xc2,0xea,0x14 }, { 0xf2,0x2d,0x92,0x0b,0x6f,0x24,0x3a,0xd2,0x74,0x32,0x04,0xc3,0xec,0x17,0xe7,0x65,0xf1,0x67,0x4b,0xe5,0x59,0xc0,0x94,0xf8,0xee,0x05,0x48,0x23,0x80,0x69,0x31,0x1a }, { 0x3e,0x66,0xf6,0xa4,0x81,0x81,0xf0,0x8b,0xdf,0x8a,0x21,0x94,0x9c,0x3f,0x37,0xe0,0x55,0xc5,0x50,0xf8,0x36,0x68,0x1c,0xc4,0x57,0xb0,0x91,0xb1,0xa9,0xdf,0xc1,0x02 }, { 0x93,0xd0,0x3a,0x56,0xfe,0xa6,0xc3,0x54,0x2e,0xac,0x1e,0x33,0xe9,0xcc,0xb3,0xd3,0xd1,0x45,0x5d,0x8d,0xd3,0xc1,0x5d,0xc5,0xc7,0x7d,0x12,0x61,0xa7,0x52,0x0d,0x08 }, { 0xbc,0xad,0x0f,0x47,0xbf,0x74,0x86,0xc7,0x30,0x72,0xa3,0xc8,0x82,0xc0,0x32,0x16,0x81,0xe4,0x57,0xef,0x6b,0xa1,0x63,0x05,0xe4,0x69,0x3b,0x3d,0x98,0x66,0xcd,0x13 }, { 0x8d,0xd7,0x5a,0x59,0x17,0x5e,0x96,0x00,0xa1,0x65,0x6d,0xf2,0x3d,0xe8,0xb1,0x95,0x61,0x75,0xf9,0x34,0x5d,0xf9,0xe7,0xe4,0xee,0xd7,0x41,0x71,0x5b,0x0c,0x94,0x08 }, { 0x22,0x8b,0x13,0x88,0x2d,0x30,0xd8,0x8e,0x64,0x44,0x77,0x52,0x1c,0xf2,0x6f,0xea,0xe0,0xb5,0x92,0xbe,0x6e,0x47,0xbe,0x06,0xd9,0x00,0x78,0x90,0xeb,0xcd,0x8a,0x6d }, { 0x22,0x81,0x1a,0x43,0x24,0xac,0x95,0x1d,0x39,0xfe,0xf7,0x17,0x9e,0xb1,0x46,0x76,0x36,0x68,0x7d,0xc1,0x14,0xf5,0xc2,0x9b,0x4a,0x13,0x50,0xe1,0x2e,0x19,0x03,0x03 }, { 0xad,0x07,0xd7,0x42,0x8c,0xe1,0xa5,0x12,0xcd,0x4e,0x49,0x0a,0x2a,0x13,0xcb,0x8c,0xbf,0xc4,0x20,0xcd,0x31,0x41,0x9e,0x3d,0xb8,0x46,0x65,0x0c,0xfa,0xb8,0x17,0x59 }, { 0x9c,0xb3,0x87,0xa4,0xab,0x7f,0x2b,0x42,0x27,0x0e,0xb8,0x61,0xeb,0x9e,0xb2,0x13,0x83,0x63,0xc6,0xc3,0xe4,0x5f,0x28,0x48,0x1b,0x78,0xd0,0xa6,0x86,0xef,0xaf,0x21 }, { 0xc7,0x59,0x28,0xf0,0x20,0xb0,0x23,0x01,0xe7,0x42,0x3e,0xae,0x2f,0x84,0x4f,0x17,0x56,0x14,0x82,0x85,0x72,0x80,0x9f,0x8f,0x10,0x9c,0x68,0xfb,0x2d,0xeb,0x7b,0x33 }, { 0x2e,0xa1,0x53,0x8a,0xc4,0x7c,0xbe,0x0d,0x5a,0x9c,0x97,0x86,0x84,0x9d,0x56,0x79,0x35,0xc9,0xbf,0x29,0xf6,0xe7,0x6b,0x7b,0x3e,0xee,0x09,0x1c,0x76,0x4a,0x80,0x12 }, { 0xb1,0x8f,0x92,0xff,0x57,0x6c,0xcd,0xef,0x8f,0xd4,0x01,0xa1,0x20,0x13,0x01,0xbf,0xc8,0xed,0x5d,0x3b,0x0f,0xf3,0x13,0x36,0x57,0x2f,0x82,0x40,0x7d,0x7e,0x30,0x57 }, { 0x9f,0xab,0x09,0x2a,0x85,0x73,0xc7,0x34,0xed,0x84,0x15,0x2f,0x06,0x52,0xc8,0x5c,0x2c,0x8a,0x26,0x66,0xc6,0xd0,0x89,0x2a,0x40,0xb8,0xf4,0x53,0xa5,0xa2,0x61,0x64 }, { 0x7e,0xa9,0x2b,0x6b,0x37,0xb5,0x6d,0x91,0x53,0x95,0xa0,0x70,0x33,0x7e,0xd5,0x90,0xf1,0x32,0xd8,0xa4,0x35,0x94,0x84,0xf0,0x94,0xd1,0xfe,0x80,0x28,0x55,0xa3,0x3b }, { 0xc4,0x92,0xa9,0x7d,0xfd,0x3f,0x3a,0x87,0x1d,0xbe,0xcd,0xfd,0xb7,0x30,0xb0,0x5a,0xde,0x48,0x79,0x7e,0xcc,0x4c,0xe9,0x22,0xfc,0x37,0xc5,0x20,0x9b,0x4e,0x6d,0x0b }, { 0xcc,0x2b,0x29,0xd7,0x2f,0xc8,0xa3,0x38,0xc3,0xab,0x85,0x52,0xa0,0x6e,0x0d,0xc6,0xeb,0x66,0x8a,0x09,0x12,0x56,0xf4,0x59,0x1f,0x80,0x80,0xbb,0x38,0x65,0xbf,0x34 }, { 0x22,0x54,0xd4,0x82,0x4a,0x74,0xb1,0xaf,0x42,0x09,0x4f,0xd7,0xb4,0xc4,0x05,0x99,0xbd,0x4e,0xb4,0xcd,0x14,0xaa,0xbd,0x94,0x5e,0x8a,0x4b,0x7f,0xab,0x1f,0xde,0x49 }, { 0x0e,0xb8,0x3c,0xdd,0xdd,0x7a,0xb7,0xc4,0x8a,0xd0,0x4d,0x76,0x61,0x7d,0x75,0x30,0x24,0x95,0xea,0x31,0x35,0xd8,0x87,0xd9,0x17,0x98,0x23,0x3e,0x2e,0x9e,0xd5,0x49 }, { 0xc8,0x09,0x74,0x4a,0x37,0x63,0xdb,0xb6,0x19,0xe2,0x55,0xaf,0x94,0x99,0x65,0x8d,0x02,0x47,0x6a,0x27,0x73,0x72,0x3d,0xf5,0x26,0x48,0x3f,0x00,0x94,0x86,0xbb,0x36 }, { 0x2c,0x24,0x44,0xe9,0xbc,0x7d,0x3e,0xda,0x60,0x8b,0x17,0x12,0x5d,0xc3,0x8a,0x3d,0x70,0xf7,0xd4,0xf3,0x79,0x27,0x90,0xc9,0xf9,0xeb,0x5f,0x68,0xc4,0x87,0xfc,0x13 }, { 0x0b,0x14,0xe5,0x0e,0x33,0x6c,0x94,0x98,0x70,0x8d,0xd1,0x43,0x8d,0x0a,0x9a,0x67,0x1f,0x57,0x8b,0x18,0x44,0xe8,0x79,0xd0,0x56,0xd9,0x31,0xac,0x9b,0xb7,0x7d,0x7f }, { 0x0f,0x59,0x83,0x41,0x9f,0x87,0xec,0xfd,0x15,0x36,0x65,0xe8,0xdf,0x1e,0x80,0xba,0x6b,0xd2,0x5e,0x44,0xf1,0x95,0x66,0xe6,0x76,0x06,0x68,0x87,0x1b,0x6e,0x30,0x73 }, { 0x2d,0x5a,0xac,0xab,0xf7,0xd6,0x09,0xe0,0x22,0xee,0x71,0x75,0xca,0xdb,0x5f,0x14,0xe2,0x00,0x3c,0x28,0x63,0xf7,0x13,0x96,0x23,0x47,0x5f,0x2d,0x20,0xae,0x71,0x73 }, { 0x83,0xd5,0x63,0xc6,0xca,0x69,0xfb,0xe3,0xcf,0xca,0xbc,0xc2,0xe5,0xc0,0x5e,0x50,0x6b,0x25,0x55,0x1b,0xf4,0x4c,0x53,0xe2,0xce,0x2a,0x32,0xfc,0xfc,0x9b,0xd3,0x7f }, { 0xcf,0x41,0xbe,0xf0,0xb7,0xf2,0xad,0x14,0x12,0xd6,0x3e,0x20,0xfe,0xb3,0x70,0x98,0x76,0xc5,0x35,0xef,0x48,0xaa,0x63,0x65,0xdb,0x93,0xa5,0x61,0xf7,0x96,0x54,0x59 }, { 0xa5,0xd2,0x5b,0xd1,0xc2,0xa9,0x37,0x33,0x96,0xe6,0x63,0x3f,0xbc,0x0f,0x93,0x98,0x1e,0x1a,0x8f,0x8c,0xfd,0xc9,0x80,0x2a,0x19,0xcc,0xb0,0x42,0x4b,0x38,0x24,0x5d }, { 0x5b,0x0d,0x1f,0x68,0xf8,0x08,0xfa,0x83,0x2a,0x99,0xbb,0xba,0x98,0xba,0x8e,0xe7,0xc8,0xf9,0xbd,0x86,0x97,0xf6,0x5e,0x96,0x39,0x99,0xa4,0x25,0x7f,0xbe,0x30,0x60 }, { 0x22,0x92,0x84,0xd3,0xe5,0x03,0x62,0xe9,0x92,0xcf,0x13,0x5a,0xe9,0x24,0x89,0x77,0xe4,0xf6,0xb1,0x9a,0xb8,0x06,0x4c,0x9a,0x59,0xa2,0x96,0x12,0x72,0x95,0xfa,0x6e }, { 0x8f,0x0c,0x8c,0xb2,0x1b,0x92,0xfa,0x3d,0x59,0x63,0xd4,0x71,0x0d,0xe5,0x1b,0x8c,0xa7,0xf7,0xf2,0xf6,0x86,0x30,0xc7,0x56,0xc4,0x56,0x91,0xe0,0x2f,0x68,0xbb,0x01 }, { 0xe0,0xfc,0x3a,0x46,0x3a,0x47,0x54,0x49,0xd5,0x70,0xf6,0x7d,0xc8,0x1e,0xa2,0x7b,0x63,0x0f,0x4b,0xf8,0xd0,0xf9,0x0c,0xbf,0xc1,0xcb,0x90,0xa8,0x39,0xc1,0x3f,0x6c }, { 0x98,0x59,0xd7,0x0e,0xc8,0xd7,0xc0,0x1a,0x94,0xd7,0x2f,0x7c,0x9e,0x87,0xa0,0xb5,0xfe,0x11,0x45,0xb5,0x61,0x99,0x0e,0x30,0x2a,0xe8,0x15,0x22,0xc4,0x01,0xb4,0x5b }, { 0xde,0x5c,0x27,0x08,0xf5,0x60,0xca,0x47,0x4e,0x9c,0xcc,0x9d,0x8a,0xaf,0xcd,0xff,0x6d,0x8c,0xcd,0x3e,0x87,0x74,0x15,0x29,0x3b,0x2d,0x76,0x6c,0x3d,0xbf,0x96,0x3d }, { 0xe8,0xd6,0xcd,0x28,0x6e,0x38,0x79,0x5b,0xf1,0x6b,0x66,0x20,0x0e,0x8e,0xc3,0xdf,0x0f,0x07,0xd1,0x86,0x95,0x19,0x6f,0x5e,0x3b,0xb9,0x04,0x74,0x50,0xec,0x00,0x57 }, { 0xf0,0x1d,0x9f,0x05,0x1f,0xe7,0xca,0x5f,0x42,0x83,0x88,0x07,0xc5,0xa6,0xa5,0x83,0x8a,0x88,0x50,0x6c,0xd4,0x3d,0x64,0x78,0x65,0xff,0x0b,0x70,0xd4,0xc0,0x44,0x3a }, { 0xe9,0xc9,0xb6,0x11,0xf0,0x42,0x20,0xa6,0x60,0x73,0x71,0xa2,0x6d,0x32,0x77,0xcf,0xba,0x08,0xc2,0x61,0x78,0x1d,0x5d,0x13,0x90,0x03,0xce,0xc9,0x3f,0xd8,0x77,0x38 }, { 0xf7,0x74,0x72,0xb3,0x27,0x16,0x85,0x8b,0x66,0x2a,0x57,0x9a,0x4f,0x09,0x93,0x33,0x9b,0x5e,0x6f,0x42,0xdb,0x3e,0x25,0x82,0x0a,0x88,0x5c,0x95,0x0b,0xb1,0x6f,0x3e }, { 0x5f,0xb0,0xde,0x2b,0xf5,0x4b,0x1a,0x6e,0x9e,0xfb,0xd0,0x60,0x39,0x0c,0x36,0x57,0xe7,0x87,0x23,0x4c,0xd7,0xae,0x00,0x96,0xe1,0x5f,0x81,0x30,0xb8,0xe3,0x7b,0x2d }, { 0x00,0xb5,0x5c,0xb2,0xdf,0x93,0xc8,0x71,0x05,0x23,0x9e,0x04,0xa5,0xa6,0x56,0xe1,0x82,0xb0,0x46,0xef,0x70,0x49,0x8d,0x31,0x65,0xcf,0x25,0xf4,0xd4,0x9d,0xcf,0x4c }, { 0x0c,0xa0,0x62,0x53,0xfe,0xee,0xfd,0x71,0x94,0xdc,0x29,0x3b,0x2b,0x20,0x30,0xda,0x4e,0x67,0x64,0xe2,0xae,0x70,0xeb,0xf4,0x17,0x79,0x48,0x5d,0x1d,0xcb,0x15,0x24 }, { 0x9f,0x20,0x54,0x91,0x80,0xd4,0x89,0x42,0x1b,0xce,0x91,0x6f,0x9a,0xd6,0x87,0xf3,0xef,0xaa,0xc4,0xab,0x92,0xf6,0x12,0xc9,0xc6,0x91,0xf7,0xaf,0xe7,0x75,0x96,0x2a }, { 0x02,0x67,0x84,0x0e,0xb3,0x38,0x76,0xf0,0x63,0xfe,0xe9,0xc9,0xca,0xea,0x3d,0x10,0x1c,0x47,0xfc,0xc9,0x81,0x44,0xa3,0x92,0x77,0x9f,0xf5,0x70,0xf9,0x37,0x59,0x37 }, { 0x90,0x41,0x3e,0xf8,0xc4,0x32,0xad,0x51,0xd8,0x63,0xb3,0x8a,0xcf,0x71,0x01,0xcb,0xa1,0x27,0xfc,0x5d,0xfb,0x44,0x4e,0xe0,0x7f,0xc8,0xfa,0x2c,0x47,0x37,0x64,0x6e }, { 0xc7,0x77,0xe0,0x64,0xde,0x3b,0x80,0x1f,0x6c,0xf0,0x2e,0xeb,0xd7,0xeb,0x50,0x2c,0x7d,0xa5,0x6c,0x46,0x5e,0xba,0x1e,0x28,0x64,0x3a,0x03,0x82,0x15,0x0c,0x1f,0x18 }, { 0xc5,0x1d,0x2b,0xbf,0x2f,0xaa,0x13,0x8b,0xb5,0xd8,0xdd,0xf8,0xba,0x6c,0x7f,0xa0,0xff,0xdb,0xf9,0x60,0x4a,0x04,0x64,0x0b,0x4b,0x74,0x9c,0xc8,0x68,0xa4,0xc9,0x43 }, { 0xdf,0x13,0xb4,0x92,0x56,0xa4,0xa4,0x61,0x5f,0xc2,0xc6,0xca,0x1e,0x1d,0x29,0x9e,0xaf,0x35,0x01,0x47,0x55,0x1d,0xbd,0x8a,0x91,0x05,0xcf,0xd6,0xa4,0x33,0x53,0x1b }, { 0xd4,0x80,0xe7,0xd9,0xcc,0x83,0x6e,0x32,0xb5,0x49,0x61,0xbd,0xc7,0xcf,0xeb,0xeb,0x50,0x83,0xb9,0x8b,0x60,0x32,0xdc,0xa8,0x5f,0x9e,0x3e,0x67,0x5e,0x93,0xaf,0x7e }, { 0x5b,0xb3,0x37,0x01,0xc9,0x3b,0x12,0x65,0x35,0x7f,0x6f,0xd8,0xfe,0xb5,0x57,0x49,0x3e,0xf3,0x20,0x07,0x18,0x85,0xa9,0x58,0xfc,0x72,0x50,0xab,0x59,0x7e,0x23,0x53 }, { 0xe6,0x2b,0x86,0x67,0x77,0x6e,0x1f,0x7f,0x87,0x0a,0x6f,0x07,0x99,0xd7,0x40,0xb3,0x03,0x99,0x63,0x09,0xdb,0xcd,0xf4,0x48,0x79,0xc2,0xc6,0xbc,0xe4,0x2c,0xb0,0x0a }, { 0x1b,0x58,0x7e,0x47,0x26,0x04,0xf4,0x2d,0xcd,0x58,0x78,0x55,0xd4,0x73,0x2d,0x5c,0x3e,0x8d,0x82,0x44,0xb1,0x34,0x52,0xc2,0x28,0x90,0x47,0x5a,0x22,0x0a,0x6c,0x74 }, { 0x57,0x36,0xb5,0x3e,0xa0,0x6f,0x9e,0xe9,0x6c,0x99,0x2b,0x00,0xd5,0x41,0x25,0x26,0x85,0x6e,0xd5,0x25,0x48,0x5a,0x96,0x4f,0x8f,0xcf,0x96,0xd7,0xeb,0xcd,0x60,0x2b }, { 0xb8,0x2e,0x36,0xc6,0xa6,0xea,0xa7,0x07,0x88,0x39,0x63,0xb3,0x6d,0x75,0x0f,0xa0,0x33,0xf0,0x5f,0x77,0x14,0xe7,0x93,0x30,0x49,0xd1,0xfc,0x08,0x50,0x92,0x2a,0x4e }, { 0x8c,0x59,0x8e,0x7f,0x83,0x17,0xcd,0x20,0x36,0xd3,0x5a,0xce,0x9b,0x83,0x72,0xfe,0xcb,0xd1,0xce,0x83,0x68,0xbc,0x47,0xdb,0xbd,0x46,0xc1,0x10,0xf8,0x10,0x8d,0x1e }, { 0x23,0xb5,0xd3,0xd9,0xb9,0x84,0xab,0xd5,0x9e,0x32,0xac,0xff,0x41,0x1a,0x10,0x68,0x46,0xc0,0xce,0xd7,0xad,0x5c,0xaa,0xef,0x8b,0x07,0x6f,0x5b,0xd1,0xe9,0x3b,0x58 }, { 0x01,0x88,0xcf,0x17,0x11,0x2c,0x9b,0x3e,0x94,0x8c,0xcd,0x8c,0xeb,0xb6,0xbc,0xf2,0xf7,0x50,0xd4,0xe5,0x44,0x14,0x5d,0x01,0x73,0xc5,0x91,0x6b,0xc1,0xd6,0xc2,0x7b }, { 0xec,0x5f,0x18,0xa4,0x82,0x96,0xd5,0xad,0x20,0x27,0x98,0x65,0xa5,0x11,0x14,0xe8,0x0b,0x0c,0x76,0x29,0x80,0x76,0x61,0x70,0x05,0xa3,0x1a,0x23,0x73,0xfa,0x57,0x12 }, { 0x15,0x6f,0x13,0xfd,0xf6,0x62,0xf4,0xb7,0x21,0xc5,0x77,0xdf,0x32,0xfc,0x23,0xf4,0x71,0x62,0xa4,0x0d,0x92,0x83,0x77,0x3a,0x5b,0xae,0xeb,0x3e,0xe6,0x68,0x36,0x71 }, { 0xaa,0x95,0x4e,0x75,0x92,0x82,0x18,0xcb,0x93,0xdf,0x15,0xb3,0x74,0xc6,0xe1,0x77,0x00,0x23,0xf9,0x1b,0x61,0xaa,0x20,0x70,0xb2,0xf1,0x64,0x6f,0xf4,0x21,0x88,0x06 }, { 0x17,0x70,0xaf,0x05,0xab,0x90,0xaa,0x4c,0xae,0xe8,0x09,0xb1,0xa1,0x56,0x89,0xd5,0xe1,0x44,0x47,0x07,0x7f,0x46,0x4b,0x08,0x19,0x38,0x54,0xfc,0xe0,0x4f,0xbf,0x1d }, { 0x5b,0xa0,0x6c,0x7a,0xb0,0x75,0xc5,0x77,0xcc,0xbb,0x7a,0xdf,0x15,0x39,0xc8,0xf8,0xe4,0x30,0x07,0xcf,0xe2,0xfa,0xfc,0xd7,0x0c,0x95,0xc4,0xe2,0x56,0xd1,0xde,0x71 }, { 0x81,0x94,0x4e,0x3d,0x73,0xfb,0xac,0xcb,0x1a,0x09,0x6a,0x5d,0x21,0xb4,0xaf,0xc6,0x96,0x5e,0xfb,0x08,0x23,0x59,0xcc,0xf9,0x31,0x1e,0x26,0x90,0x08,0xe5,0x1b,0x4b }, { 0x1a,0x13,0xed,0xa9,0xbe,0x1d,0xb8,0x1f,0x1f,0xcf,0xc2,0xa0,0x36,0xac,0x44,0xb2,0xdf,0x1d,0xba,0xc7,0x5d,0x23,0x4e,0x94,0xd8,0xcf,0x23,0x9c,0x7f,0x27,0x8d,0x4c }, { 0x62,0xe3,0x37,0x29,0xf4,0x75,0xf9,0xe6,0xf6,0x5a,0x99,0x1c,0x81,0xfe,0x0c,0x10,0x07,0xe8,0xf3,0x12,0x34,0x86,0x12,0xdb,0x6c,0x39,0x03,0xf2,0xcd,0xec,0x4a,0x17 }, { 0x4d,0x08,0x8d,0x47,0x12,0x09,0xb7,0xf9,0x66,0x5a,0x3c,0xfd,0xd9,0xa3,0x02,0x25,0x46,0x3f,0xbd,0x6a,0x8d,0x2f,0x9c,0x18,0xa2,0x4e,0x91,0x98,0x20,0xd2,0x61,0x58 }, { 0x43,0x15,0xdb,0x9b,0x50,0x4e,0x32,0xbf,0xd6,0x8f,0xc1,0xe4,0x20,0x85,0x7f,0x13,0xd1,0xb4,0xa0,0x77,0xc5,0xb4,0xd6,0x49,0x6c,0x23,0x65,0x0c,0x30,0x83,0x37,0x30 }, { 0xce,0xd4,0x5b,0xe3,0xa7,0xc1,0xfd,0x12,0xfa,0x61,0x0c,0x19,0x4e,0x2c,0xf1,0x78,0xb9,0x1d,0x02,0x1b,0xd4,0xdf,0xc4,0x6e,0xbd,0xc8,0x01,0xa2,0xda,0x43,0x36,0x11 }, { 0x07,0x58,0x6e,0xa8,0x51,0x6e,0xd9,0xb8,0x38,0x51,0x8f,0x17,0x55,0xcd,0x89,0xe9,0x2b,0xd3,0x4d,0x36,0xeb,0xd5,0xf5,0xa3,0x98,0x36,0x89,0xd5,0x18,0x13,0x14,0x0a }, { 0xb0,0xce,0x16,0x3e,0xd1,0x0d,0x92,0x7a,0x9b,0xb5,0x05,0x20,0x35,0x93,0x7d,0xd8,0x4e,0x9f,0x26,0xf9,0x96,0xfc,0x5d,0xfa,0xfb,0x22,0x31,0xad,0x89,0x28,0x7c,0x64 }, { 0x7f,0x4e,0x70,0xd0,0xd7,0x40,0xfe,0xd8,0xa0,0x85,0x23,0xe2,0xca,0x10,0xd7,0xaf,0x63,0x33,0x43,0x28,0x84,0x9c,0xed,0x90,0x6d,0xd7,0xcf,0x69,0x37,0x01,0xfc,0x07 }, { 0xde,0x54,0x6e,0x24,0x94,0x63,0x67,0xf1,0xaf,0x45,0xf0,0xc0,0xe4,0xc4,0x12,0x3c,0x16,0xbf,0x01,0x7e,0xaf,0x24,0x0a,0xf1,0x2e,0xd0,0x37,0xe0,0x08,0xdd,0x9c,0x69 }, { 0x5c,0xc9,0x43,0xc9,0x87,0x5d,0x0c,0x26,0xd8,0x4a,0xfb,0x56,0x07,0xb5,0x3a,0x2c,0x2b,0xa3,0xa5,0xb6,0xce,0xe0,0x8d,0xbb,0x2d,0x0a,0xb3,0x8c,0x29,0x35,0xdb,0x00 }, { 0x27,0x47,0x25,0x12,0xec,0xd0,0xe0,0x9f,0x38,0xf5,0xd5,0xa0,0xc5,0x19,0x45,0xdd,0x88,0x5d,0x1c,0xca,0x76,0x19,0xbc,0xc0,0xbe,0x8c,0xfd,0x54,0x8d,0xa5,0xf4,0x12 }, { 0x2f,0xa5,0x00,0x85,0xcd,0xb6,0x87,0x84,0x47,0xe3,0x91,0xfb,0x7e,0x2f,0xfa,0x26,0x7a,0x3d,0x47,0xe5,0x2b,0xb2,0x6b,0xf4,0x11,0x31,0x5f,0x82,0x22,0x16,0xf5,0x21 }, { 0x67,0xfd,0x1b,0x2b,0x8b,0x38,0x69,0x8c,0xcf,0x9a,0x2c,0x1f,0x66,0x09,0x9d,0x08,0xf3,0x1e,0x21,0x91,0x2d,0xce,0xd7,0x00,0x44,0x6a,0x9b,0xc0,0x8d,0xc4,0x16,0x13 }, { 0x44,0xc8,0xab,0x78,0x55,0x7c,0x51,0xe7,0x27,0x47,0x8f,0xd9,0x7b,0xdc,0x3e,0x54,0xbc,0x9a,0xb7,0x01,0x4e,0xd9,0x23,0x62,0xab,0x0c,0x5f,0x7c,0x1a,0xad,0xf2,0x3a }, { 0xbd,0xa4,0x04,0x6e,0x0d,0xfc,0x75,0x51,0xe0,0x3c,0x61,0x9e,0x1e,0x65,0x87,0x6b,0x73,0x1c,0xbe,0xc1,0xf2,0x8b,0x5d,0xa6,0x50,0x1a,0x30,0x55,0xd9,0x47,0x96,0x55 }, { 0x41,0xa1,0x84,0x4a,0xcc,0x12,0x9c,0x44,0x7d,0xd3,0x4e,0x2e,0x9b,0x7a,0xfe,0x5a,0x2f,0xd2,0x37,0xca,0xa8,0xb7,0x4f,0x8d,0xd2,0x2b,0xa5,0x19,0x51,0xa8,0xc4,0x4c }, { 0xd4,0xa5,0x30,0x9d,0x76,0xcd,0x35,0x3a,0x56,0xde,0xae,0xdd,0xba,0xe2,0x8c,0xb1,0x08,0x84,0x6a,0x19,0xc4,0x8e,0x52,0x26,0x77,0x22,0x7e,0x35,0x97,0x43,0x0c,0x39 }, { 0x0a,0x22,0x22,0x2c,0xfa,0xcd,0x82,0x65,0xae,0xac,0x1b,0x21,0x1b,0x78,0xb6,0xa0,0xe1,0x5e,0xa5,0x2b,0x95,0xe7,0xe7,0xb9,0x27,0x87,0xa8,0x27,0x20,0x5c,0x1d,0x30 }, { 0x74,0xf4,0x16,0x86,0x45,0xed,0xc8,0xf2,0x2a,0x7e,0x88,0x72,0x0c,0xe6,0x6e,0x21,0x04,0x62,0x20,0x2d,0xdf,0xae,0x5e,0x7c,0xc0,0xc1,0x0b,0xa0,0x73,0xe2,0xad,0x45 }, { 0xbc,0x71,0x1f,0x5a,0xfe,0x50,0x4b,0xbe,0x65,0xa7,0xcd,0x0f,0x03,0x0a,0x12,0xf5,0x08,0x72,0xd0,0xd5,0xb2,0x80,0x62,0x89,0x86,0x17,0xcc,0xbf,0x66,0xeb,0xfc,0x01 }, { 0x6b,0x4a,0x14,0x57,0xfa,0xbb,0x8c,0x29,0x59,0x48,0x55,0x02,0x86,0x72,0x46,0x90,0xce,0x7c,0x2b,0x79,0x0e,0xca,0x71,0xee,0x01,0x7e,0xf6,0x11,0x68,0x8e,0x1a,0x4e }, { 0xf4,0xe8,0x6e,0x99,0x20,0x3c,0xa9,0xa8,0x19,0xfb,0x27,0x45,0x52,0x8c,0x55,0x99,0xa5,0x7b,0xb4,0xf5,0x9c,0x48,0x29,0x19,0x92,0x08,0xed,0x9a,0x77,0x08,0x25,0x64 }, { 0xd5,0xc4,0xd2,0x24,0x3e,0x76,0x5d,0x04,0x76,0x66,0x6c,0xa4,0x2d,0x0b,0xac,0x9a,0x84,0xaa,0xc2,0x15,0xb1,0x00,0xbe,0xe2,0xfd,0x96,0x4e,0x15,0x30,0xda,0x61,0x4d }, { 0xc4,0xcf,0xab,0xfc,0x19,0x83,0x2f,0xd1,0x87,0x0e,0x35,0xb3,0x16,0x2a,0x2b,0x8e,0x65,0xa0,0x42,0x3b,0xb1,0x4c,0x1c,0x03,0xbf,0xeb,0xea,0x01,0x1a,0xe4,0x7d,0x09 }, { 0x56,0x46,0xfc,0x99,0x69,0xbd,0x53,0xe1,0x57,0xe7,0x8d,0x5a,0x05,0x1a,0x95,0xfb,0x3a,0x0e,0xd2,0x12,0x9b,0x9c,0x1d,0x58,0x4b,0x12,0xee,0x74,0xc0,0xab,0x8f,0x1e }, { 0x58,0x1f,0x41,0xe1,0x16,0xde,0x0f,0xe8,0x5f,0x9f,0x39,0x69,0x05,0x46,0xbf,0x6d,0xea,0x88,0xc5,0xf3,0xb4,0x39,0x55,0x60,0x79,0x03,0xf8,0xa1,0xf7,0x7d,0x05,0x03 }, { 0xa4,0xc4,0x06,0x76,0x51,0xa4,0xd7,0x90,0x5e,0x14,0xbf,0x61,0x74,0x84,0x97,0x3c,0xf6,0x0a,0xae,0x67,0x65,0xa6,0xe5,0x28,0x3a,0x1e,0x50,0xb0,0x6d,0x38,0x9a,0x14 }, { 0x43,0xf8,0x26,0xb5,0x25,0xe5,0x99,0x6a,0x84,0xa0,0xa5,0x1c,0x8f,0xd8,0xcb,0xce,0x8b,0xb3,0x91,0xe5,0x11,0x38,0x43,0x3a,0xe5,0x38,0x09,0x10,0xee,0xc0,0x4b,0x4a }, { 0x11,0x1d,0xa8,0xc0,0x08,0x07,0xe0,0x42,0xff,0xb4,0x88,0x97,0xb3,0xeb,0x1e,0x25,0x7c,0xe9,0xa1,0x00,0x5b,0x6e,0x9e,0x07,0xf7,0xfa,0x59,0xe7,0x5b,0x68,0xc3,0x5a }, { 0x6a,0xd8,0x55,0x3b,0x8c,0x90,0x56,0x6d,0xdd,0x90,0x42,0xff,0x84,0x55,0x3d,0xa4,0x9f,0xb2,0x56,0x53,0x2b,0x52,0x20,0x7b,0x9d,0xfa,0x4a,0xb8,0x35,0x35,0xd6,0x3b }, { 0x09,0xe8,0x7f,0x29,0xf5,0xa7,0xed,0x7e,0x23,0x42,0x44,0xf4,0x78,0x01,0x71,0x36,0xdd,0xed,0xf5,0x58,0x4d,0x69,0x33,0x19,0x8f,0x3f,0x63,0xd2,0x87,0x97,0x82,0x59 }, { 0x1c,0x0b,0x70,0xce,0xc0,0xbb,0xd0,0x96,0x36,0xc5,0x49,0xd6,0xa8,0x28,0x8b,0x66,0x4b,0x8c,0x31,0x59,0x31,0x3f,0x27,0x91,0xa0,0x52,0x71,0x3d,0x8e,0x95,0x2d,0x18 }, { 0xf1,0x97,0xc8,0xd8,0x37,0x9e,0xcb,0xbd,0xe1,0xd0,0x39,0x92,0x55,0xe6,0x10,0x8a,0x62,0x4a,0x17,0x4b,0x81,0x16,0x11,0xe9,0x01,0x50,0x66,0x49,0xa3,0xc2,0xdf,0x0a }, { 0xde,0x0b,0xb8,0xe1,0x12,0x1c,0xe1,0x76,0xdf,0x5c,0xdb,0xd2,0x6f,0x7a,0xc5,0x75,0x10,0x17,0x71,0x3a,0x19,0xf4,0x5e,0xa8,0x34,0x4f,0xb2,0xae,0xb6,0xec,0x0c,0x23 }, { 0x7f,0xe4,0xe7,0x36,0x51,0xa8,0x17,0xcb,0x02,0xe2,0xea,0x99,0x7d,0x2c,0xc6,0xfe,0x6a,0xed,0x8e,0x4a,0xbc,0x4a,0xb8,0x66,0xe5,0x2c,0xed,0xea,0x04,0xd0,0x8d,0x14 }, { 0xeb,0x2a,0x73,0x9d,0x41,0x78,0xd7,0x07,0xc3,0x58,0xd1,0x99,0xf5,0xf9,0xa8,0x3b,0xd8,0xfd,0xf5,0xc5,0x4d,0xe3,0xb1,0x6d,0xda,0x2d,0x41,0xb2,0xf8,0xe5,0x3d,0x14 }, { 0x46,0x64,0x7a,0x0d,0x2d,0x13,0xb4,0x16,0xcc,0x95,0x3e,0xbd,0x89,0xb7,0x5a,0xec,0x0c,0xe5,0x74,0x35,0xba,0x88,0x4e,0xfd,0x3c,0x7d,0xcf,0x4e,0x6a,0x42,0x35,0x21 }, { 0xba,0xcf,0xff,0x26,0x47,0x2d,0x4a,0xc7,0x72,0x76,0xda,0x30,0x7c,0xf8,0xfb,0x67,0x55,0xbb,0x74,0xc1,0x92,0x0a,0xfb,0xd0,0x9f,0xfa,0x2b,0xe1,0xfc,0xe2,0x81,0x2a }, { 0xc2,0x1d,0x44,0x8c,0x49,0x1b,0x62,0x15,0x69,0xff,0x3b,0xdb,0xfe,0x36,0x75,0x64,0xfd,0x75,0xcd,0x8f,0xe9,0xbf,0xe0,0x48,0x3d,0xdd,0x52,0xb4,0x0e,0x70,0xb0,0x1d }, { 0x8d,0xad,0xb3,0xad,0x10,0xcf,0xd7,0x76,0x10,0x3c,0xed,0xaa,0x1b,0x31,0x39,0x0b,0x8d,0x8d,0x58,0xab,0xe1,0x38,0xb6,0x3c,0x87,0xae,0x27,0x58,0xa1,0x17,0x64,0x76 }, { 0x67,0xf5,0xa6,0x41,0x7c,0x44,0xac,0xe9,0x58,0xbe,0x1f,0x1f,0x80,0x8d,0xc5,0x8b,0xbc,0x02,0x28,0x35,0xd1,0x1a,0xe6,0x9b,0x40,0x6a,0xed,0x96,0x85,0xaa,0xd9,0x28 }, { 0x83,0x24,0x5c,0x8f,0xb1,0x70,0x05,0x99,0x83,0x32,0x8f,0x61,0x8b,0x6e,0x1d,0xf4,0x30,0xf7,0x53,0x16,0xf7,0xcb,0x3e,0x0c,0x20,0xcd,0x82,0xa9,0x03,0xf2,0x27,0x29 }, { 0xa4,0x9a,0xf0,0xd3,0xf1,0xb0,0x5c,0x6e,0xd1,0x31,0x66,0x0c,0xcf,0xd1,0x1c,0x71,0x53,0x02,0x9c,0xa6,0xa7,0x92,0x1e,0x73,0xb4,0x13,0x38,0xfd,0xc9,0xf2,0x63,0x3b }, { 0x6b,0x5f,0xff,0x46,0xbd,0x5c,0x7c,0x9a,0x58,0xdd,0xd3,0xf5,0xbb,0x77,0x9c,0x47,0xad,0x00,0xf7,0x58,0xc5,0x92,0x00,0xb7,0x3b,0x17,0x86,0xa9,0xae,0x84,0x6c,0x01 }, { 0xab,0x41,0xcc,0xcd,0x3b,0x5d,0x57,0x77,0x40,0x35,0x83,0x79,0x5f,0x71,0x2a,0xf0,0x88,0x93,0xec,0xb1,0xa7,0x1c,0x4e,0x47,0x17,0x63,0x6f,0x26,0x14,0x04,0x45,0x70 }, { 0xa4,0x5c,0xc2,0x5a,0xe0,0x44,0xb8,0xad,0x9f,0x0b,0x67,0x32,0xa7,0x33,0x01,0x13,0x92,0x85,0x1d,0x3b,0x5f,0xb8,0x4f,0x0b,0xd9,0x8a,0x5f,0xa7,0xc2,0x00,0x13,0x6e }, { 0xf9,0x29,0xf6,0x70,0xfd,0x8c,0x0e,0x71,0xe3,0x2b,0x00,0xab,0xd2,0xed,0x83,0x5f,0xc9,0x0d,0x26,0x5d,0x25,0x68,0xf5,0x6d,0x79,0xf7,0x8c,0xb5,0x79,0x6a,0x71,0x74 }, { 0x45,0x74,0x8f,0x88,0x67,0x27,0x8f,0x64,0x06,0x22,0xf4,0x66,0x48,0xbf,0x1a,0x38,0x5a,0x82,0x03,0x5b,0xde,0x65,0x5b,0x03,0xcb,0x3e,0x11,0xd7,0xde,0xb2,0x33,0x5d }, { 0xf4,0x4c,0xb6,0x3f,0x71,0x62,0xfb,0x39,0xdd,0x2b,0x91,0xed,0x9b,0x95,0x27,0x72,0xb8,0x30,0x7a,0xdf,0x99,0x09,0xba,0x11,0x4e,0xa9,0x4d,0x3b,0x41,0x0f,0xf9,0x63 }, { 0x02,0x65,0x18,0x81,0x56,0x16,0xd4,0x0d,0x5b,0x4e,0xff,0xd1,0x3e,0xa3,0x87,0x5c,0xc1,0x9d,0x3c,0x64,0x8e,0xfb,0x6e,0x42,0x09,0x1d,0x4c,0xdf,0xf3,0x67,0xb3,0x75 }, { 0xea,0xa0,0x44,0xeb,0x2d,0xae,0x96,0x12,0xd8,0x4f,0x8b,0x49,0x57,0xf2,0xfd,0xa6,0x43,0x67,0xeb,0x15,0xc9,0x27,0xb5,0x4f,0xca,0xcd,0x14,0xc8,0xc3,0x60,0xf8,0x56 }, { 0x9c,0x91,0x03,0xd2,0xa8,0x3f,0x76,0xc7,0x76,0x0e,0x81,0x6e,0xaf,0xeb,0xa0,0xc9,0xbc,0x15,0xf7,0xdc,0x25,0x1d,0xf0,0x8c,0xa5,0x76,0xcb,0xa8,0x85,0xbd,0x50,0x43 }, { 0x65,0x97,0xe3,0x4d,0x6b,0x84,0x20,0x34,0xc6,0x6f,0x78,0x5e,0x28,0x47,0xd2,0x7a,0xa2,0x96,0x2a,0x83,0xa0,0x94,0x92,0xcc,0x32,0x35,0x13,0xa8,0xe7,0xec,0xce,0x60 }, { 0x8b,0x02,0x18,0x93,0x66,0x58,0x11,0x59,0xd7,0xf0,0x95,0x72,0x4e,0x37,0x49,0xe4,0x07,0xbd,0x34,0xb5,0x6c,0xc2,0x3e,0x73,0x19,0x01,0x2d,0x3f,0x68,0x17,0x87,0x21 }, { 0xc4,0x57,0xb6,0x1d,0x13,0x42,0x2e,0xb0,0xbc,0xb6,0x2a,0x9d,0x77,0x07,0x82,0x68,0xfc,0x79,0xd6,0xa1,0x53,0xd0,0x53,0x76,0x5d,0x3b,0xa1,0xe1,0x22,0x12,0x63,0x00 }, { 0x9f,0x82,0x83,0x78,0x3f,0x11,0x0b,0x65,0x27,0x30,0x3f,0x85,0xb3,0x71,0x61,0xd4,0x69,0x7c,0xbd,0xb0,0xbf,0xf0,0x1a,0xa1,0x3d,0xab,0xc6,0xec,0x87,0xd2,0x07,0x4f }, { 0x67,0x1a,0xfb,0xe9,0x9e,0xb1,0xe2,0x3b,0xf4,0x35,0x2e,0xc8,0xed,0xe5,0xa8,0x5d,0xa4,0xa5,0x57,0x60,0xc7,0xaa,0x02,0xeb,0xdd,0x3f,0xba,0xd6,0x90,0xc5,0xae,0x30 }, { 0x72,0x35,0x3f,0x3d,0xe7,0x6e,0xdb,0x23,0x59,0xfe,0x48,0x08,0x31,0xdf,0xbb,0xe9,0xca,0x5a,0xf3,0xa3,0x7a,0x9c,0x2d,0x47,0x5b,0x04,0x96,0xd4,0x18,0x6b,0x55,0x12 }, { 0x26,0x30,0x8c,0x96,0x90,0x24,0x6d,0x0f,0x87,0x37,0xb1,0x63,0x46,0x46,0x93,0x62,0x7f,0x68,0x80,0x23,0x07,0x21,0x89,0xdf,0x7a,0x5f,0x01,0x37,0x91,0x35,0x03,0x7c }, { 0x7b,0xaa,0xc0,0xfd,0x67,0x4e,0xec,0xe1,0x66,0x06,0xdc,0x93,0xe4,0xf9,0x4f,0xc1,0xbb,0xae,0xdf,0x77,0xe5,0x47,0xa5,0x6c,0x02,0x58,0xdc,0x95,0x5c,0xde,0x62,0x17 }, { 0xb9,0x0f,0x84,0xdd,0xfd,0xdd,0xb2,0x97,0x38,0x7f,0xda,0x37,0x84,0x87,0x26,0xfe,0xf6,0x95,0x56,0xdf,0x7a,0x75,0x46,0x68,0xb8,0x69,0x24,0xac,0x03,0x41,0x76,0x58 }, { 0xd7,0xe5,0xa5,0xca,0x28,0x94,0x61,0xcd,0x2f,0xe2,0xbc,0x47,0xd6,0x1d,0xee,0x70,0xb5,0x48,0x34,0x95,0x41,0xb6,0x7a,0x54,0xd4,0x30,0xff,0x0c,0xbc,0xe3,0xd6,0x5d }, { 0x05,0x31,0xf7,0x7b,0x60,0xe6,0xbb,0x28,0xfc,0xf4,0x34,0x28,0x13,0x38,0x93,0xd4,0x95,0x87,0x3e,0xd2,0x4a,0xb9,0xc2,0xa5,0x03,0x22,0xa4,0xd0,0x99,0x79,0xd2,0x49 }, { 0x13,0xe2,0x91,0x56,0x2c,0x1f,0x0c,0xc8,0xab,0xed,0x40,0x43,0x82,0x8c,0xa1,0x5a,0x78,0xa3,0x1f,0x33,0x8d,0xd1,0x9c,0xc0,0x99,0x0c,0x7b,0xfe,0xbf,0x99,0x64,0x56 }, { 0x30,0x42,0x0a,0x74,0x98,0x22,0x3a,0x4e,0xfc,0x4e,0xcd,0xd6,0x7d,0xdc,0xca,0xed,0x9c,0x0a,0x38,0xc3,0x1f,0x59,0xd7,0xc4,0xa7,0xae,0x65,0xe6,0x6f,0x1f,0x75,0x66 }, { 0xb6,0xda,0xdf,0xd9,0xc2,0xbb,0x56,0x48,0xaf,0xeb,0x2c,0x7a,0x06,0x2f,0x02,0x99,0x77,0xac,0x38,0x09,0xc5,0xd8,0x76,0x5d,0xeb,0xfb,0x30,0x24,0x25,0xc9,0x93,0x4d }, { 0xfe,0x85,0x3a,0x6c,0xaf,0x57,0x19,0xeb,0xfb,0x88,0x70,0x0a,0xe5,0x18,0x13,0x71,0xb1,0x7b,0x45,0x17,0x57,0x4b,0x6f,0xad,0x88,0x8b,0x71,0x94,0xa8,0x0d,0x91,0x2c }, { 0x82,0x5a,0xaf,0xf3,0x00,0x87,0x75,0x23,0x0b,0x80,0x35,0x5c,0x72,0x46,0xb0,0x97,0xa7,0x28,0xea,0xde,0x0a,0x6f,0x1f,0x50,0xd8,0x18,0x1d,0xa1,0xf4,0x52,0x2c,0x69 }, { 0x16,0x86,0xd7,0x6c,0xe5,0x91,0xa7,0x65,0x1e,0x28,0x91,0xb9,0x7e,0x4c,0x86,0x2a,0x0d,0xc4,0xaa,0xb3,0xd4,0x63,0x60,0x61,0x1f,0xc6,0x98,0x70,0x09,0x52,0x4f,0x63 }, { 0x53,0xbd,0x97,0x70,0x29,0xa8,0xf6,0xd4,0xfa,0x38,0x7d,0xf8,0x17,0xd2,0x52,0x79,0x50,0x1a,0x75,0x9a,0x24,0xe2,0x3c,0xef,0x79,0x98,0x0e,0x28,0x99,0xf0,0x10,0x79 }, { 0xd1,0x03,0x27,0x04,0xf2,0xae,0x23,0x80,0x76,0x2e,0xee,0x06,0x00,0x16,0x5d,0xc8,0x26,0x95,0x41,0x98,0xe6,0xc0,0xe7,0x92,0xc4,0x8a,0x52,0x14,0xe1,0x80,0x73,0x5d }, { 0xdb,0xa7,0xd5,0x4c,0xcc,0x10,0xd1,0x3e,0xf5,0xaa,0xb3,0x0c,0xc5,0xd1,0x7c,0xa4,0xc4,0x5e,0x6b,0x8e,0x3d,0xec,0x3a,0x31,0x0f,0xda,0x9d,0x47,0x07,0x9d,0x17,0x01 }, { 0x36,0x06,0xe2,0xd3,0x45,0x9f,0xb0,0xeb,0x81,0x18,0x6a,0x79,0xf3,0xc7,0x69,0x97,0x12,0x53,0x73,0x43,0x39,0x76,0xe2,0xa0,0xb4,0x92,0xd2,0xa6,0x64,0x06,0x32,0x2d }, { 0xb3,0x54,0x22,0xd8,0xd6,0x79,0xc6,0xc9,0xff,0x24,0xdd,0xfc,0xb2,0x27,0x3c,0x3e,0xb9,0x3f,0x86,0xfc,0xf9,0xe5,0xb1,0x07,0x0a,0xea,0xa3,0x44,0xbd,0x89,0xe9,0x21 }, { 0x01,0x41,0x19,0xb4,0x1a,0x0f,0xb3,0x21,0xcd,0x15,0x8c,0xfa,0x51,0xf8,0x6b,0x82,0x96,0xbd,0xce,0x06,0x5e,0x5d,0xc4,0x50,0xff,0x17,0x9c,0x16,0x7e,0xbd,0x8b,0x0a }, { 0x26,0xad,0x5e,0x96,0xa3,0x36,0x4d,0x1d,0x1e,0xbb,0xd6,0xbb,0x94,0x23,0x30,0x26,0x91,0x99,0x72,0xa0,0xdf,0xeb,0xe6,0xef,0x21,0xf5,0x33,0x8b,0xf2,0xda,0xca,0x30 }, { 0x24,0x17,0x02,0x35,0xd3,0xfc,0x81,0x27,0x28,0x6b,0x68,0x91,0x29,0xde,0xb1,0x0b,0xe0,0x8e,0x5a,0x2c,0x7f,0x96,0x37,0x61,0x28,0x29,0x39,0x39,0x22,0x81,0xb2,0x14 }, { 0x35,0xe2,0x51,0x4c,0x94,0xb9,0x30,0x30,0x87,0xb6,0xd2,0xe3,0xfe,0x83,0xd0,0x56,0xdc,0xc0,0xd2,0x6f,0x44,0x54,0xca,0x1a,0x2c,0xe1,0x6c,0xf8,0x78,0x1b,0x4e,0x6e }, { 0x04,0x9c,0xed,0x05,0x96,0x92,0x68,0x9b,0x56,0x6f,0x63,0x34,0xf4,0x31,0x47,0x7e,0x28,0xc6,0xf6,0xdb,0x52,0xcf,0x86,0x69,0x98,0x39,0x12,0x55,0x68,0x89,0x01,0x4d }, { 0xdd,0x26,0x39,0x4f,0xab,0xc7,0xdd,0x3d,0x40,0xe9,0xf5,0x82,0x00,0xdc,0x79,0xd7,0x05,0xfc,0x7c,0x61,0x5b,0x6a,0x9a,0x7f,0x64,0x73,0xfa,0xfe,0xac,0x5a,0xf3,0x37 }, { 0xae,0xf9,0x1e,0xac,0xff,0x83,0xd5,0x0f,0xc3,0x5c,0x5c,0x5c,0x3b,0xe7,0x1d,0x84,0x54,0x6d,0xaf,0xc2,0x4d,0xd0,0x15,0x2c,0xc0,0xbc,0xc8,0xb4,0x3a,0xa4,0x99,0x79 }, { 0x58,0xbb,0xb0,0x19,0xf3,0x41,0x77,0x58,0x04,0x74,0xdf,0xcd,0x31,0x39,0x00,0x08,0x1e,0x24,0xe6,0xed,0x30,0x4a,0x08,0x04,0x3f,0x0b,0x6a,0x9e,0xe1,0xf5,0x9f,0x5d }, { 0x2d,0xe1,0x43,0x4f,0xef,0xb9,0x44,0x27,0x5b,0x87,0xd7,0x8a,0xf3,0xb4,0x7f,0x0f,0xd2,0x73,0xc1,0xdf,0x6e,0x91,0x5e,0xc3,0xb5,0x7b,0xd7,0x5f,0xeb,0xd5,0x05,0x13 }, { 0xea,0x6b,0x13,0x6b,0xd9,0x6f,0xc1,0xcb,0x91,0x90,0xf8,0x9d,0xb9,0xe7,0xfe,0x18,0xd8,0x03,0xb2,0xcf,0x06,0xed,0x89,0x0b,0xf0,0x6d,0x91,0xeb,0x3b,0xa2,0xd5,0x17 }, { 0x45,0x32,0x1d,0xe5,0x5f,0x05,0xe0,0xe8,0xbb,0x62,0xc9,0x8d,0xc3,0x07,0xb4,0x24,0x02,0x0b,0x08,0x2b,0x5b,0xff,0x9a,0x3b,0x98,0xa1,0xf0,0xf8,0x45,0x55,0xdf,0x4a }, { 0xc9,0x20,0xbf,0x9a,0x5d,0x70,0x47,0x5d,0xac,0x11,0x53,0xa7,0xcb,0x0c,0x01,0x45,0x12,0x5c,0xc1,0xff,0x81,0xf4,0xb9,0x31,0x5b,0xfd,0x9b,0x0a,0x7a,0x5f,0x07,0x20 }, { 0x99,0x3f,0xb2,0xf0,0xa8,0xb6,0x3b,0xb8,0xe8,0x45,0x13,0xce,0x7b,0xc8,0x2e,0x86,0x2f,0x43,0xba,0x3e,0xb0,0x53,0xf4,0x86,0xc2,0x5e,0xae,0xe2,0x6c,0x58,0x13,0x3d }, { 0x79,0x86,0xe9,0xd8,0xc5,0x5e,0x4e,0x46,0xf7,0x2e,0x6d,0xb4,0x1c,0x1d,0xbf,0x4c,0xe4,0xc6,0xb9,0x23,0xfd,0xb4,0x50,0x65,0x0a,0xf6,0xa4,0xe4,0x91,0xa9,0x33,0x4a }, { 0xc6,0xff,0xb8,0x3e,0xbc,0x90,0xdb,0xf5,0xa8,0x60,0xa2,0x52,0x65,0xa6,0xa8,0x4d,0x88,0x0c,0x91,0xe9,0xa5,0x75,0x03,0xbb,0x26,0x25,0x95,0xa3,0x1f,0x0f,0x14,0x58 }, { 0x5c,0x1d,0x46,0x11,0x44,0xfc,0x18,0xd9,0x87,0xa7,0x4d,0x85,0x5f,0xba,0xe5,0xa2,0x47,0x46,0xd1,0x2d,0xac,0x89,0x00,0xe6,0xa9,0x19,0x08,0x24,0xc8,0xe5,0x4a,0x4e }, { 0xd6,0x7e,0x83,0x7f,0x60,0xcb,0x6e,0xfe,0xd7,0x00,0x80,0x29,0xdd,0x4e,0x51,0x93,0xc1,0x01,0xb9,0x52,0x98,0x3c,0x31,0x2c,0xd3,0xec,0x5a,0xf7,0x0d,0xca,0x28,0x12 }, { 0x7c,0x29,0x7f,0x07,0xc2,0x59,0x6d,0x43,0xae,0x97,0x1e,0x2e,0x54,0x0d,0x3b,0xdb,0x2f,0x98,0xa5,0x85,0xc1,0x89,0x31,0x44,0xa0,0x9e,0x79,0xe2,0x42,0xfe,0xad,0x7c }, { 0xae,0x09,0x91,0x25,0x29,0x83,0xbc,0x08,0xaf,0x26,0xd1,0xec,0xd6,0x9c,0x1a,0xf0,0x9f,0xcf,0xad,0xf8,0x85,0xdf,0x4e,0xca,0xb5,0xb1,0xd3,0x70,0x8e,0x17,0x51,0x6b }, { 0x30,0x90,0xdd,0x7e,0x64,0x77,0xe6,0x6d,0x0a,0xb0,0x79,0x2b,0x49,0xe9,0xbb,0xc9,0x44,0xa2,0x99,0x4b,0x78,0x2f,0x9e,0xbc,0x06,0x89,0x32,0xf3,0x66,0x11,0xb6,0x5f }, { 0x33,0xa5,0x0f,0x46,0x5f,0x73,0xef,0x0b,0xb1,0xf6,0x56,0x76,0x6a,0x17,0xd7,0xeb,0xbd,0x71,0x45,0x74,0x80,0x08,0xa2,0xd1,0xf9,0xdb,0xfb,0x57,0x8d,0x55,0x95,0x0b }, { 0xa3,0xad,0xbc,0x21,0x57,0x21,0x70,0xaa,0x1f,0xb0,0x14,0x91,0xb7,0xdc,0xa8,0x1a,0x9a,0x55,0x4c,0xc1,0x7c,0xe2,0x3c,0x6e,0x83,0x06,0xb5,0xb3,0x24,0xb1,0x4b,0x30 }, { 0x09,0x56,0x41,0x4e,0x3d,0x91,0x0b,0x4e,0x62,0xb9,0x40,0x17,0xa9,0xd3,0x1f,0x67,0x6e,0xf2,0x35,0x59,0xc2,0xfe,0x69,0x1f,0x79,0xe7,0x81,0x3a,0x93,0x11,0x0e,0x41 }, { 0x16,0x78,0xb5,0xa4,0xaf,0x75,0x55,0xa6,0x84,0xcb,0x33,0x3c,0x72,0x35,0x83,0x96,0x81,0x08,0x86,0x53,0x3f,0x43,0x70,0xac,0x68,0x6e,0xe2,0x10,0xdc,0x2c,0x07,0x58 }, { 0x44,0xa7,0x85,0x3e,0x98,0x11,0x16,0xc8,0xd2,0x11,0xde,0x58,0x49,0x44,0xf5,0x76,0x3d,0x8e,0xb3,0x28,0x9e,0x2b,0xa7,0x8e,0x7b,0xfe,0x79,0x51,0x27,0x7b,0xe1,0x33 }, { 0x55,0xf9,0x8b,0x57,0xcf,0xe6,0xb2,0xbb,0xa8,0x69,0xb8,0x70,0x87,0xcd,0xa7,0xa5,0xb9,0x06,0x23,0x9f,0x98,0x41,0x81,0x90,0x44,0x2c,0xe6,0x7f,0x72,0x83,0xd5,0x03 }, { 0xcf,0x15,0xef,0x36,0x68,0x64,0xee,0xd7,0x42,0x60,0x3f,0xc2,0x7e,0xd1,0x72,0xac,0x5b,0xb2,0x9f,0xe0,0x7b,0xe2,0x1e,0x6c,0xe7,0x52,0xc6,0xf4,0x30,0xa5,0xe1,0x26 }, { 0x06,0x11,0xb9,0x3f,0x63,0x0a,0xa8,0x17,0x2d,0xc8,0x28,0x09,0xd5,0x7a,0x0f,0x9c,0x53,0x5d,0xe7,0xdc,0x25,0xb7,0x97,0xf8,0x98,0x8b,0xbe,0x4f,0x2d,0xb1,0x47,0x3e }, { 0xfe,0xba,0x96,0xda,0x07,0x00,0x35,0xe6,0x3c,0xcb,0x52,0x09,0xb6,0xc2,0x0a,0x8f,0x8d,0xa1,0xe1,0x56,0xa2,0x37,0x4a,0x6a,0x7b,0x2a,0x5f,0x39,0xeb,0x90,0x0b,0x36 }, { 0xd6,0x5a,0xf8,0x09,0x56,0xe7,0x52,0xcc,0xf1,0x62,0xf2,0x02,0x53,0x5e,0x8e,0x6e,0x6f,0x74,0x85,0xf9,0x74,0x79,0xaa,0x6c,0x9b,0x3b,0xe8,0x8d,0x00,0xe9,0x28,0x76 }, { 0x09,0xfe,0x86,0xc0,0x14,0x74,0x1c,0x63,0x30,0x2b,0x8d,0xc5,0x2b,0x58,0x62,0x8c,0x7c,0x49,0x22,0x27,0xa2,0x82,0x21,0x7d,0x26,0x79,0x34,0xba,0xf4,0xda,0x38,0x6b }, { 0xe0,0x19,0x55,0x3a,0xe2,0x26,0x7b,0x6b,0x3a,0xde,0x66,0x44,0xce,0x94,0x15,0xa7,0x3e,0xdb,0x75,0x1f,0xde,0x1e,0xb5,0xd5,0x22,0xfa,0xf8,0xff,0x32,0x67,0x99,0x11 }, { 0x2a,0x40,0x9d,0xdc,0xd9,0x81,0x45,0x93,0x01,0x93,0x61,0xee,0x3d,0xc1,0x59,0x32,0xcf,0xcb,0x4f,0xf7,0x88,0x6d,0x43,0x81,0x49,0xae,0x9f,0xff,0x9d,0x17,0x2e,0x64 }, { 0xfa,0x57,0x3a,0xfa,0x86,0xec,0x1e,0x23,0xa5,0x6b,0x0d,0x0e,0x67,0x79,0x03,0xf7,0x81,0xa8,0xca,0x0c,0xa6,0x20,0xa0,0x3d,0xd7,0x9d,0xc4,0x67,0x90,0x92,0xa1,0x48 }, { 0x30,0xe0,0x60,0x8a,0xdc,0xad,0x12,0x35,0xa2,0x9e,0x8a,0xb0,0x06,0x09,0xc3,0x19,0xf4,0x2d,0xee,0x34,0xfb,0xe2,0x61,0x4c,0x57,0x53,0x24,0x54,0x83,0x59,0xf1,0x79 }, { 0x61,0xce,0x81,0xf7,0x35,0x50,0x80,0xf5,0x00,0xd8,0x88,0xe8,0x94,0x61,0x86,0xfb,0xc3,0xd8,0xda,0x74,0xf5,0xe5,0xec,0x72,0x0c,0x33,0xcb,0x69,0x4e,0xe4,0xb3,0x22 }, { 0x85,0x52,0xcb,0x58,0x36,0x08,0x0b,0x67,0x0b,0x76,0xc8,0x6b,0xc8,0xf9,0x11,0x74,0x8c,0xf2,0x73,0x1d,0x48,0x6e,0xf3,0x17,0xe0,0xbe,0xd8,0x2b,0xa8,0xcb,0x0a,0x43 }, { 0x6d,0x15,0x9d,0x2f,0x88,0x8b,0xb7,0x2d,0x18,0x9e,0xa0,0x4f,0x8c,0xff,0x6f,0x33,0xb7,0x83,0xfe,0x50,0x16,0x04,0x61,0x28,0x72,0xcc,0x34,0x88,0xdf,0x79,0x48,0x0b }, { 0x91,0x47,0xde,0x37,0xb3,0x7a,0xfb,0xc2,0xd1,0x53,0xbb,0x72,0xb1,0x4c,0xb9,0xfa,0xd3,0x66,0xbf,0x4a,0xba,0xb4,0x3d,0x7d,0x06,0x7b,0x2e,0xa0,0x5e,0x5a,0xe3,0x18 }, { 0xa2,0x0e,0x67,0x78,0x99,0x9a,0xd0,0x0e,0xd5,0xf5,0xcc,0x0d,0xf9,0x70,0xc9,0x20,0x24,0x07,0x80,0xcb,0xa3,0xca,0x35,0x07,0x14,0x7e,0x84,0x8a,0x2d,0x52,0xb2,0x28 }, { 0xfb,0xb1,0xdc,0x5c,0x64,0xed,0x08,0x6e,0x13,0x59,0xcf,0x5d,0x90,0x46,0x70,0xc0,0x95,0x1b,0xd0,0x01,0xfb,0x5e,0x4c,0xf3,0xcf,0x56,0xa9,0xa9,0x05,0x87,0x7f,0x2f }, { 0x94,0x2e,0x8d,0x41,0x92,0x9c,0x8e,0xf6,0x3c,0xe3,0xab,0x38,0x81,0x5e,0x31,0x42,0x14,0x10,0x09,0xed,0xb0,0xb0,0xae,0x9e,0x00,0xca,0x71,0xb0,0xa7,0x1b,0x17,0x21 }, { 0x4a,0xd0,0x13,0xd1,0x62,0xaf,0xc1,0x58,0x70,0x1e,0xdf,0x5b,0x24,0x3e,0x42,0x83,0x0e,0x5a,0x51,0xb9,0xf3,0x02,0x40,0x86,0x00,0xe2,0x0d,0x4e,0x42,0xa2,0x97,0x55 }, { 0x0d,0x06,0x71,0x04,0xd0,0x0f,0x9f,0xf9,0xdb,0x4f,0x82,0x92,0xe9,0x5b,0x4c,0x0c,0x0a,0x56,0xf3,0x15,0x7f,0x2a,0x15,0xf8,0x74,0xad,0x0b,0x79,0xa4,0x61,0xe2,0x7f }, { 0x3c,0x03,0x37,0x30,0x23,0x97,0xdf,0x1f,0x89,0xad,0x7b,0xc1,0xf8,0x01,0x4a,0xe7,0x02,0x62,0x21,0xb6,0x44,0x04,0xde,0x6c,0x89,0x59,0x98,0x69,0x0a,0xc6,0xb9,0x12 }, { 0xbf,0x27,0xee,0x3c,0xf3,0x59,0x6f,0x3c,0x88,0xc4,0x09,0x7b,0xcc,0xe0,0x39,0xe8,0x7d,0xb5,0xfa,0xd7,0x1f,0x67,0x3e,0xd1,0x30,0x96,0x1e,0x74,0x7a,0x59,0xd1,0x17 }, { 0x1f,0xda,0xe5,0x8f,0x07,0xaa,0x07,0xab,0x1e,0x80,0x2a,0xd0,0xf2,0x92,0x6c,0x2b,0x51,0x7f,0x41,0xc7,0xc7,0x26,0xc2,0x90,0x87,0xa4,0x46,0xf1,0xb9,0x31,0xcd,0x78 }, { 0xb1,0xe3,0x73,0xe4,0x35,0xb9,0x34,0x31,0x30,0x35,0xc2,0x14,0xec,0xb2,0x99,0xbf,0xd2,0xff,0xeb,0x62,0x7e,0x93,0xfe,0xab,0x56,0x0f,0xcb,0x3d,0x7e,0x1f,0xf1,0x52 }, { 0xb8,0x58,0xec,0x64,0x5d,0x14,0x9e,0xbf,0xf2,0x68,0x8e,0x05,0x36,0x70,0xd2,0x2b,0x80,0x61,0x07,0x1e,0x45,0x91,0x22,0xd6,0x0c,0x0a,0x0f,0xc2,0xf3,0xcb,0xd9,0x36 }, { 0x9c,0x35,0x06,0x4e,0xbe,0x98,0x7c,0x17,0x7b,0xe1,0xf9,0x55,0xa8,0x8b,0xee,0x72,0xf0,0x6b,0x90,0x31,0x73,0x94,0x64,0x58,0xfe,0x02,0x08,0x13,0x42,0xbf,0xdd,0x46 }, { 0xd4,0x2b,0x60,0xff,0xab,0x4f,0x32,0xfc,0xb0,0x61,0xf5,0xfb,0x65,0x6f,0x0a,0x53,0x57,0x81,0x7c,0x33,0x71,0x0a,0x17,0xdb,0x4e,0x20,0xa2,0xf8,0x37,0x41,0xd9,0x3b }, { 0xbc,0x4c,0x41,0x26,0x6d,0xd5,0x55,0xea,0x44,0x57,0x53,0x3e,0x46,0x87,0xbe,0x75,0x96,0x69,0x1a,0xea,0x89,0xf3,0xd0,0xd0,0x1f,0x2b,0x2a,0xcc,0x1c,0x51,0x82,0x3a }, { 0x9c,0x35,0x03,0x63,0xbb,0xaf,0x75,0xd6,0xbf,0xb7,0xa1,0x73,0xc8,0xfc,0x1b,0xbb,0x6f,0xbb,0x7d,0xf4,0x5e,0x67,0x28,0x94,0x90,0x2c,0x38,0xda,0x93,0xe5,0x5d,0x58 }, { 0xbd,0x49,0xcf,0xc5,0x3f,0xfc,0xab,0x6a,0x6f,0x85,0xc7,0xf9,0xfb,0xad,0x32,0x8d,0xc8,0x00,0x3a,0x89,0x35,0xaf,0xbd,0xee,0x65,0x0b,0x41,0x43,0xab,0x6e,0xe6,0x1d }, { 0x3b,0x6f,0xe3,0xaf,0xb4,0x3c,0xdf,0x78,0x18,0xa3,0xc0,0x53,0xd2,0x76,0x44,0xb0,0xad,0xd9,0x65,0x33,0xb2,0x4b,0x50,0x6e,0x86,0xbe,0xe9,0x1a,0x5b,0xca,0x77,0x59 }, { 0xb9,0xca,0x85,0xd5,0x04,0xac,0xf8,0x61,0xe6,0xa0,0xf0,0x3a,0x22,0x50,0xc1,0x2b,0xc1,0xf6,0x03,0x6a,0xeb,0xb8,0x02,0x72,0x09,0x6c,0x20,0x9a,0xab,0x5b,0xc5,0x77 }, { 0x29,0x31,0x0e,0x7b,0x19,0x56,0x47,0x73,0x65,0x34,0x0b,0x8c,0x7b,0xde,0xc5,0xae,0x86,0x2b,0x73,0xda,0x7d,0xb4,0x47,0x6e,0x3e,0x53,0x0f,0x06,0xff,0x01,0x33,0x37 }, { 0xaa,0x24,0x7d,0xb4,0x63,0xf0,0xa1,0xd0,0x88,0x36,0x49,0xb3,0x75,0x16,0x50,0x57,0xdb,0xb2,0x31,0x7e,0x6e,0x71,0x2e,0xd9,0x9f,0x0c,0x7f,0xf5,0x53,0x07,0xbb,0x48 }, { 0x03,0x80,0x10,0x30,0x8f,0x4d,0x85,0x12,0x0a,0xe7,0x97,0xf3,0x6d,0xaa,0xf5,0x4d,0xb5,0xab,0xb6,0xe6,0xce,0xbc,0xb4,0x43,0xeb,0xe2,0x92,0xfb,0xa3,0x89,0x80,0x03 }, { 0x30,0xd7,0x15,0xbb,0x78,0x1f,0x56,0xcb,0x75,0xa8,0xa0,0x00,0xa3,0x87,0x3d,0x69,0xa5,0x7e,0xa3,0x91,0x24,0x2c,0xfc,0x8f,0x83,0x22,0xe6,0xc1,0xec,0xf5,0x4d,0x17 }, { 0xb1,0x20,0xdd,0xe9,0x40,0xda,0xe4,0xa2,0x66,0xb0,0xdf,0x1e,0x61,0x2c,0xf4,0x5b,0x1d,0x50,0xc3,0xcd,0x24,0xd5,0x10,0xa7,0x73,0x14,0x4f,0xbf,0xb4,0xe9,0x22,0x18 }, { 0xe1,0x11,0xda,0x76,0x36,0x56,0x93,0x00,0x08,0xe5,0x5d,0x2d,0x6e,0x40,0x27,0xe5,0x8f,0x19,0x51,0x1b,0xc7,0xd6,0x51,0x74,0x79,0xb2,0x82,0x74,0xbb,0xb3,0xb4,0x58 }, { 0x38,0x38,0x9f,0x47,0xde,0xc6,0x76,0xdc,0x82,0xaa,0xbd,0x3b,0xb2,0xbd,0x65,0x42,0x47,0x48,0x33,0xb1,0x92,0xfd,0x63,0xa7,0x53,0xbf,0x9b,0x3c,0x72,0x8e,0x19,0x71 }, { 0x93,0x2f,0xc2,0x83,0xe3,0xd3,0xf9,0xbd,0xa4,0xbc,0xff,0x5a,0x1c,0x81,0xb5,0x26,0xdb,0x7b,0x6b,0xad,0x15,0xf1,0xad,0xa5,0x1e,0xd0,0x77,0x4f,0x79,0x50,0x72,0x51 }, { 0xc2,0x1a,0x26,0x9b,0x90,0x1b,0x5c,0x63,0x86,0xf8,0x62,0x22,0xae,0xe8,0x80,0x43,0xf3,0x36,0x78,0xae,0x69,0xc5,0x6b,0xb0,0x42,0x97,0x79,0x3e,0xa7,0xea,0x8e,0x3f }, { 0x85,0x51,0x71,0x14,0xcc,0xc4,0xa8,0x6c,0x94,0x30,0x56,0x0a,0xcf,0x78,0x5d,0x2f,0x1d,0x3c,0x90,0x36,0x25,0xbf,0x34,0xe4,0xb6,0x0a,0x0e,0x7e,0x17,0x30,0x44,0x15 }, { 0x54,0xad,0xfd,0x98,0x6a,0x65,0xd8,0xf5,0x93,0xde,0x95,0x49,0xce,0xf3,0x06,0x0e,0x4e,0x83,0xdd,0x79,0x7c,0xa8,0xf4,0x84,0x52,0x4f,0x99,0xf6,0x50,0xb7,0x61,0x1b }, { 0x23,0x04,0xe4,0x38,0x40,0xd0,0x76,0xa2,0x53,0x6e,0x1a,0x7d,0x13,0x4b,0xc6,0xb3,0xb1,0x9d,0x70,0xdf,0xde,0x26,0xa3,0xb1,0x1a,0x6d,0x46,0x4c,0x25,0x7a,0x1f,0x12 }, { 0x63,0x36,0x74,0xc9,0x40,0x98,0xdf,0x83,0xcc,0x5f,0xf4,0x6a,0x1b,0xea,0xab,0xab,0x38,0x6a,0x01,0xe9,0x67,0xf3,0xb7,0xb8,0x11,0x89,0x7d,0x62,0x44,0x43,0x58,0x59 }, { 0x6d,0x18,0x8f,0x5c,0xf2,0xe0,0x7d,0xe1,0x32,0x8d,0xc9,0x23,0xb9,0xf3,0xa5,0xc6,0xc7,0xb6,0x03,0xd2,0xc0,0xef,0xeb,0x6d,0x4f,0x00,0x03,0xe5,0x1f,0x5e,0xb9,0x00 }, { 0x3d,0x37,0x32,0xa1,0x9a,0xc8,0x9c,0xeb,0x88,0xbd,0x71,0x19,0xd7,0x35,0xaa,0xcd,0xbc,0x7d,0xd7,0xa8,0x61,0x68,0x18,0xaf,0x77,0xd1,0xcd,0xf4,0xf3,0xb5,0xad,0x30 }, { 0x52,0x5b,0xe3,0xd5,0xe2,0xd2,0x4e,0xec,0xc2,0x47,0x17,0xf1,0x01,0xc5,0x81,0x18,0x44,0xd6,0x92,0xcf,0x7e,0xbe,0xcc,0x9c,0x2f,0xb5,0x50,0x3a,0xb8,0x50,0x0a,0x0c }, { 0x12,0x7c,0x6e,0x40,0x7f,0x26,0xeb,0x4d,0x1c,0x76,0xc4,0xfc,0x58,0x7a,0xbb,0x4f,0x2c,0x22,0xaf,0xcc,0x61,0x40,0xed,0x23,0xfd,0x3e,0x3b,0x20,0x0d,0x52,0x41,0x10 }, { 0x33,0xc8,0xab,0xac,0x0f,0x23,0x3e,0x33,0x98,0x55,0x71,0x85,0x7f,0xc2,0x86,0x67,0x2e,0x1f,0x3c,0x89,0x0f,0xef,0x9c,0x3b,0xaf,0x12,0x70,0xf1,0x87,0x1f,0x31,0x38 }, { 0xb7,0x53,0x54,0x8a,0xa2,0xde,0xd0,0x3b,0x7d,0x4b,0x51,0x78,0x5e,0xcc,0xc5,0x3b,0x75,0x7f,0x9a,0xc4,0xee,0x9c,0x7a,0x9a,0x38,0x09,0x98,0x97,0x20,0xff,0x9b,0x5e }, { 0xd4,0xe9,0x73,0x2c,0xef,0xd6,0xcd,0xc9,0xf6,0x9b,0x60,0x71,0x79,0x75,0x69,0xbf,0x89,0xc8,0x36,0x37,0x6b,0xd4,0x36,0xe9,0x64,0xcd,0x71,0x62,0xc5,0xf1,0x7e,0x62 }, { 0x97,0x80,0x0a,0xd7,0x3c,0xbe,0x4f,0x6d,0xdc,0xa6,0xd8,0xda,0x02,0x51,0xb8,0xf9,0x5e,0x41,0x36,0x59,0xe7,0x44,0x92,0x20,0xf1,0x40,0x82,0xd5,0xb5,0x99,0x47,0x7f }, { 0xee,0x39,0xc1,0x14,0xb3,0x93,0x8a,0xb4,0x71,0x3d,0x60,0xf5,0x7a,0x4d,0xcb,0xcb,0xe7,0x38,0x35,0xae,0x6e,0xdd,0x29,0x71,0x55,0x24,0xea,0xb4,0x83,0xfc,0x85,0x3b }, { 0x6a,0xc9,0x2f,0xb9,0x60,0xe5,0xb2,0x2e,0xef,0xa2,0x90,0x9a,0x2f,0xc6,0x1d,0xe2,0x2c,0x48,0x1f,0xa2,0xeb,0x45,0x65,0xc3,0x78,0xb6,0xb6,0xaa,0x37,0x12,0x43,0x46 }, { 0xe2,0x9f,0xd5,0xd3,0x11,0xee,0xb1,0x7d,0x4d,0xba,0x70,0x24,0x52,0x96,0xc8,0xb9,0xec,0x59,0x69,0x50,0xa3,0x0e,0xa7,0xd4,0xcb,0x13,0x36,0x8d,0x7a,0x93,0xd2,0x3a }, { 0xcd,0x87,0xe4,0x30,0x44,0x8f,0xf6,0xda,0xb8,0xfa,0x96,0xdb,0x80,0x5c,0xb0,0x00,0xc2,0x89,0x26,0x25,0x34,0x15,0x06,0x89,0x0a,0x4a,0x06,0xa6,0x66,0xa2,0xb2,0x42 }, { 0x5f,0x4c,0x0a,0x5b,0x4e,0x16,0x76,0x56,0x46,0x66,0x0e,0x7b,0xb9,0x36,0x26,0x83,0x70,0x4b,0x80,0xaf,0x09,0x10,0x69,0xae,0x2f,0x41,0xcc,0x9e,0xcf,0x70,0x41,0x33 }, { 0x4a,0x41,0x9a,0xf2,0x2f,0x22,0xfc,0xad,0x19,0x15,0x59,0x68,0xb1,0x4e,0xdb,0x4b,0xd5,0x65,0xb9,0xbd,0x70,0x5a,0x57,0x96,0x2a,0x9c,0xf7,0xc1,0x39,0x43,0xa3,0x0a }, { 0xb6,0xb4,0x9d,0x85,0x3a,0x22,0x01,0xf0,0x77,0x4a,0x63,0xce,0x6f,0xa6,0xf5,0x38,0xaf,0xd8,0xc7,0x78,0x5a,0x9c,0x28,0xe4,0xed,0xc6,0xe7,0xfa,0x00,0x94,0x1f,0x60 }, { 0x15,0x4d,0xb9,0xd8,0xb9,0x54,0x56,0xc2,0x13,0x17,0x41,0x9a,0xab,0x50,0xa0,0x2c,0x05,0xf2,0x65,0x46,0x4f,0xa4,0x7a,0xdb,0x35,0x90,0x4a,0xc3,0x41,0x0e,0xc5,0x7c }, { 0x4f,0xd9,0x48,0x2d,0x78,0x66,0xe6,0xf6,0x4b,0x8d,0x52,0xe0,0x70,0x18,0x10,0xde,0x3e,0x22,0x24,0x41,0xcf,0xa7,0x4c,0x44,0x99,0x75,0x32,0x39,0x87,0x88,0x35,0x7b }, { 0x7c,0xd6,0x13,0x44,0xfc,0xae,0x17,0x11,0x6f,0xe1,0x75,0xcc,0xf8,0xcc,0x97,0xe9,0x0e,0xf9,0x68,0x9c,0xc4,0x0f,0xb3,0x42,0x71,0x72,0xb4,0x54,0x46,0xa3,0xdf,0x1f }, { 0x40,0xe9,0x84,0x24,0x68,0x8a,0x55,0x8e,0x98,0xaa,0xc2,0xdd,0xb6,0xd1,0xd2,0x35,0xcf,0x93,0x3b,0xc4,0xa1,0x70,0xf5,0x20,0x45,0x8a,0xbb,0x0c,0x9d,0xec,0xe9,0x78 }, { 0xdf,0x44,0xdf,0x54,0x1f,0x74,0x97,0x0e,0x53,0xc9,0x53,0x2c,0x5e,0x85,0x7a,0xbd,0xb0,0xde,0xe8,0xca,0x54,0x6b,0xda,0xcd,0xbe,0x9a,0x33,0x8d,0xd6,0x98,0x50,0x0b }, { 0x24,0x67,0xfa,0x57,0x94,0x65,0x94,0xfd,0xf5,0x97,0xc6,0xc2,0x59,0xb7,0xb8,0x94,0xdc,0xc7,0x1f,0xa0,0x7a,0x3d,0x4f,0x83,0xc1,0xa7,0xfc,0x11,0x4a,0x35,0xdf,0x37 }, { 0x2b,0x9d,0x2a,0x7f,0x1a,0x41,0x0b,0xe2,0x9c,0xb8,0x06,0xeb,0xa6,0xb2,0x78,0x8e,0x70,0xbd,0x28,0xa7,0x49,0x5d,0x22,0x03,0x03,0x9e,0xd5,0xd0,0x3b,0xec,0x8d,0x39 }, { 0x7a,0xaf,0x4c,0xa9,0x70,0xc6,0x2a,0xe5,0xc9,0xdd,0xc5,0x66,0xda,0x6b,0x07,0x48,0xee,0xf3,0xab,0x66,0xa3,0x46,0xd6,0xd1,0x5b,0xcd,0xd0,0xbf,0xe6,0x63,0x5e,0x15 }, { 0xa9,0xb7,0xa6,0x71,0x28,0x68,0x15,0xb9,0xa6,0x7f,0xdf,0x5c,0x1a,0x05,0xdd,0x5f,0x91,0x22,0x8f,0xc0,0xc3,0x3f,0xa9,0x49,0x90,0xec,0x5a,0x1e,0xe8,0x77,0x46,0x37 }, { 0xf1,0x36,0x52,0xf6,0xdb,0x37,0x58,0x59,0xba,0x6f,0xf8,0xd0,0x5c,0x97,0xfd,0x73,0xcb,0x6c,0x5a,0x5e,0x66,0xc7,0xc9,0x7d,0xb4,0x68,0xbb,0x1b,0x32,0x1f,0x22,0x05 }, { 0xdf,0xef,0x21,0x2b,0x7b,0x1b,0xd7,0xeb,0xca,0x97,0x88,0x1a,0x2a,0x39,0xbf,0xc4,0x72,0xdc,0x16,0x63,0x20,0x30,0xe7,0xe7,0x24,0x2e,0x23,0xbc,0x91,0x66,0x61,0x33 }, { 0xa9,0x4b,0x20,0x43,0xcc,0x47,0x52,0x5b,0x9f,0xf8,0x7f,0x5a,0x19,0x7f,0xe0,0xb6,0xbf,0xe6,0x50,0x73,0x63,0x9a,0xef,0x3d,0x40,0x9f,0x4e,0x1b,0xb4,0x09,0xf2,0x5a }, { 0x5d,0xdd,0x74,0x54,0x84,0x17,0xa6,0xe7,0xfa,0x81,0xd2,0x46,0xc8,0xc5,0x97,0x07,0x9d,0xf6,0x35,0xc1,0xa6,0x67,0xa1,0x91,0x6d,0x64,0x90,0xe4,0x17,0xd0,0x69,0x46 }, { 0xe5,0x01,0xb2,0x2b,0xbf,0x83,0xfc,0xed,0x61,0x72,0x30,0x97,0xb2,0x45,0xa2,0x6e,0x09,0x67,0x79,0xe2,0xa3,0xe2,0x5b,0x19,0x47,0x4a,0x33,0x17,0xe9,0x2e,0x05,0x1c }, { 0x9c,0x0d,0x8c,0x7f,0x0f,0x0a,0x02,0xcb,0x2d,0x64,0xbd,0x61,0x00,0xe5,0xf7,0x38,0x38,0x47,0x0f,0x3e,0x7b,0xd2,0xf1,0x02,0x07,0xa7,0xf5,0xf7,0x84,0x77,0x30,0x2c }, { 0x4c,0x7d,0x7a,0xfa,0xfd,0x05,0x87,0x84,0x41,0x3a,0x59,0xbc,0xee,0x5c,0x15,0x6b,0x89,0xc5,0x53,0x4b,0x63,0x47,0xae,0x16,0x68,0x2e,0xd8,0xba,0x82,0x79,0xe1,0x11 }, { 0x51,0x6e,0x95,0x14,0xca,0x55,0x2e,0x4b,0x35,0x06,0x3b,0x4d,0xf9,0xfb,0x25,0x8f,0xc5,0xbe,0x94,0xf1,0xf2,0x3b,0x18,0x43,0x47,0x29,0x74,0x1a,0xf9,0x77,0x62,0x5c }, { 0x6c,0x26,0x58,0x53,0x8d,0x12,0xc6,0xe0,0x5c,0xae,0xa5,0x55,0x48,0x1d,0x3a,0xf3,0xe0,0x53,0x2e,0xb8,0xdd,0x40,0x00,0x7b,0x6e,0x8f,0xdc,0x4a,0x7b,0x33,0x59,0x31 }, { 0x96,0x1c,0xba,0x05,0xd5,0x1a,0xce,0x8e,0xab,0xcd,0x42,0x57,0x43,0xd1,0xa1,0x66,0xce,0x26,0xb0,0x64,0x4a,0xa4,0xa7,0xc0,0x85,0xc3,0x26,0x3c,0xd2,0xbd,0x82,0x26 }, { 0x8b,0xe9,0x16,0x2a,0x7e,0x07,0x62,0xc9,0x1f,0x9e,0xa9,0x4f,0x77,0xd8,0xab,0x9f,0x29,0x9e,0xdc,0x2a,0x39,0x23,0x5c,0x05,0x76,0x68,0xd1,0x27,0x7c,0x1b,0x88,0x45 }, { 0x96,0x71,0x4f,0x71,0x31,0x34,0x71,0xfc,0x59,0x3c,0x8a,0x5a,0xd6,0xe6,0xd7,0x13,0xe4,0x43,0xb2,0x39,0x23,0xdb,0xe9,0x51,0x8f,0x25,0x46,0xcb,0x7a,0x29,0x76,0x54 }, { 0x6b,0x29,0xfe,0xdb,0x44,0x22,0x72,0xad,0x86,0x2d,0x8a,0x7d,0xc5,0xd2,0xe2,0x79,0x86,0x56,0xce,0xc4,0x39,0x0a,0x21,0xd4,0x72,0xf8,0x67,0x05,0x50,0x83,0x5d,0x08 }, { 0xc9,0xf8,0xd9,0x8c,0xe6,0x01,0x22,0xb7,0xf3,0x98,0x2e,0x4e,0x06,0x13,0x43,0x42,0xfa,0xb3,0x62,0x15,0xa6,0xb6,0x94,0xd9,0x54,0x86,0xd4,0x37,0x16,0x26,0xef,0x4e }, { 0x3f,0x75,0xa9,0xa1,0xcf,0x61,0x9d,0x15,0x1f,0xcd,0x9c,0x00,0x6d,0x87,0x0f,0x53,0x43,0x62,0x98,0x08,0x54,0x64,0x9d,0x65,0x88,0xe2,0x6a,0x11,0xa9,0xd8,0x8a,0x45 }, { 0xd8,0x95,0x4b,0x57,0xf3,0x13,0x15,0x78,0x01,0x2a,0xe6,0xc2,0x53,0xd5,0x98,0x9b,0xc5,0xac,0xa8,0xfd,0x4f,0xa4,0xcb,0x2b,0xf8,0x78,0xdb,0x24,0x62,0xe6,0x5b,0x4d }, { 0xdd,0xb9,0xbc,0xcf,0xe1,0x09,0x96,0xf0,0x00,0x9c,0x7b,0xc3,0x25,0xc2,0x09,0xc3,0x42,0x6b,0xcc,0x47,0x5f,0x19,0xc7,0xa0,0x9c,0x3f,0xaa,0xec,0xbd,0x5a,0x76,0x06 }, { 0x6f,0x7a,0x97,0x6d,0x24,0xd0,0x5f,0x2f,0xd9,0x5c,0xfb,0x03,0x6b,0x90,0xca,0x47,0x61,0x12,0x61,0xa2,0xed,0xc3,0x42,0xa9,0x1f,0x2d,0x99,0x72,0x32,0x8c,0x65,0x08 }, { 0x03,0x4a,0x56,0x4b,0xb1,0xeb,0x9a,0x51,0x30,0x58,0xb1,0x6a,0x69,0x5c,0xdf,0xfe,0xe5,0x76,0x31,0x03,0x87,0xd1,0x26,0x9f,0x36,0x52,0x07,0xb3,0xc1,0xf5,0x4c,0x6d }, { 0x98,0xe2,0x77,0x13,0x92,0xb3,0xf6,0xd6,0x4b,0x2f,0xae,0xb1,0x07,0xc3,0x04,0x3a,0x0d,0x51,0x61,0x70,0x9d,0x1b,0xed,0x0c,0xd7,0x45,0x37,0xab,0x89,0xa3,0xeb,0x1d }, { 0xd4,0x60,0xaa,0x8e,0xe3,0xd5,0x07,0xa1,0x21,0x5e,0x28,0xce,0x9a,0x44,0xd6,0x39,0x4b,0xf8,0xf9,0x46,0x00,0x0e,0xa5,0x46,0xe1,0x28,0xf5,0x52,0x6c,0xa2,0x98,0x57 }, { 0xec,0xe6,0x64,0x3b,0x8f,0xa8,0x3b,0x94,0x82,0xf3,0x00,0x12,0x7f,0xb0,0xd9,0xd6,0xba,0x4f,0xba,0xf4,0x06,0x16,0xcf,0x8e,0x28,0x46,0x2b,0x96,0x4a,0xd2,0xec,0x0f }, { 0x47,0x86,0x58,0xac,0xb7,0x4e,0x51,0x85,0x39,0xe8,0x8b,0xd9,0x01,0x42,0x8a,0x04,0x6a,0x53,0xc1,0x53,0x14,0xa8,0xe7,0x65,0xe5,0x76,0x78,0xc5,0x2a,0x14,0xa5,0x00 }, { 0xe1,0xd0,0xe5,0xd3,0xf2,0xb1,0x5c,0x68,0x10,0x1a,0x6f,0x2b,0x6a,0xe1,0xa4,0x65,0x32,0x14,0x0f,0x61,0x5f,0xe7,0xf9,0xd6,0x1e,0xcf,0x8d,0xc4,0xfe,0xc0,0xf1,0x56 }, { 0x96,0x41,0xd5,0x43,0xaf,0x0f,0x36,0x58,0xfe,0x22,0x09,0x85,0x2f,0xf0,0x61,0xe1,0x3e,0x63,0x3d,0xfb,0xc5,0x3f,0xb7,0x16,0x40,0xf4,0x2b,0x15,0x8c,0xd8,0x2f,0x70 }, { 0x34,0x1b,0xab,0x95,0x71,0x61,0x27,0xfb,0xa7,0x05,0x48,0xa2,0xee,0x01,0xfa,0x55,0x43,0x2b,0x8c,0x6c,0x16,0x50,0x58,0x10,0x3f,0xf6,0x95,0xa2,0xd8,0x18,0x1d,0x62 }, { 0x0b,0x81,0x8d,0x2b,0xca,0x10,0x6b,0xcb,0x0e,0x2b,0x08,0x1d,0x62,0xf1,0x70,0x0a,0x20,0xf7,0xa2,0xca,0x0e,0x0f,0x7d,0x0a,0x67,0x8d,0x0d,0x45,0xca,0xe3,0xff,0x57 }, { 0xdb,0xe5,0x37,0xd6,0x40,0x25,0xb8,0xcb,0x44,0x36,0x3b,0xab,0x65,0xe9,0x83,0x0b,0x77,0x7c,0x73,0x84,0x45,0x4e,0x3c,0x27,0x24,0xba,0xee,0xe3,0x1f,0xd2,0x3c,0x53 }, { 0x66,0x6f,0x57,0x9d,0x5c,0xd0,0xe8,0x63,0xdd,0xe5,0x1e,0x7f,0x9e,0x7b,0xb2,0x13,0x43,0x74,0x6e,0x44,0xef,0x29,0x5d,0x24,0x9d,0x7f,0x12,0x3f,0xaa,0xec,0xa3,0x1c }, { 0x85,0xa0,0xce,0x79,0x20,0x90,0x28,0x71,0xa6,0x4c,0xf6,0xc8,0xbe,0x20,0x99,0x1d,0x6f,0x6c,0xd8,0xc1,0x8c,0x69,0xc9,0xee,0x66,0x33,0x40,0x0b,0xac,0x50,0x1e,0x7c }, { 0x68,0xb9,0xb3,0x31,0x4c,0x21,0xdc,0xef,0x16,0x0b,0x37,0x68,0x71,0x56,0x36,0xe8,0xb6,0x8e,0xc1,0x11,0x22,0x67,0x6d,0x58,0xc3,0xf4,0xc6,0x28,0x41,0xd8,0x9d,0x0d }, { 0xa3,0xaf,0x80,0x58,0x85,0xd9,0x8b,0xbf,0x39,0x35,0xee,0x9d,0xe9,0xbd,0x52,0x91,0xc3,0xbe,0xce,0xf2,0xcc,0x1f,0xaf,0xf7,0x16,0xfa,0x86,0x27,0xa8,0xa5,0xea,0x57 }, { 0x1c,0x5c,0x63,0xce,0x46,0xd2,0x0e,0x94,0xe4,0x34,0x81,0xa7,0xfa,0x84,0xcd,0xf0,0x75,0x60,0x98,0x17,0xf2,0x12,0x71,0x8e,0xdf,0x05,0xe6,0xba,0x87,0x94,0xa2,0x6e }, { 0x06,0xac,0x61,0x8b,0x0f,0x33,0x49,0xb5,0x60,0xf9,0x47,0x1f,0x02,0x4f,0x0e,0x65,0x0d,0x99,0x5a,0x98,0x1a,0x99,0x97,0xfe,0xae,0x4b,0xa4,0xa5,0x9b,0x4f,0x60,0x77 }, { 0xa2,0x99,0xa1,0x1a,0x0b,0x9d,0x18,0x41,0x97,0xf3,0x66,0xd7,0xb1,0x12,0xea,0xdf,0x8b,0x5d,0x45,0xf4,0x5e,0x63,0x14,0xc2,0x12,0x92,0x1e,0x1f,0x75,0xd0,0xb1,0x2a }, { 0xba,0x8b,0x9c,0x6b,0x38,0x14,0xed,0x35,0xb6,0x02,0x27,0x09,0x5b,0x69,0xdf,0x27,0x6a,0x30,0xae,0x33,0xa0,0x46,0x00,0x57,0x92,0x34,0x2c,0x5a,0xc2,0x4d,0x64,0x56 }, { 0xe4,0xc8,0x6a,0x69,0xe5,0xce,0xbf,0xc6,0xaa,0xd3,0x2c,0x99,0x44,0xe8,0x9e,0xc4,0xbc,0x0e,0x85,0xc2,0x81,0x90,0x38,0x3f,0x89,0xdf,0xd1,0xe6,0x41,0xfe,0x28,0x72 }, { 0xa1,0xc9,0x7a,0xf2,0xbf,0x11,0xcb,0x29,0x4a,0xe5,0xa7,0x91,0xfd,0x99,0xa1,0x66,0x6f,0xed,0x1d,0xd1,0xa3,0x9f,0x73,0x7c,0xf4,0x75,0x81,0xcf,0x4e,0x69,0x3f,0x55 }, { 0x25,0x99,0xeb,0xe6,0x53,0xf1,0x5e,0x06,0x38,0xf2,0xa4,0xd2,0xb3,0x46,0x30,0xad,0x8f,0x50,0xf4,0x7b,0x95,0x16,0xa5,0x4a,0xda,0xc3,0xaa,0x59,0x1f,0x94,0x3e,0x1e }, { 0x44,0x0d,0xe8,0x15,0x8b,0xf2,0xf2,0x5a,0xe6,0xb5,0x74,0x30,0xe4,0x7a,0x78,0x1a,0x57,0x6c,0xf1,0xda,0x38,0xfa,0x2d,0x01,0xf6,0x99,0xc2,0x60,0x82,0x5b,0xf7,0x45 }, { 0xe1,0x08,0xa0,0x7b,0xa7,0xf1,0x67,0xf9,0xc3,0x7b,0x5f,0x58,0xf2,0xc5,0x79,0x5e,0x0d,0x1f,0xa5,0x81,0x12,0x1b,0x88,0xa3,0xc0,0x54,0x5f,0x5d,0xc5,0x6a,0xe6,0x2f }, { 0x2c,0x82,0xdd,0x04,0xb4,0xba,0xe2,0x68,0x9a,0xf4,0x90,0x88,0xe0,0xb9,0x5e,0x4d,0x90,0x52,0x42,0x74,0xdf,0x81,0xa6,0x97,0x45,0x44,0xac,0xaa,0xce,0x0c,0xa5,0x7f }, { 0xce,0x8f,0x52,0xec,0xb3,0x1b,0xd4,0x43,0xfe,0x8a,0xa4,0x4a,0x49,0x1c,0x3a,0x3a,0x16,0x25,0x11,0xbb,0xd8,0x78,0x8a,0xab,0xf8,0x6a,0x6c,0x13,0xf3,0x07,0xeb,0x27 }, { 0xbd,0x14,0xbf,0x74,0x8d,0x71,0x78,0x9d,0x59,0xbe,0x89,0x27,0xb6,0x7f,0x77,0xe5,0x38,0xfb,0x13,0x9f,0x1f,0x74,0x91,0x3a,0xd7,0x58,0x98,0x06,0x53,0x80,0xcd,0x2f }, { 0x71,0xd5,0x96,0xaf,0xb9,0x34,0x30,0x00,0x59,0x7c,0x6e,0x2b,0x9b,0xf6,0xc5,0x0a,0x99,0x62,0x01,0xf4,0x4d,0xb5,0x7e,0x22,0x59,0x87,0x3b,0x76,0x9b,0x58,0x61,0x6c }, { 0x80,0x12,0xaa,0xa6,0xeb,0x0c,0x15,0xd0,0x4d,0x94,0x89,0x6c,0xcd,0x98,0x56,0xc4,0xa4,0x59,0x58,0x36,0xf3,0xf0,0x11,0xad,0x8a,0xad,0xe3,0xc8,0x21,0x99,0x00,0x79 }, { 0xe3,0xc6,0x3b,0x99,0x89,0x4a,0xfc,0x06,0xb9,0x78,0xd5,0x2e,0xac,0x9a,0xdf,0xf4,0x50,0x63,0xa9,0xf3,0x64,0x90,0xd5,0x40,0x92,0xc4,0x06,0x8f,0x42,0x51,0xb1,0x4b }, { 0xf0,0x5d,0xb2,0x1e,0x63,0x30,0x0b,0x8a,0x42,0x87,0x02,0x24,0xda,0x86,0xe7,0xc2,0x0a,0xc4,0xe7,0x59,0xa3,0x36,0xb0,0x30,0xdc,0x4b,0x54,0xef,0x24,0x72,0xb3,0x11 }, { 0x4d,0xd4,0x0f,0x13,0xa8,0xe9,0x7b,0x15,0x7b,0xa7,0xa5,0x13,0xb4,0x82,0xb4,0xb5,0xd8,0xc0,0x56,0x46,0x87,0x32,0x9d,0x3d,0x87,0x82,0xf9,0xce,0x6a,0xfa,0x71,0x33 }, { 0x56,0x67,0x1a,0xf2,0x7b,0x04,0xb5,0x19,0x24,0xa4,0x54,0xf4,0xc2,0xd8,0x17,0xf7,0x27,0x91,0xa3,0x35,0x4e,0x5e,0x57,0x75,0x15,0x34,0x00,0xdd,0x76,0x88,0x17,0x34 }, { 0xa2,0xce,0xa7,0xb2,0x7a,0xa9,0x52,0x62,0x9b,0x69,0x00,0x5d,0xbf,0x38,0x6d,0xb0,0xc6,0x85,0x46,0x57,0xdd,0xbd,0x8a,0xb2,0xb1,0x1e,0xbe,0x3a,0xbd,0xa6,0xa0,0x6d }, { 0x93,0xae,0x77,0x0b,0xdf,0x35,0x43,0x3e,0x69,0x85,0x2a,0xe3,0x58,0x26,0x38,0xd4,0xaf,0x70,0x6a,0xda,0xd2,0xc4,0x2b,0xfb,0x4e,0xac,0x41,0x2a,0x41,0xbe,0x70,0x2d }, { 0xcd,0x0e,0x22,0x87,0x96,0x54,0xda,0x74,0x31,0xdc,0x13,0x84,0x5c,0xa1,0x47,0xef,0xb6,0x0b,0xb6,0x02,0xd5,0xdd,0x20,0x84,0xdb,0x82,0x03,0x00,0xd5,0xde,0xdf,0x70 }, { 0x3b,0x03,0xb4,0x60,0x18,0xdb,0x82,0x06,0xab,0xad,0x4e,0x75,0x65,0x32,0x24,0x19,0x41,0xb1,0xe4,0xba,0xac,0xfa,0x0b,0x54,0x33,0xd2,0xf4,0x45,0xda,0xcd,0x8e,0x0c }, { 0xe0,0x80,0x2b,0x66,0x7f,0x3d,0x6f,0xc7,0xd1,0xb1,0x9f,0xb5,0x4a,0x22,0x64,0xcb,0xa1,0x08,0x33,0x3d,0x9f,0x40,0xe8,0x92,0xb4,0x27,0xd6,0x38,0x4e,0xef,0x32,0x46 }, { 0xc3,0xf9,0xc5,0x0b,0xe1,0xac,0x60,0xde,0x38,0x22,0x20,0x65,0x4d,0x76,0x93,0xf7,0x52,0x6a,0xd1,0x47,0xab,0xa2,0x0f,0xe9,0xba,0x49,0x85,0xbe,0xcc,0xab,0xb0,0x03 }, { 0xd4,0x41,0xc4,0x1a,0x93,0x6c,0x97,0xa2,0x9f,0x7f,0x82,0x41,0x4e,0xe1,0x72,0xd5,0x3a,0xc7,0x5f,0xf8,0x0d,0x12,0x48,0x59,0x3a,0xdc,0x6b,0x94,0x69,0x87,0x8b,0x44 }, { 0x5a,0x78,0xb7,0x94,0xb6,0x65,0x13,0x81,0x32,0x13,0x54,0xda,0x4c,0xaa,0x29,0x7b,0x46,0x5a,0x48,0xc6,0x76,0xea,0x44,0x13,0x51,0x2c,0xf8,0xf2,0xab,0x6f,0xcd,0x65 }, { 0xec,0xa6,0xe6,0x37,0x3f,0x3e,0xd4,0x73,0xfd,0x74,0xee,0xdf,0x23,0x68,0x05,0xe2,0xc9,0x6f,0x85,0x84,0xa7,0x92,0x07,0x37,0xb9,0xf6,0xcb,0x7b,0xb4,0x93,0xea,0x0f }, { 0xd7,0xe4,0x1b,0x6b,0x6f,0xf4,0xd8,0x13,0x02,0x39,0xd6,0x0e,0xfc,0xcc,0xc6,0xf0,0xc5,0x27,0x03,0xf4,0xe1,0x38,0x0f,0x50,0xff,0x40,0x3d,0xbc,0x52,0x27,0x6a,0x2b }, { 0xc0,0xab,0x0a,0x68,0x81,0x3c,0x0a,0xde,0xe6,0x19,0x39,0x57,0x52,0xe9,0x44,0xbe,0x3d,0xa7,0x69,0x68,0x2c,0x2c,0xd8,0xb4,0x3d,0x40,0x2c,0xba,0xcb,0xd5,0x17,0x3e }, { 0xce,0x9d,0xce,0x7d,0xf7,0x7c,0x46,0x97,0xf8,0x07,0x00,0xde,0x35,0x97,0x26,0x72,0x4e,0xc2,0xdc,0x3c,0xfc,0xe5,0x22,0xe1,0x98,0x2f,0x4a,0xbd,0x6a,0x7b,0x1f,0x45 }, { 0x3a,0xd8,0xb5,0x92,0xe9,0x3f,0x43,0x48,0xad,0x2c,0x45,0x0c,0xb0,0x22,0xd6,0xce,0x0a,0x34,0x74,0xa1,0x66,0xff,0x89,0xa4,0x19,0xad,0xc2,0x42,0x53,0xf6,0x63,0x7e }, { 0xa4,0x75,0xd7,0x0c,0x8b,0xdb,0x2f,0x5c,0x3d,0xb0,0x7e,0x42,0x9c,0x1c,0x25,0xa3,0x24,0xc2,0x11,0xa3,0x55,0x94,0xfd,0x93,0xbf,0xee,0x42,0xaa,0x85,0x22,0x42,0x5e }, { 0x22,0xec,0xc4,0x21,0xa4,0xa0,0x59,0xe8,0x60,0x4b,0xc3,0xec,0xfb,0x51,0x46,0xf3,0x3a,0x75,0xc3,0xa7,0x85,0x6a,0xcd,0xb9,0x47,0x06,0x88,0x2f,0xfb,0x61,0xa5,0x3e }, { 0xea,0x97,0xda,0xed,0xbc,0xbf,0xa4,0x11,0xde,0x8d,0x94,0x43,0xac,0x4a,0xfd,0x36,0x65,0xa8,0xa3,0x7e,0x1d,0x88,0xaa,0x24,0xd3,0x23,0x9d,0x83,0x06,0x8f,0x37,0x06 }, { 0xf0,0x5b,0x30,0x54,0xe6,0x01,0x23,0xa7,0x7e,0x5e,0xe3,0xcf,0x83,0x15,0x68,0x82,0x47,0x14,0x0c,0xa5,0xfe,0x4a,0x44,0xd4,0x24,0xa0,0xdc,0xa3,0x70,0xfd,0xce,0x43 }, { 0x40,0x02,0xc7,0x81,0x55,0x9e,0x49,0x06,0x72,0x9d,0x14,0x14,0x18,0x66,0xa2,0xff,0x67,0x82,0x72,0x84,0xcd,0x0c,0x3f,0x53,0xf8,0x07,0x46,0x0e,0x94,0x0e,0x6c,0x1a }, { 0xec,0xe4,0xa3,0xe4,0x80,0x42,0x30,0x19,0x50,0x4f,0xaa,0xb1,0xd0,0x4b,0xb6,0x19,0x5c,0xd0,0x6a,0x98,0xf7,0xa0,0x32,0xfb,0x59,0x40,0xec,0x40,0xde,0xad,0xb0,0x72 }, { 0x7c,0xe6,0x0b,0x1e,0xdd,0xb7,0xb7,0x38,0xd7,0xa2,0xb8,0x80,0xc5,0xa5,0x74,0x86,0xb8,0x64,0xd1,0x2e,0x96,0x6c,0x19,0x3a,0x73,0x6f,0x0c,0x40,0x69,0xfc,0x15,0x1b }, { 0x4c,0x01,0xc9,0xd2,0x10,0xbd,0xbc,0x1f,0xff,0x99,0x65,0xd6,0x05,0xb4,0x0a,0xc2,0x25,0x49,0x85,0x4d,0x21,0x14,0x4a,0x0e,0x36,0xe6,0xb3,0x1b,0x4f,0x60,0xf0,0x11 }, { 0x5e,0x70,0x53,0x3a,0x47,0xa3,0x5d,0xb0,0x1a,0xd9,0xb7,0xf7,0x4f,0xa2,0xa2,0x2e,0xce,0x8b,0x6d,0xfe,0x9e,0x31,0x38,0x8e,0xff,0xfb,0x21,0x6c,0x50,0x2b,0xed,0x24 }, { 0x9e,0x85,0xc5,0xb0,0x06,0xdc,0xf5,0x7e,0xb2,0x78,0xc2,0xec,0x3c,0xab,0x55,0xaf,0x0e,0x6f,0xd5,0xf4,0xf5,0xcf,0x8b,0x57,0x19,0x7b,0x1a,0xbf,0x8a,0x28,0x30,0x24 }, { 0xb4,0x5e,0x7a,0x6a,0x8d,0xa4,0x05,0x7b,0x85,0xf4,0x54,0x06,0xa5,0x9d,0x97,0x6d,0x1c,0x8c,0x6b,0x32,0x82,0x4f,0xba,0x18,0x1d,0xf9,0xc3,0x63,0xbe,0x49,0x62,0x46 }, { 0x0e,0xb7,0xdf,0x70,0x5c,0x6e,0xa4,0x80,0x4d,0x78,0x18,0x76,0x62,0x0e,0xcc,0x64,0x3e,0x1f,0x15,0x34,0x2f,0x3d,0x51,0x99,0x47,0x5d,0x28,0x9a,0xac,0x89,0x37,0x5b }, { 0x10,0x38,0x87,0x2a,0xbc,0xee,0x1d,0x94,0xbc,0x8b,0xe4,0xcf,0x4b,0xb7,0x54,0xa2,0xea,0xa7,0xa0,0x8d,0xd1,0x0d,0x0d,0xe1,0x4d,0x18,0x1b,0xa5,0xc2,0xba,0xb8,0x74 }, { 0x54,0x00,0x6a,0x1f,0x61,0x47,0x62,0x81,0x67,0x99,0xc0,0xa3,0xfc,0x00,0xf4,0x71,0xc6,0x68,0x24,0xe2,0x8a,0x36,0x33,0x09,0xc1,0x88,0x0a,0xa2,0xc0,0x3c,0x04,0x04 }, { 0xef,0x3e,0xe6,0x2e,0x18,0x00,0x3f,0xc8,0x66,0x08,0xf8,0xe5,0xa9,0xc5,0x25,0x8a,0x1a,0x92,0x43,0x93,0x96,0x88,0xf4,0x8e,0xc9,0xa9,0x81,0xa6,0x2d,0x75,0x96,0x69 }, { 0x95,0x3d,0xff,0x40,0x08,0x62,0xe7,0x14,0x0c,0xac,0x7d,0x9b,0xcb,0x47,0xd9,0x20,0x62,0x7b,0x4b,0xd9,0x91,0x3b,0x4b,0x2b,0x0e,0x1c,0xf1,0x10,0xbe,0x53,0xd4,0x42 }, { 0xc6,0x93,0xdb,0xf7,0x70,0xa3,0xd0,0xd8,0x41,0x2e,0xa0,0xa0,0x22,0xa8,0x75,0x2b,0xeb,0xf4,0xbd,0x76,0x73,0x03,0xb1,0x8e,0x11,0xb9,0xd1,0x6d,0xea,0xe6,0x3b,0x01 }, { 0x0e,0xd2,0x64,0xa5,0x36,0x8f,0xf8,0xed,0x0a,0x1c,0xcd,0x28,0x58,0xf6,0xdb,0xfd,0x8a,0x88,0x12,0x90,0x37,0x9e,0x9d,0xa2,0x68,0xba,0xc1,0xa6,0x08,0x8b,0xe2,0x08 }, { 0xa4,0x86,0x04,0x50,0x26,0xba,0x84,0x28,0xaa,0x8c,0x34,0xa9,0x36,0x56,0x24,0x6c,0xd8,0x78,0x18,0x7a,0x38,0x9f,0x1a,0x56,0xe5,0xf1,0x85,0x53,0x90,0xe2,0xc8,0x7d }, { 0xd1,0x34,0x09,0x31,0xc2,0xcd,0xed,0xa1,0xd7,0xf2,0x9b,0x15,0xb6,0xf2,0xa4,0xc3,0x6d,0xd4,0x36,0x15,0xf6,0xd0,0x13,0x55,0x03,0xef,0xd2,0x27,0xf8,0xf9,0x4b,0x72 }, { 0x44,0x39,0x8c,0x0f,0x24,0x53,0xc3,0x57,0x46,0x99,0x0a,0xac,0x8d,0xc5,0xe5,0x35,0xd7,0x30,0x93,0x3c,0xc9,0x27,0x0c,0x88,0x2e,0xa3,0x70,0xf7,0x13,0xd0,0xbc,0x07 }, { 0xcb,0x87,0x51,0xb4,0x6c,0x54,0xd0,0x67,0x17,0x91,0x11,0x34,0xda,0xb5,0x33,0x1e,0x4d,0xfb,0x46,0xfa,0x45,0xef,0xd1,0x99,0xe0,0xef,0xd3,0xf2,0xac,0x5a,0x3d,0x12 }, { 0x34,0x0f,0x84,0x28,0x12,0x04,0x11,0xa2,0x63,0x67,0x1d,0x2e,0x63,0x67,0x16,0xc0,0x52,0xec,0xd2,0x46,0xcd,0x72,0x54,0x44,0x40,0x31,0x38,0x2a,0x16,0x60,0x26,0x59 }, { 0x34,0x36,0x13,0x10,0x2a,0x94,0xe5,0xf0,0x03,0x12,0x62,0x19,0x5d,0xa2,0x63,0x05,0xc6,0xbb,0x24,0xbb,0x3a,0x0c,0xdc,0x5d,0x53,0x03,0x7f,0x04,0xdc,0xc0,0xcf,0x58 }, { 0xbf,0x10,0xab,0xf9,0x35,0xd2,0x94,0xb5,0xe2,0x42,0x16,0xb4,0x23,0x88,0x25,0x1a,0x23,0x16,0x60,0xff,0xc8,0xd5,0x03,0xbf,0xbf,0xd6,0xc1,0xb7,0xda,0xe9,0xa6,0x6b }, { 0x41,0xda,0x96,0x26,0x8d,0x7f,0x7a,0x85,0x1c,0xaa,0x4d,0x3a,0xa1,0x7d,0x51,0x50,0x9a,0x77,0xb7,0xc8,0xcc,0x7e,0x40,0x41,0xb1,0xfc,0x83,0x5d,0xc3,0x36,0xf6,0x1a }, { 0x73,0x19,0xa1,0x81,0x1c,0x8f,0x4e,0xc9,0x70,0x10,0x44,0xc8,0xc3,0x5a,0x1b,0x84,0xf5,0x4a,0x93,0x75,0x69,0xb2,0x21,0x69,0x12,0x36,0x6f,0x08,0xb3,0x15,0xd4,0x7f }, { 0x91,0x63,0x55,0xeb,0x1d,0x6e,0xb0,0xdd,0xd6,0x00,0xac,0x37,0xe2,0xe5,0x99,0x6b,0x85,0x2e,0x10,0x8b,0xd1,0x41,0x0d,0x85,0xe4,0xd2,0x1f,0x2c,0x3e,0xb8,0x4b,0x37 }, { 0xbf,0x33,0xe4,0xa4,0x34,0x88,0x86,0xa4,0xef,0x75,0x41,0x74,0xfa,0x5c,0x2b,0xbf,0x51,0xc0,0xed,0x2a,0x08,0x1f,0x1d,0xa3,0x20,0x5d,0xd9,0x9e,0xc3,0x7e,0x2e,0x0a }, { 0xae,0x20,0x8c,0x37,0xb8,0xd0,0x76,0x45,0x56,0x41,0x80,0xc6,0xae,0xa8,0x71,0x09,0x60,0x8f,0x20,0x58,0x9a,0x19,0x46,0x6d,0xc3,0xb4,0x32,0x86,0x05,0xa8,0x89,0x41 }, { 0x78,0x31,0xc3,0xdb,0x55,0xef,0x27,0xb3,0x1d,0x04,0xd5,0x7c,0x06,0xa9,0xf8,0x9b,0x5e,0x5a,0xb9,0x00,0x28,0xe6,0xf9,0x5b,0x5e,0xaa,0xe9,0x9c,0x3f,0xce,0xf7,0x0e }, { 0x6d,0x33,0x2c,0xc7,0xb8,0xff,0x4a,0x5c,0xff,0xf7,0xe8,0xff,0x4c,0xb8,0x89,0x97,0x28,0x29,0x21,0xd0,0xe5,0xfe,0xb2,0x90,0x54,0x8c,0xed,0x81,0x4f,0xed,0x69,0x25 }, { 0x16,0x59,0x74,0x83,0xd8,0x34,0x92,0xd5,0x0b,0x54,0x8a,0x06,0xd1,0x5d,0x8b,0x5c,0xdf,0xc0,0x09,0x07,0x1d,0x0f,0x7e,0xd9,0x3a,0x5d,0x2b,0x86,0xca,0x23,0xe0,0x52 }, { 0x0e,0xc1,0xce,0x0f,0x6e,0x8d,0x7b,0x30,0x75,0x69,0x1b,0xf4,0x87,0x2f,0x0c,0x6d,0x6d,0xc4,0x11,0x43,0xfd,0x3b,0xdb,0xdf,0x43,0x9a,0xda,0xc6,0x50,0xf9,0x84,0x03 }, { 0xbd,0x1b,0x2a,0x42,0xd3,0xa6,0x7e,0x51,0xe2,0xaa,0x68,0x77,0xdb,0x64,0xa7,0x70,0x0c,0x8d,0xf2,0x33,0xe1,0xdf,0x6d,0x8a,0xaf,0x81,0xe8,0x50,0xca,0x12,0xd3,0x1a }, { 0x84,0x7c,0x0d,0x2c,0x37,0x52,0x34,0xf3,0x65,0xe6,0x60,0x95,0x51,0x87,0xa3,0x73,0x5a,0x0f,0x76,0x13,0xd1,0x60,0x9d,0x3a,0x6a,0x4d,0x8c,0x53,0xae,0xaa,0x5a,0x22 }, { 0xbd,0x1b,0x2a,0x42,0xd3,0xa6,0x7e,0x51,0xe2,0xaa,0x68,0x77,0xdb,0x64,0xa7,0x70,0x0c,0x8d,0xf2,0x33,0xe1,0xdf,0x6d,0x8a,0xaf,0x81,0xe8,0x50,0xca,0x12,0xd3,0x1a }, { 0x84,0x7c,0x0d,0x2c,0x37,0x52,0x34,0xf3,0x65,0xe6,0x60,0x95,0x51,0x87,0xa3,0x73,0x5a,0x0f,0x76,0x13,0xd1,0x60,0x9d,0x3a,0x6a,0x4d,0x8c,0x53,0xae,0xaa,0x5a,0x22 }, { 0xbd,0x1b,0x2a,0x42,0xd3,0xa6,0x7e,0x51,0xe2,0xaa,0x68,0x77,0xdb,0x64,0xa7,0x70,0x0c,0x8d,0xf2,0x33,0xe1,0xdf,0x6d,0x8a,0xaf,0x81,0xe8,0x50,0xca,0x12,0xd3,0x1a }, { 0x7a,0xd9,0xcf,0x6e,0x89,0xb7,0x50,0x54,0x25,0xaf,0xf9,0x54,0xe8,0x9c,0xa2,0x2b,0x6c,0x62,0x88,0x4e,0x8c,0xb6,0x28,0x32,0x2f,0x9c,0xce,0x85,0xcb,0x2c,0xfa,0x4a }, { 0x7c,0x2c,0x45,0x89,0x03,0xe6,0x74,0xca,0xbb,0x01,0x27,0xcc,0xce,0xd3,0x93,0xa3,0xf1,0x48,0x40,0xf8,0x0d,0xe7,0x70,0xee,0x82,0xa0,0x03,0xdb,0x37,0x2c,0x17,0x07 }, { 0x56,0x54,0xd6,0xfa,0x8a,0x32,0x51,0x50,0x48,0x0d,0x0c,0x1e,0x3e,0xe9,0x4c,0xf3,0x0d,0x36,0x5f,0xeb,0xb3,0x93,0xcf,0xbf,0x8b,0x09,0x16,0x21,0x1a,0xbf,0x91,0x75 }, { 0x44,0x20,0x79,0xef,0x16,0xfd,0x61,0xcf,0xf2,0xe0,0xad,0xf4,0x39,0x73,0x92,0x65,0x6d,0x9b,0x44,0xea,0xad,0x4c,0xc7,0x28,0x05,0xe7,0x81,0xa0,0xdc,0x65,0xe7,0x1d }, { 0xc5,0xdb,0x52,0xd5,0xb0,0xf9,0xfa,0x5f,0x68,0x79,0x06,0xf9,0x29,0x3d,0x83,0xca,0x32,0x5a,0xd4,0x93,0xd3,0x10,0x5c,0x80,0x64,0xe4,0x10,0xe2,0x78,0x20,0xb5,0x0d }, { 0x0d,0xd8,0x0f,0x97,0x4d,0xa1,0xe8,0x7b,0x4c,0xc4,0x88,0xaa,0xb7,0x5e,0x78,0x91,0x56,0x6d,0x11,0x28,0xea,0xbf,0x2d,0xc0,0xf8,0x95,0x3f,0xc7,0x86,0x24,0x27,0x5f }, { 0x22,0x0f,0xe3,0xf9,0xd6,0x06,0x8a,0xf3,0x34,0xe4,0xb9,0x9a,0xa2,0x65,0x73,0x48,0xaa,0x63,0x4f,0x5c,0xf2,0x60,0x61,0x9e,0xb1,0x73,0x42,0x95,0x80,0xcc,0x7e,0x19 }, { 0xa1,0x24,0xc9,0xf3,0x13,0x29,0x11,0x9c,0x2c,0x8c,0x27,0x12,0x7c,0x35,0xc4,0x71,0x6b,0x9c,0xa2,0x97,0x9a,0x99,0xf8,0xce,0x2a,0xf4,0xa4,0x2e,0x19,0xd6,0x5e,0x7b }, { 0x7e,0x6f,0xa1,0xca,0x0d,0x7b,0xd7,0x7e,0x3c,0x19,0x8f,0x01,0xe2,0xf0,0xe8,0xd8,0xe4,0x00,0x7a,0x1c,0xdf,0xcd,0x1e,0xc5,0x0b,0x78,0x32,0x06,0x76,0xbf,0xdb,0x68 }, { 0x2c,0x5a,0x55,0xfe,0x30,0xa1,0x81,0x10,0xe4,0x3d,0xad,0x52,0x02,0x75,0x0d,0xe0,0x2c,0xdd,0x8c,0x14,0x6d,0xab,0x9c,0x40,0xb0,0xdc,0x60,0x26,0xd3,0x64,0x6e,0x28 }, { 0x84,0x7c,0x0d,0x2c,0x37,0x52,0x34,0xf3,0x65,0xe6,0x60,0x95,0x51,0x87,0xa3,0x73,0x5a,0x0f,0x76,0x13,0xd1,0x60,0x9d,0x3a,0x6a,0x4d,0x8c,0x53,0xae,0xaa,0x5a,0x22 }, tinyssh-20250501/old/crypto-tests/precomp_curve25519.data.py000066400000000000000000000036771500472222400234650ustar00rootroot00000000000000import binascii P = 2 ** 255 - 19 A = 486662 def expmod(b, e, m): if e == 0: return 1 t = expmod(b, e / 2, m) ** 2 % m if e & 1: t = (t * b) % m return t def inv(x): return expmod(x, P - 2, P) # Addition and doubling formulas taken from Appendix D of "Curve25519: # new Diffie-Hellman speed records". def add((xn,zn), (xm,zm), (xd,zd)): x = 4 * (xm * xn - zm * zn) ** 2 * zd z = 4 * (xm * zn - zm * xn) ** 2 * xd return (x % P, z % P) def double((xn,zn)): x = (xn ** 2 - zn ** 2) ** 2 z = 4 * xn * zn * (xn ** 2 + A * xn * zn + zn ** 2) return (x % P, z % P) def curve25519(n, base): one = (base,1) two = double(one) # f(m) evaluates to a tuple containing the mth multiple and the # (m+1)th multiple of base. def f(m): if m == 1: return (one, two) (pm, pm1) = f(m / 2) if (m & 1): return (add(pm, pm1, one), double(pm1)) return (double(pm), add(pm, pm1, one)) ((x,z), _) = f(n) return (x * inv(z)) % P def unpack(s): if len(s) != 32: raise ValueError('Invalid Curve25519 argument') return sum(ord(s[i]) << (8 * i) for i in range(32)) def pack(n): return ''.join([chr((n >> (8 * i)) & 255) for i in range(32)]) def clamp(n): n &= ~7 n &= ~(128 << 8 * 31) n |= 64 << 8 * 31 return n def crypto_scalarmult_curve25519(n, p): n = clamp(unpack(n)) p = unpack(p) return pack(curve25519(n, p)) def crypto_scalarmult_curve25519_base(n): n = clamp(unpack(n)) return pack(curve25519(n, 9)) f = open("precomp.txt") def l(line): l = "" for i in range(32): if i == 31: l += "0x%s%s" % (line[2*i], line[2*i+1]) else: l += "0x%s%s," % (line[2*i], line[2*i+1]) return l while True: line=f.readline() if len(line) == 0: f.close() break print "{", l(binascii.hexlify(crypto_scalarmult_curve25519_base(binascii.unhexlify(line[0:-1])))), "}," tinyssh-20250501/old/crypto-tests/precomp_ed25519.data000066400000000000000000005340301500472222400222720ustar00rootroot00000000000000{ 0x3b,0x6a,0x27,0xbc,0xce,0xb6,0xa4,0x2d,0x62,0xa3,0xa8,0xd0,0x2a,0x6f,0x0d,0x73,0x65,0x32,0x15,0x77,0x1d,0xe2,0x43,0xa6,0x3a,0xc0,0x48,0xa1,0x8b,0x59,0xda,0x29 }, { 0x4c,0xb5,0xab,0xf6,0xad,0x79,0xfb,0xf5,0xab,0xbc,0xca,0xfc,0xc2,0x69,0xd8,0x5c,0xd2,0x65,0x1e,0xd4,0xb8,0x85,0xb5,0x86,0x9f,0x24,0x1a,0xed,0xf0,0xa5,0xba,0x29 }, { 0x74,0x22,0xb9,0x88,0x75,0x98,0x06,0x8e,0x32,0xc4,0x44,0x8a,0x94,0x9a,0xdb,0x29,0x0d,0x0f,0x4e,0x35,0xb9,0xe0,0x1b,0x0e,0xe5,0xf1,0xa1,0xe6,0x00,0xfe,0x26,0x74 }, { 0xf3,0x81,0x62,0x6e,0x41,0xe7,0x02,0x7e,0xa4,0x31,0xbf,0xe3,0x00,0x9e,0x94,0xbd,0xd2,0x5a,0x74,0x6b,0xee,0xc4,0x68,0x94,0x8d,0x6c,0x3c,0x7c,0x5d,0xc9,0xa5,0x4b }, { 0xfd,0x50,0xb8,0xe3,0xb1,0x44,0xea,0x24,0x4f,0xbf,0x77,0x37,0xf5,0x50,0xbc,0x8d,0xd0,0xc2,0x65,0x0b,0xbc,0x1a,0xad,0xa8,0x33,0xca,0x17,0xff,0x8d,0xbf,0x32,0x9b }, { 0x3e,0xe2,0xa8,0xa7,0x28,0x3c,0xb2,0xfd,0x72,0x89,0x43,0xda,0xa1,0x27,0xef,0x09,0xe4,0x83,0x07,0x1a,0x8b,0x4b,0xc6,0x99,0xba,0x45,0x22,0xf0,0x9b,0x14,0xcf,0xde }, { 0xbe,0x3b,0x4f,0x95,0xd1,0xd8,0x75,0xd7,0x1d,0xd2,0xfa,0xcf,0x6c,0x5e,0x4d,0xa5,0x7c,0x1a,0x2c,0x79,0xde,0xad,0x9e,0x1f,0xc5,0xc3,0xb5,0xc1,0xde,0x54,0xc0,0x22 }, { 0x67,0x54,0x03,0x04,0x32,0x88,0xcc,0x7c,0xd1,0x10,0xc6,0xa4,0xa7,0x0e,0xca,0x13,0x7b,0x6e,0xba,0x5b,0xb8,0xcf,0xc0,0x08,0xa4,0x0c,0xdf,0xb3,0xe4,0x53,0xc2,0x9e }, { 0xb9,0x2a,0xaa,0x7c,0x8d,0xb2,0x11,0x39,0xaa,0x7d,0x7e,0xc0,0xda,0xa8,0xd7,0xe6,0x25,0x19,0xd6,0xee,0x46,0xa4,0x53,0x4e,0x07,0x64,0x4c,0x68,0x3a,0x00,0x83,0x91 }, { 0x17,0x26,0x06,0x22,0x77,0xd7,0xb6,0x81,0x78,0x7e,0x95,0xda,0x60,0xff,0xf0,0x32,0xd2,0xe9,0x8c,0xf3,0xd4,0x04,0xea,0xb2,0x82,0x1c,0x49,0x80,0x6e,0x67,0x9f,0x3e }, { 0xc0,0x5b,0x7b,0xee,0x64,0xc8,0x4c,0x7a,0xd8,0x0e,0x45,0xac,0x14,0xe9,0x8b,0x3e,0x3e,0x64,0x50,0x29,0x02,0x40,0x1d,0xc4,0x91,0x12,0x6d,0xaf,0xc1,0xe9,0x38,0x61 }, { 0xd7,0xdd,0xc4,0xe7,0x91,0x66,0x90,0xdc,0xd6,0x6f,0xc9,0x62,0x93,0xbd,0x3d,0x39,0x98,0x79,0xac,0x73,0x6b,0x7d,0x1b,0x86,0xcf,0x45,0xa8,0x44,0x30,0x96,0x65,0xbd }, { 0xc0,0xdd,0x26,0x97,0xc4,0xa1,0x7d,0xf8,0x3f,0x36,0xa9,0x97,0x99,0xdd,0x38,0x49,0x58,0x72,0x84,0x90,0xfa,0xc7,0xd1,0x31,0x82,0x05,0x2d,0x88,0x4e,0x6e,0x42,0x84 }, { 0xed,0x85,0xe2,0x1f,0x75,0x15,0x5c,0x85,0x01,0x51,0xa8,0x61,0xd5,0x7d,0x62,0xe6,0x56,0x98,0x9a,0x3d,0x2d,0x6c,0x3e,0xe1,0xfc,0x2c,0xe9,0x26,0x71,0x6a,0x20,0xf4 }, { 0xbe,0x1f,0xb9,0x96,0xbe,0x80,0xe7,0xbd,0x2b,0x78,0xda,0x15,0x7a,0x22,0x4a,0xb5,0x23,0x20,0xcc,0xa0,0x2a,0xe5,0xa0,0x2e,0xfb,0xb4,0x19,0x17,0x9b,0xe9,0x28,0xf9 }, { 0x56,0x99,0xa9,0xce,0xf8,0x70,0xe2,0xff,0x0c,0x02,0x2b,0x67,0x68,0x9c,0xc7,0x6f,0xe0,0x5e,0x90,0x91,0x5c,0x5f,0x01,0x43,0xf9,0x35,0x6c,0xa7,0x2f,0x4a,0xff,0x99 }, { 0x79,0xf6,0xd7,0xbe,0x8a,0x5a,0xc1,0xa6,0xff,0x6a,0xcc,0x51,0xbb,0xa8,0x0c,0x52,0x39,0x96,0x27,0x60,0x23,0x06,0x72,0x82,0x93,0xe7,0x59,0x5f,0x7e,0xcf,0x30,0x7f }, { 0xec,0x9c,0x1a,0xce,0xd4,0xc1,0x81,0xc9,0xf7,0x52,0x6b,0x68,0xab,0x6c,0x7d,0x44,0xdd,0x22,0xee,0x94,0x2d,0xb1,0x1b,0xd0,0xf8,0xb3,0x02,0x5f,0xcd,0xc5,0x1f,0x79 }, { 0x1c,0x3c,0x06,0x41,0x2d,0xc1,0x8c,0xbb,0xa8,0x79,0xb8,0xd4,0x73,0xc5,0x0f,0xb4,0x19,0xdb,0x5c,0xa9,0xc3,0x88,0x2f,0x2a,0x1d,0xc4,0x9e,0xbc,0x8d,0x9e,0x43,0x54 }, { 0x04,0x54,0xa2,0x0a,0x28,0xf9,0x2e,0xd2,0x44,0xb7,0x36,0x72,0xce,0x85,0x67,0x0a,0x89,0xee,0x77,0x25,0x54,0x72,0xe0,0x85,0x10,0x42,0xbd,0x9f,0x3d,0xbb,0x7d,0xe8 }, { 0x23,0xd6,0x93,0x5a,0x75,0xf6,0x99,0xc0,0x0c,0x47,0x32,0xd8,0x0a,0xcd,0x3b,0x2d,0xfa,0x03,0x6e,0x8c,0x46,0x36,0x30,0xd3,0x4c,0x5a,0xa8,0x4d,0x57,0x67,0x2d,0xd6 }, { 0x85,0xe0,0x32,0x88,0x6c,0xfc,0xf8,0xaf,0xae,0x03,0xb1,0x81,0x22,0x8e,0x23,0x9a,0x92,0x3b,0x8b,0x63,0xa2,0x87,0x89,0x4d,0xad,0x4e,0x0b,0x4a,0xce,0x18,0x7d,0x99 }, { 0x3c,0xc6,0xd8,0xb8,0x0f,0x0b,0x78,0xa7,0x5f,0x2b,0xad,0x3b,0x90,0x7c,0x53,0xb0,0xb0,0x48,0x19,0x95,0x14,0x39,0x93,0x55,0xe5,0xf0,0x85,0x34,0x56,0xe8,0xb6,0xd6 }, { 0x0d,0xdf,0x68,0xb9,0xa7,0x93,0x1d,0x32,0x5b,0x36,0xd0,0xa1,0x5e,0x2b,0x04,0xc8,0x37,0x9a,0x76,0xf4,0x7d,0x1d,0x4a,0xaf,0xcd,0xb4,0xeb,0xbe,0x88,0x4b,0x19,0x66 }, { 0xf0,0xea,0xa2,0x8b,0xf5,0x4f,0x04,0x0f,0x73,0xd8,0x42,0xd0,0x1f,0xfb,0xa1,0x42,0xe2,0xdd,0x28,0x01,0x59,0xbd,0x82,0x00,0x9a,0x42,0xbf,0xbb,0x5d,0xa7,0x2d,0x62 }, { 0xbd,0xcd,0x64,0xae,0x7a,0xdd,0xa4,0xfd,0x24,0x0d,0xa5,0x00,0x16,0xc3,0xf5,0x19,0x7d,0x5e,0xa9,0xfa,0x28,0xf5,0x66,0x47,0xff,0x9f,0x79,0x94,0xe2,0xd7,0x5b,0x0c }, { 0xe4,0xa6,0x30,0x99,0x3b,0xf3,0xae,0x0d,0x33,0x35,0x6b,0x13,0x88,0x19,0xd8,0x70,0xc5,0x47,0x68,0x25,0xdb,0x39,0x14,0xc9,0xde,0xd3,0x92,0xcf,0x44,0x3b,0xbc,0x6f }, { 0x7f,0xf7,0xbc,0x16,0x71,0x02,0x0f,0x3a,0x07,0xe7,0x80,0xfb,0x39,0x9d,0x8a,0x68,0x83,0x4a,0x48,0xfb,0xf6,0x22,0x65,0x50,0x1b,0xf8,0x80,0x82,0x79,0x7b,0x91,0x3f }, { 0xce,0x97,0xbe,0xb9,0x0a,0xa1,0x1a,0xd3,0xe0,0x0c,0x6e,0xed,0x4f,0xb2,0x0e,0x8b,0x8a,0xb7,0xee,0x34,0x12,0x97,0x97,0xe2,0x20,0x3f,0x93,0x1e,0x17,0xd1,0xbd,0x68 }, { 0x00,0x9d,0x83,0x49,0x63,0x7c,0xa9,0x8e,0xb1,0xa8,0xb9,0x5a,0x8b,0x94,0x86,0xe9,0x88,0x2c,0x76,0x64,0x3c,0xc1,0xd7,0xd1,0xbb,0xd6,0x3d,0x83,0xf3,0xfc,0x6e,0xfc }, { 0x8c,0x70,0x38,0x3f,0x69,0x15,0x85,0x4b,0xf2,0x89,0x59,0xc7,0x73,0x81,0xba,0x6a,0xd4,0xb6,0xed,0x44,0x7e,0x04,0x64,0x56,0x95,0x48,0x4b,0x47,0xc6,0xa1,0xa9,0xf9 }, { 0x58,0x7d,0x18,0xf6,0xa4,0xc2,0x63,0xef,0xf8,0x2c,0x45,0xe9,0x43,0xd9,0xd6,0x4c,0x0e,0x6a,0x47,0x33,0x22,0x5d,0xb6,0xc1,0xce,0x50,0xc3,0x5c,0x65,0x10,0xc4,0x2f }, { 0x05,0xe5,0x0a,0xf9,0x1e,0xa6,0x0c,0xa5,0xb6,0xd3,0xa4,0xe8,0x2a,0x83,0x2a,0x42,0x6b,0x2d,0x9f,0x82,0xe0,0x53,0x58,0x9a,0x86,0x2f,0xd2,0x36,0xbc,0x69,0xe5,0xb9 }, { 0xf2,0x3c,0xbb,0x8f,0x25,0xda,0xd2,0x32,0xb6,0x70,0xb5,0x07,0xe2,0xe5,0x6b,0x14,0xc5,0x1d,0x16,0x20,0x7c,0xfb,0x62,0xf1,0x36,0xe5,0x71,0x71,0x08,0xcd,0x03,0x96 }, { 0x4c,0x96,0xab,0xd4,0xaa,0xa9,0x7e,0xe9,0x75,0xa7,0x64,0xc4,0x62,0xea,0x36,0x46,0x7f,0x75,0x4e,0x67,0x91,0x21,0x31,0x66,0xe4,0x69,0x28,0x2f,0x91,0xc9,0xe1,0xde }, { 0x30,0x16,0x16,0xaa,0xb9,0xf9,0x7e,0x93,0x9a,0x17,0x38,0x7e,0xe7,0x20,0x29,0x66,0xa9,0xcc,0x09,0x5b,0xa7,0x7c,0x2f,0xa2,0x68,0xb0,0x3d,0xd8,0xf2,0xf1,0x61,0x46 }, { 0xea,0x97,0x2d,0xbb,0x00,0x34,0x7f,0x27,0x0b,0x96,0xda,0xf9,0xef,0xe3,0x24,0x39,0x17,0x67,0x56,0xea,0xce,0xea,0x98,0x56,0x63,0x6f,0x52,0xf3,0xc0,0xa7,0x54,0x9e }, { 0xbf,0x31,0x82,0x53,0x80,0x46,0xc4,0x12,0xe7,0xc2,0x2e,0xd7,0x58,0x15,0xde,0x04,0x99,0x3e,0x7a,0x51,0x38,0x78,0x18,0x6b,0x79,0xfe,0xdc,0x7a,0x2d,0xd3,0x61,0x32 }, { 0x67,0x60,0xcd,0x63,0xb9,0x5f,0x5b,0xfa,0x0a,0x84,0x81,0xe2,0x33,0x24,0xb1,0x50,0x4b,0x1d,0x9a,0xad,0xaa,0xa3,0x6e,0x67,0x98,0xe6,0xff,0x64,0xa6,0x33,0xb8,0x68 }, { 0x96,0x07,0x91,0xca,0x5b,0x52,0x6e,0xd8,0x01,0x20,0x21,0x24,0x7a,0xed,0xe9,0xb2,0x3e,0x4f,0xba,0xc7,0x39,0xb2,0xfe,0xe8,0x48,0x74,0x91,0xc2,0x8d,0xef,0xe1,0xbf }, { 0xce,0x58,0xa1,0x36,0x1d,0xef,0x2b,0x6d,0x9e,0xc9,0x07,0x19,0x6f,0x0d,0xda,0xe3,0x08,0xf2,0x0e,0xe3,0x3f,0x68,0x51,0xac,0x86,0xa1,0x46,0x03,0x89,0xb1,0x2f,0x62 }, { 0x43,0x70,0x82,0x85,0x3d,0x70,0x6c,0xaf,0x45,0xb3,0x17,0x8b,0x60,0x85,0x52,0x18,0x24,0x0b,0xdb,0xa3,0x91,0xa9,0x44,0x96,0x74,0x3b,0xa3,0xae,0x21,0xcb,0x76,0x9c }, { 0x9a,0x88,0xed,0x92,0xeb,0x82,0xa9,0xd6,0x08,0x9c,0x72,0x30,0xf4,0x27,0xdc,0x67,0x58,0x00,0xef,0xb8,0xce,0x65,0xeb,0xcd,0xca,0xbd,0xf1,0x7a,0x15,0xdd,0x58,0x8d }, { 0xb6,0xcd,0xa7,0xc2,0x2f,0x16,0xc2,0x01,0x3d,0xf7,0xf1,0x95,0xd6,0x6d,0xbb,0x22,0xc5,0xe0,0x24,0x05,0x3d,0x6c,0xc7,0x15,0x54,0xb3,0x1d,0x9f,0xd1,0xdd,0x3f,0x1b }, { 0xce,0x1c,0x43,0x05,0xd4,0x62,0x80,0xbb,0xbd,0x01,0x04,0x88,0x9d,0xc3,0x89,0x21,0x6c,0x74,0x01,0x10,0x86,0xeb,0x66,0x71,0x7a,0xa0,0xba,0xc1,0xbc,0x25,0x89,0x21 }, { 0x89,0xae,0x5b,0xf7,0x81,0x39,0x3f,0xfd,0xc2,0xe8,0x89,0xcb,0xaa,0xc1,0xad,0xd5,0x1b,0xde,0x8a,0xbe,0xbb,0x60,0x9e,0xdd,0x9f,0x27,0x62,0x5c,0xe2,0x47,0xb8,0x4f }, { 0xdb,0x70,0x0d,0xc4,0xee,0xcf,0x15,0xab,0x0d,0xa2,0xc7,0xd2,0x5a,0xc2,0x04,0xd8,0x4f,0x08,0x15,0x54,0x53,0xb1,0x2a,0xb5,0x3b,0xf4,0xab,0x86,0x76,0x7b,0x90,0x1f }, { 0x28,0x99,0x0a,0xa3,0xb0,0x64,0x83,0x0f,0x5d,0x82,0x15,0xf1,0xcf,0xb6,0x80,0xcd,0x60,0xad,0x4c,0x75,0x99,0xc1,0x59,0x1c,0x19,0x59,0xa2,0x4f,0x86,0x06,0xec,0xb6 }, { 0x2c,0x70,0xea,0x61,0x4b,0x31,0x71,0x8f,0xc7,0x7c,0xa8,0xcd,0xf4,0x7c,0xb9,0xeb,0x74,0xa2,0xce,0x93,0xf7,0xd7,0x0f,0xf7,0x43,0x8a,0x58,0x24,0xa5,0xc9,0xa6,0xc7 }, { 0x4c,0x69,0xa9,0xb6,0x69,0x4f,0x6d,0xe1,0x3b,0x0d,0x8d,0xb9,0xa0,0x62,0xdc,0xf8,0x96,0xe5,0xdb,0xf2,0xf0,0x6a,0x18,0x7b,0x33,0xd8,0x4d,0xaf,0x69,0x78,0x8b,0xa2 }, { 0xd5,0xbc,0x8e,0x60,0x06,0xef,0xd1,0x6e,0x53,0x35,0x14,0x9e,0x92,0xc0,0xb2,0x19,0x99,0x5b,0x13,0xce,0xb4,0x8b,0xbd,0xea,0x56,0x76,0xbf,0x11,0xf2,0x14,0xef,0xe4 }, { 0x07,0xfb,0x9f,0xb5,0x33,0xc5,0x38,0x7c,0xcf,0xe7,0xfc,0x05,0xee,0xd1,0x25,0x02,0x93,0xf0,0xc4,0x71,0x9f,0x74,0xfe,0xd7,0x89,0x81,0x04,0xc8,0x2f,0xfd,0x0f,0x11 }, { 0xbd,0xab,0xc0,0xc0,0x41,0x67,0x52,0x02,0xa9,0x1c,0x9f,0x40,0x27,0xa1,0x55,0x75,0xbe,0x40,0x8e,0x14,0x83,0xa8,0xf0,0x95,0x74,0x94,0x3c,0xee,0x4c,0x91,0xa5,0x32 }, { 0x4b,0x9a,0x5e,0x97,0x20,0x14,0x4a,0x81,0x9a,0xaf,0xd6,0x35,0x04,0x92,0x23,0xdf,0xc8,0x34,0x66,0xc9,0x59,0x60,0x71,0xba,0x22,0x87,0xb4,0x47,0x52,0xdc,0xe7,0xc1 }, { 0xba,0x02,0x95,0xf0,0xe9,0xbb,0x81,0x19,0x06,0xf2,0x2e,0xf8,0x19,0x9c,0xad,0xd1,0x82,0x43,0x4d,0xe1,0x62,0x64,0x67,0x7b,0x11,0x94,0xca,0xc7,0xcb,0x11,0xb7,0x01 }, { 0x8d,0x0f,0x4d,0x43,0x87,0xca,0x66,0x01,0x8e,0xd5,0x16,0xdf,0xab,0x78,0xdb,0x0a,0x3e,0xa1,0xa0,0x90,0x7f,0xf9,0x27,0xd4,0x18,0x95,0x6c,0x21,0xad,0x67,0x92,0x60 }, { 0xe7,0x6e,0xae,0xc4,0x9e,0x4d,0x35,0x70,0x7c,0xab,0x5d,0x79,0x7e,0x94,0x08,0xf0,0xe8,0xbb,0x76,0x3b,0x1f,0x9b,0xab,0xea,0xb3,0x1c,0xbc,0x0a,0x59,0x51,0xd7,0x58 }, { 0xfa,0x16,0x0f,0x60,0xe8,0xe3,0x6b,0x1a,0xc3,0xfe,0x0b,0x14,0x46,0x35,0x2b,0x50,0x8a,0x7a,0xfc,0x30,0x83,0x21,0x67,0x52,0xbb,0xc3,0x35,0xc4,0xa8,0x02,0x4a,0x63 }, { 0xde,0x38,0x4b,0xe0,0x2d,0x57,0xc5,0xe2,0x47,0x9a,0xe6,0xbe,0xe9,0x36,0xc4,0x10,0xe5,0x0e,0x17,0x3b,0x30,0x67,0x04,0x3c,0xbf,0x21,0xaf,0xa0,0x0c,0xfb,0x83,0xc2 }, { 0x2e,0x5c,0xd3,0x5f,0xfb,0x2a,0xa2,0xab,0xe2,0x25,0x97,0xde,0x55,0x9b,0x25,0x9f,0xa2,0x1c,0x46,0x78,0xa2,0x11,0x07,0xa1,0xb4,0x39,0x4b,0x75,0xac,0xee,0xcd,0x85 }, { 0x77,0xcc,0xff,0x97,0x94,0x07,0x54,0x29,0x2d,0x8c,0x5d,0x57,0x7e,0x09,0xbe,0xfd,0x2b,0x1f,0x73,0x69,0x50,0x7a,0x33,0xe1,0xe6,0xcb,0x6a,0xaf,0x73,0x4e,0x4d,0x66 }, { 0x74,0xa3,0x0f,0x21,0x83,0xf6,0x75,0x04,0x21,0x80,0xc9,0x25,0x4d,0x82,0x55,0xa8,0x8a,0x47,0x2a,0x13,0x3d,0xdc,0xfb,0xd5,0xd2,0x04,0xdc,0xbb,0xd4,0x09,0x19,0xe4 }, { 0xcb,0x9f,0x80,0x6d,0xe1,0x3f,0x9e,0x5b,0xd2,0xc0,0x96,0x03,0x77,0x6c,0x68,0x5d,0x42,0x4b,0x6f,0x2d,0x2b,0x9f,0xe8,0xa4,0xce,0x77,0xae,0x2c,0xa9,0x87,0x1a,0x99 }, { 0x75,0x6d,0x27,0x80,0x2b,0x0b,0x77,0x82,0x2d,0x4a,0x0c,0x3a,0x5d,0xb5,0xcc,0xa3,0x47,0xec,0xf1,0xae,0xcb,0x46,0x90,0xfb,0xd3,0xc9,0x73,0x76,0x11,0xd2,0x9b,0x99 }, { 0x17,0xe1,0x27,0xd9,0xc1,0x9d,0x72,0xe9,0x6a,0xa0,0x5c,0x96,0xad,0xd3,0x00,0x38,0xab,0x76,0x67,0x83,0x6c,0xa8,0x1c,0xc8,0xae,0x65,0x25,0x9a,0xf1,0x75,0x5f,0xaf }, { 0x0b,0x46,0x1f,0x12,0x3c,0xc9,0xf6,0xab,0x13,0x28,0x98,0x11,0xae,0xdb,0x69,0xc2,0xb3,0x14,0x28,0xc1,0x7a,0xa6,0xa2,0x1a,0x43,0x5d,0x86,0x68,0xac,0x5d,0x6f,0x6c }, { 0x2f,0x27,0x11,0x5f,0xbb,0x7d,0xb9,0x64,0xe0,0x91,0xe1,0x34,0x8d,0xa4,0x17,0x4f,0xb8,0x31,0xa1,0x99,0x87,0xbb,0x33,0xdf,0xfd,0x59,0x87,0xca,0xeb,0x03,0x76,0x20 }, { 0xa8,0xf6,0x0f,0x84,0xd7,0xad,0x21,0xd2,0x34,0x49,0x21,0x0d,0x85,0xd6,0x4c,0x1e,0xf4,0x1e,0x84,0x5c,0x7b,0xaf,0x17,0xbe,0x5b,0x11,0x0f,0xf2,0xd9,0x97,0x33,0xd3 }, { 0x0f,0xae,0xee,0x87,0x09,0x71,0x04,0xac,0x44,0xd5,0x30,0x24,0x91,0x02,0xdb,0x77,0x1a,0x99,0xe7,0x53,0x7d,0xb0,0xdb,0x21,0x8b,0xbf,0xa7,0x43,0x5a,0x09,0x1f,0x9c }, { 0x8f,0x41,0xe9,0x78,0x71,0xd8,0x43,0xb5,0x18,0x6a,0x65,0xf4,0x8d,0x58,0x3b,0x7a,0xa4,0x14,0x75,0xf8,0xea,0x79,0xaa,0x2e,0x60,0x17,0xce,0xcd,0x8a,0x28,0x5b,0xc5 }, { 0x31,0xf5,0x0f,0x10,0xf0,0x31,0xc2,0x9f,0x37,0xd6,0x7b,0x70,0x12,0xcd,0xfa,0xea,0xf8,0xfc,0xe4,0x87,0xe0,0x2c,0xd2,0xfd,0xb9,0xc3,0xb4,0x62,0x03,0xdc,0x10,0xbd }, { 0x0e,0x3a,0x2c,0x39,0x2d,0xe5,0x23,0xac,0xa1,0x8b,0x5b,0x6d,0xce,0x39,0x45,0x26,0x8b,0x2f,0x35,0x52,0xe9,0x1f,0x24,0xda,0x7f,0xe5,0xc8,0xfd,0x39,0x71,0xec,0x63 }, { 0xca,0xc6,0x8a,0x54,0xdf,0x69,0xce,0x8f,0xa4,0x7c,0x4e,0x20,0x24,0x41,0xeb,0xb4,0xad,0xe8,0x2a,0x5a,0xe4,0xd4,0x51,0x78,0x7c,0x8b,0x1e,0x1b,0x8b,0xbe,0x1e,0xfb }, { 0xdf,0x0c,0xff,0x3d,0x63,0xac,0x46,0xa8,0x2d,0x32,0x01,0xcc,0xe6,0xae,0x6b,0x44,0x65,0x77,0x7d,0xe1,0x32,0xb9,0xf0,0xa2,0x7f,0xfc,0xfc,0xa5,0xe3,0x3a,0xcf,0x57 }, { 0xf1,0xbd,0x4a,0x24,0xcf,0xc9,0x6e,0xba,0x6e,0x6f,0xa5,0xba,0x1e,0x99,0xfc,0xd1,0x86,0x5c,0x54,0x94,0x3f,0x57,0xb3,0x86,0x24,0x72,0xb8,0xed,0xa6,0xc7,0x7f,0x15 }, { 0xf3,0x61,0x3e,0x26,0x44,0x4d,0x55,0xd8,0x33,0x63,0xd9,0xcb,0x3c,0x48,0xde,0xce,0x39,0xe3,0x3e,0x9a,0x62,0x9f,0x1d,0x12,0xaf,0x2a,0x6c,0xea,0x7d,0xac,0xbc,0x1c }, { 0x11,0x72,0x5b,0xc0,0xcb,0x40,0x18,0x55,0x80,0xe0,0xf1,0x77,0xd4,0xa2,0xab,0x48,0x71,0xba,0xfd,0x45,0x70,0x4e,0x24,0x13,0x38,0xd0,0xe1,0x28,0x7b,0xc4,0x9e,0x53 }, { 0x74,0x60,0xde,0x79,0x07,0x2c,0xb6,0x49,0xfb,0x2d,0xce,0xd8,0x1e,0xa4,0x05,0x62,0xc2,0xc2,0x7a,0x92,0x55,0x75,0x2e,0x96,0x96,0xd6,0x47,0xf4,0xec,0xde,0x77,0x69 }, { 0xc3,0xaf,0x95,0xa2,0xae,0x28,0x83,0x7f,0x54,0x00,0x8f,0x91,0xba,0xca,0x8e,0x6b,0x3c,0x3a,0x26,0xf7,0x9a,0x2d,0xf8,0xc8,0x71,0x0c,0xcc,0xea,0x6e,0x97,0x26,0x14 }, { 0x14,0x35,0xaa,0xfa,0x9f,0x5e,0xf3,0xe2,0xed,0xa8,0xd9,0x05,0x05,0x92,0xca,0x7c,0x62,0x8a,0x97,0xff,0x73,0xf8,0x4b,0xc3,0x76,0xfb,0x06,0x48,0xe9,0x7e,0xd0,0x2b }, { 0xfc,0x79,0x0d,0xa1,0x34,0xec,0x11,0xc7,0x14,0x93,0xf7,0x3a,0xdf,0xd8,0xa3,0x9a,0xbb,0x5e,0x99,0x24,0xe4,0xeb,0xe7,0x02,0xe6,0xba,0x19,0x94,0x01,0xac,0x4b,0xc3 }, { 0x97,0xf5,0x84,0xfd,0xc2,0x5b,0x70,0x04,0xd2,0x7a,0xbd,0x6b,0x77,0x5a,0x04,0x2f,0xa4,0x34,0xbb,0x47,0x71,0xf0,0xc2,0x8d,0x34,0x0b,0x5f,0x62,0xd4,0x23,0xf0,0x69 }, { 0xbf,0x9e,0xea,0xb2,0x02,0x90,0xa9,0xe8,0xc1,0xba,0x93,0x13,0xad,0x40,0x31,0xee,0xbf,0xa8,0xa5,0x01,0x89,0xe1,0xb2,0x30,0x68,0xbf,0xf1,0xae,0x1f,0xf1,0xce,0xfc }, { 0x23,0x31,0xc1,0xb2,0x62,0xb4,0x8b,0x38,0x2d,0x52,0x85,0x7d,0x5a,0xc3,0x63,0x06,0x7d,0x04,0xf7,0xcf,0x2b,0x1f,0xd6,0xc0,0xea,0xa6,0xff,0x1f,0xd1,0x9c,0xcc,0xe0 }, { 0xf5,0x7c,0x21,0xae,0x7a,0xfa,0xf3,0x0a,0x0f,0x40,0xaa,0x44,0xfa,0xbf,0xbd,0x86,0x6b,0x80,0x72,0x08,0x9b,0x6d,0x01,0x67,0x65,0x1f,0x72,0x70,0x8d,0x5f,0xf6,0xe3 }, { 0x87,0x96,0xc1,0x11,0x65,0x4e,0xe6,0x4e,0x1f,0xdf,0x53,0xe1,0x6c,0x13,0x44,0xb3,0x48,0x06,0xc1,0x38,0x2d,0xa1,0x5f,0x33,0x7f,0x3c,0x64,0x25,0xdd,0xc3,0xce,0x13 }, { 0xd4,0xff,0x85,0x02,0x45,0xb6,0x23,0x89,0xc5,0x0d,0x4b,0x0b,0xff,0xab,0x15,0x52,0x01,0x2a,0x2d,0x8b,0xbc,0x66,0x08,0x83,0x0b,0xbc,0x01,0x64,0xfd,0xb4,0x00,0x36 }, { 0x22,0xc1,0x09,0x17,0x5b,0xfc,0x07,0x93,0x06,0x44,0x7f,0x58,0x55,0x8d,0x1f,0xe5,0xbf,0x7e,0x3d,0x2a,0xa9,0x4c,0x9e,0x21,0xfd,0x75,0x9e,0x04,0x41,0xa4,0x57,0xf8 }, { 0x5d,0xc5,0xa0,0xb5,0xc7,0x05,0x0c,0x17,0xc8,0xe3,0x0b,0x0a,0xd6,0x99,0x6b,0x26,0x72,0x5a,0x59,0x50,0xba,0xb3,0xc1,0x25,0x4b,0xb4,0x24,0x64,0x36,0x7f,0x6e,0x54 }, { 0x6c,0x85,0x40,0x13,0x82,0xd7,0x4f,0x08,0x7a,0xff,0x63,0xfd,0x5f,0x63,0xe0,0x93,0x16,0xfe,0xd5,0xe9,0xf3,0x6d,0x9e,0x56,0x57,0x44,0xae,0xa8,0x05,0x74,0x25,0x77 }, { 0xdd,0xf5,0x19,0xcf,0x2e,0xba,0x50,0x28,0x3c,0xa8,0x96,0x80,0x1f,0x3a,0xe8,0x27,0xfc,0x9f,0xd6,0x74,0x2b,0x91,0xcd,0x16,0x56,0xca,0x4f,0x6a,0xf3,0x9b,0xa5,0x78 }, { 0x34,0x82,0xa3,0xe7,0xd2,0x07,0xab,0x29,0x75,0x45,0x9a,0xd0,0x1d,0xe2,0xf8,0xa1,0xe6,0x4a,0xba,0x0d,0x6a,0xaa,0xa6,0xc4,0xd0,0xe1,0x42,0xe4,0xd3,0x82,0xc6,0x82 }, { 0xc6,0xc4,0x7a,0xa5,0x3a,0x2b,0x6f,0x10,0xdf,0x5a,0xbb,0xf8,0x36,0x96,0x6f,0x91,0xfb,0xcd,0xf6,0x4f,0xdf,0x49,0x18,0x35,0xc6,0x3f,0x9b,0x1b,0x22,0xba,0xa5,0x2d }, { 0x41,0x36,0xd6,0xc8,0xd1,0xf4,0x5d,0x91,0xf0,0x58,0x80,0x8e,0xea,0x8d,0x4e,0x4a,0xfc,0x1e,0xfe,0xd1,0x1d,0xc9,0xeb,0x10,0x4d,0x2e,0x4b,0x54,0x65,0x19,0x20,0xab }, { 0x4e,0xb4,0x7e,0x1a,0x50,0xcb,0x32,0x39,0xe7,0x6b,0x0f,0x57,0x51,0xb9,0x04,0xf0,0xc2,0xdc,0xf6,0x43,0x66,0x08,0x64,0x83,0xfa,0x83,0x46,0xe8,0x58,0xd8,0x3d,0x8f }, { 0x15,0x85,0x60,0x7d,0xea,0xe2,0xb2,0x5d,0xe0,0x8d,0x7d,0x39,0x9c,0xa8,0x1b,0xab,0x4e,0xd7,0x0c,0x92,0xcb,0xea,0x41,0xe8,0x94,0x9a,0x19,0xbc,0x49,0x61,0x93,0xd0 }, { 0xf6,0x3f,0x34,0x5f,0x9b,0xd7,0xff,0x4e,0x9a,0xe9,0xa2,0x27,0x6b,0xb3,0xfc,0x1d,0xc5,0xed,0x4c,0xf0,0xeb,0xdd,0x1f,0x10,0xc1,0xb8,0x13,0x09,0xdd,0x43,0x87,0x30 }, { 0xa0,0x65,0x12,0x00,0x90,0x2b,0x38,0x56,0x9f,0xd7,0xdd,0xc9,0x16,0xe4,0x36,0xcf,0x67,0x67,0x25,0x0b,0x12,0xb5,0xda,0xee,0xa2,0x76,0xa7,0xb9,0x4c,0x7d,0x8e,0xd5 }, { 0x1d,0x2c,0xcc,0xd4,0x60,0x40,0x0d,0x82,0xe5,0x74,0x19,0xe7,0xe3,0x7f,0x20,0x67,0xf7,0x0b,0x69,0x0a,0xbf,0xe1,0x8e,0xd8,0x14,0xc0,0x6a,0x47,0xb8,0x48,0x62,0xe6 }, { 0xe2,0xfb,0xcc,0x64,0x5c,0x5f,0x04,0x31,0x54,0x76,0xef,0xac,0xab,0x32,0x52,0x86,0xb4,0x7b,0x45,0x45,0xf6,0x22,0x9d,0xb0,0x61,0xea,0xb4,0xe1,0xe8,0xfc,0xb9,0xbd }, { 0xb3,0xba,0x3d,0xa8,0x80,0x05,0x29,0xf8,0xb6,0xe9,0xd5,0xae,0x62,0xc9,0xb0,0x3a,0x0a,0x21,0x6e,0x94,0x2a,0x74,0x4f,0x84,0xb8,0x01,0x1d,0x4c,0xa0,0x68,0xe1,0xed }, { 0x2e,0x05,0x00,0x78,0xe0,0xd4,0xa6,0x2e,0x7f,0x53,0x4f,0xe3,0xb6,0x76,0x8d,0x2a,0xe4,0xf3,0x1d,0x43,0xb4,0xa5,0xb0,0x76,0x59,0x59,0xa6,0x24,0xb7,0x8a,0x0d,0x8f }, { 0x18,0x92,0x03,0x33,0x1c,0x0f,0x4d,0x6c,0x7b,0x01,0x2e,0x5f,0x3a,0x27,0x8b,0x7e,0x74,0x0e,0x15,0x04,0x5c,0xb7,0xdb,0xbd,0xcc,0x56,0x64,0xc2,0x81,0x5d,0x0c,0xc3 }, { 0xac,0xd0,0xb7,0x32,0x68,0x3b,0xb4,0x20,0x6b,0xe3,0x6a,0x5c,0x55,0x4a,0xdb,0x2b,0xc8,0x73,0x89,0x08,0xee,0xc8,0xea,0x7a,0x57,0x83,0xdf,0x5b,0x60,0xb9,0x19,0xad }, { 0xb2,0x7b,0x4b,0x50,0xe5,0x4e,0x0b,0x83,0x15,0x57,0xe0,0xd4,0x2d,0x6e,0xcb,0xc1,0x41,0x71,0x5a,0x01,0x26,0x87,0xe5,0xa4,0xb2,0xf1,0x86,0xa7,0xe8,0x10,0x87,0xc4 }, { 0x23,0xf5,0xd4,0x49,0x43,0x0a,0x2e,0xec,0xab,0x58,0x30,0x78,0xc1,0x22,0xaa,0xad,0xef,0xa7,0x1d,0xfb,0xca,0x92,0x46,0xa4,0xd8,0x30,0xd0,0x63,0xa3,0x04,0xa5,0xe1 }, { 0x76,0xb5,0x78,0x1f,0xd4,0x7d,0xc7,0x88,0xc2,0xe3,0xd1,0x37,0x5f,0x50,0x46,0x8a,0x3e,0x4f,0x1e,0xbb,0xf4,0xa3,0x36,0xcd,0x47,0x64,0xf5,0x03,0xc9,0xee,0xc9,0xa7 }, { 0xd4,0xcc,0x5c,0x0a,0xc7,0xf1,0x3c,0xc5,0x8f,0xc5,0x69,0x8d,0x2f,0xfe,0xb8,0xe7,0x4b,0x43,0x97,0xc5,0x93,0xa1,0x67,0xbb,0x0b,0x9c,0x0e,0xdc,0x6a,0x2a,0x1a,0x9c }, { 0x02,0xce,0xa6,0x63,0xc8,0xa8,0xad,0xb4,0x0b,0x5d,0xe1,0x53,0xaa,0x0b,0xbb,0x37,0xf8,0xd3,0x28,0x5b,0x9b,0x75,0x2e,0x81,0x8e,0xd2,0x3e,0xc9,0x00,0x32,0x55,0xb2 }, { 0x31,0xef,0xf0,0x79,0xdd,0x5c,0x4e,0xee,0xd0,0xe1,0x01,0x80,0x2f,0x75,0xdb,0x7c,0xf3,0x4e,0xec,0x8e,0x7d,0x1d,0xe2,0x81,0x18,0xf7,0x6a,0xf2,0xc9,0x31,0x20,0xb4 }, { 0x28,0x88,0x9a,0x19,0x78,0x02,0x58,0x93,0x8f,0xf6,0x4e,0x57,0x0a,0x43,0x0c,0x09,0x1e,0x6e,0x39,0xef,0xa8,0x22,0x5c,0x10,0x82,0x4f,0x09,0xfe,0xb3,0xbc,0x1d,0xf5 }, { 0x42,0xea,0x73,0x11,0xde,0xbf,0xe3,0x37,0x57,0x9b,0x38,0x3d,0x32,0xbc,0x80,0x88,0x09,0xbd,0xfd,0x76,0x64,0x9a,0x80,0x8d,0x18,0x71,0x1f,0x5e,0x3f,0xf1,0xc0,0x02 }, { 0x6f,0x21,0xaa,0x76,0xe2,0x27,0xd9,0xca,0xa4,0x73,0x66,0x64,0x08,0x76,0x9b,0x2d,0xed,0xe7,0xf7,0x27,0x03,0xd7,0x72,0xe1,0x01,0xc2,0x22,0xcb,0xc0,0x33,0xe3,0x8c }, { 0x7b,0x01,0x54,0xbe,0x7e,0x51,0xc4,0x08,0xb3,0xce,0x40,0x35,0x5f,0xc5,0x49,0xbf,0x2f,0xef,0xd6,0xb6,0xed,0x14,0xf5,0x3c,0xfe,0x75,0xb6,0x49,0x89,0x69,0x26,0x69 }, { 0x37,0xb2,0x26,0x5b,0x15,0x05,0x7d,0xd0,0xa0,0xb7,0x5f,0x93,0x6a,0x42,0x69,0xed,0x50,0x4f,0x0f,0x3b,0x5b,0x2b,0xda,0x48,0x2a,0x5b,0xd7,0x8d,0x63,0x23,0x00,0x4c }, { 0x29,0x83,0xb0,0xcd,0xe4,0x37,0xe5,0xb4,0x93,0xfe,0x60,0xc2,0xa7,0xb6,0xfc,0xfa,0x01,0x16,0xf1,0x06,0xc3,0x96,0xe8,0x18,0x4e,0xad,0x14,0xb7,0x9d,0x87,0x39,0x06 }, { 0xfd,0xe7,0x8a,0x9d,0xd4,0x42,0xd0,0xa2,0xe4,0x4e,0x03,0x76,0x33,0x61,0x2e,0xf2,0xf1,0x9c,0x6e,0x83,0x92,0x62,0x15,0xb6,0xc1,0xed,0xcc,0x4f,0xd1,0x56,0xa5,0xb4 }, { 0x2e,0xd4,0x31,0xc6,0x64,0x27,0x47,0xf5,0x07,0x85,0x46,0x35,0xb1,0x5c,0x08,0x8b,0x73,0xe0,0x92,0xc4,0x02,0xa5,0xeb,0xee,0x6a,0x65,0xdd,0xe5,0x43,0x6c,0x9e,0x80 }, { 0xb1,0x3e,0xb1,0x78,0x88,0x3b,0x05,0x6d,0x01,0x01,0x6f,0xb8,0x44,0xfa,0x45,0x9b,0xec,0x2b,0xe0,0xf3,0x15,0xe1,0xeb,0xa6,0x64,0xad,0x54,0x4d,0x3a,0x18,0x03,0x12 }, { 0x98,0x13,0xd1,0xf3,0x4a,0x86,0xc0,0xd6,0xa6,0xa7,0x7f,0xc9,0x96,0x29,0xf7,0x57,0x18,0xf1,0x38,0x77,0xe1,0xfd,0xcf,0xb8,0xa7,0xb5,0xd1,0x95,0x60,0x9b,0xfe,0x0d }, { 0x00,0xd4,0x33,0xd0,0xeb,0x88,0x9b,0xe0,0x78,0x2d,0x74,0x23,0xaf,0x83,0x0b,0xd6,0x50,0xff,0xe3,0x78,0x59,0x22,0x1e,0x1e,0xd8,0xdc,0x33,0x89,0x4e,0x84,0x22,0x3a }, { 0x20,0x5a,0x3b,0xf1,0x05,0xc2,0x3d,0x3c,0xc3,0xeb,0x1c,0xfd,0xf3,0xe5,0x33,0x9d,0x01,0x05,0xfd,0xc9,0x2e,0x98,0x51,0x13,0xfc,0xa8,0x33,0x46,0x94,0x53,0x57,0x2b }, { 0x18,0x63,0x4b,0x51,0x66,0x35,0xec,0x2e,0xf3,0x0a,0xdc,0xe3,0xd6,0x30,0x7f,0x75,0x0f,0x98,0xb0,0x57,0xc0,0x76,0x6b,0xcb,0x37,0xef,0x1c,0xa1,0xfd,0xe3,0x82,0x09 }, { 0xab,0x63,0xd5,0x39,0x83,0x2f,0x76,0x7c,0xdf,0x38,0x08,0xc3,0x0f,0xb0,0x1e,0xfe,0x54,0xb7,0x23,0x20,0x5d,0x8a,0x79,0xef,0xfa,0x61,0x6f,0x80,0xa5,0x04,0x6c,0x61 }, { 0x1d,0xd2,0x2b,0xef,0x07,0x6d,0x5b,0xb0,0x98,0x10,0x9f,0x38,0x52,0x61,0x34,0x7e,0xc7,0xba,0x3f,0x4b,0xe1,0x93,0x8d,0xf8,0x17,0x3b,0x64,0x65,0xed,0x7c,0xe1,0xa5 }, { 0x4b,0xeb,0x9f,0x24,0x34,0x78,0x1e,0x73,0x21,0xd7,0x1e,0xd9,0xa1,0x50,0x04,0x20,0x5f,0xe9,0x91,0xb5,0x82,0x01,0xc8,0xd8,0x20,0x09,0x37,0x23,0xb4,0x45,0xba,0x22 }, { 0xc1,0x21,0x3e,0xbf,0x79,0x85,0x88,0x20,0xbf,0x3a,0x8f,0x68,0x79,0x23,0xed,0x4b,0xd5,0x66,0x83,0x40,0x0e,0x4c,0xad,0x0c,0xb3,0x95,0x31,0x42,0xa7,0x51,0x93,0x29 }, { 0x25,0x06,0xc7,0x05,0xdb,0x6b,0xa0,0x54,0x55,0xc3,0x13,0x56,0x51,0x5f,0x12,0x4f,0xb1,0x88,0xc6,0xfb,0xf1,0x0b,0x4f,0x79,0x21,0x6b,0x7b,0xfa,0x6c,0x1a,0xca,0x60 }, { 0x84,0xfc,0x57,0x2f,0xcc,0x0b,0xac,0x00,0x96,0x25,0xcf,0xd9,0xb2,0x4b,0x92,0x8f,0xca,0x32,0xe6,0x66,0x4a,0xe3,0x1f,0x4d,0xc5,0x1e,0xac,0xe1,0x1d,0x60,0xb0,0xf4 }, { 0x2e,0x71,0x23,0x40,0x9b,0xef,0x16,0x4a,0x49,0xef,0xf1,0x97,0xf5,0x27,0xcb,0x11,0x6e,0x16,0x6c,0x26,0xe2,0x3e,0xcd,0x68,0x47,0xf7,0x16,0x87,0x70,0x2c,0x7f,0x3a }, { 0x25,0x43,0x5c,0x75,0xfc,0x17,0x02,0xe0,0x46,0x85,0xf0,0xfc,0xd8,0x9a,0xee,0x86,0xb1,0xf5,0x06,0x95,0xbd,0xae,0xd9,0x1f,0x56,0x34,0x56,0x05,0x9f,0xce,0x0b,0xe3 }, { 0xa3,0xda,0x23,0xed,0x2e,0x2a,0x52,0xf5,0xc9,0xfe,0x19,0x67,0xb1,0x06,0x5d,0xa5,0x00,0xee,0x47,0x8e,0xa4,0x45,0x05,0x6c,0xba,0xba,0xc2,0x6a,0xe1,0xb7,0xe7,0xed }, { 0xe4,0x02,0x64,0xcc,0x51,0x80,0x5f,0x31,0xf3,0x9d,0x1f,0x15,0x8d,0x72,0xd0,0x03,0xe2,0x5b,0x9e,0x4e,0xf6,0x5e,0x50,0x15,0x4f,0xf9,0xb4,0x40,0x62,0x89,0xca,0xee }, { 0xa6,0x1d,0x1e,0xbf,0x98,0x69,0x25,0x8e,0xba,0xdc,0x0f,0x01,0x42,0x3c,0x71,0xa8,0x85,0xd9,0xa2,0xf0,0xa7,0x4f,0x26,0xce,0xda,0x28,0x32,0x25,0xdd,0xec,0xba,0x4e }, { 0x97,0x84,0x49,0x3d,0x9c,0x26,0x08,0x63,0xb6,0x12,0x4d,0x36,0x2c,0x71,0xaa,0x3a,0xe2,0x95,0x03,0x40,0x87,0x55,0xfb,0xa2,0x71,0xd0,0x22,0xdc,0xd3,0xc3,0x3a,0x69 }, { 0x8a,0xa3,0xd5,0x5a,0x48,0x32,0xb1,0x0b,0x3b,0x05,0xf7,0xee,0xd1,0x71,0xca,0xfb,0xe8,0x89,0x9f,0x9f,0xb6,0x19,0x42,0xc1,0x38,0xaf,0x43,0x0e,0xd1,0x96,0x29,0x7c }, { 0x7e,0x0a,0x4e,0x02,0xb4,0x85,0x40,0x89,0x8e,0x2f,0xf3,0xed,0x56,0xbc,0x24,0x31,0x06,0x8d,0x4e,0xff,0x64,0x99,0x12,0xfd,0x95,0xb3,0x9d,0x10,0xaf,0x59,0x52,0x68 }, { 0x26,0xcf,0xa7,0xe9,0x76,0x05,0x96,0x28,0x2b,0x8e,0x64,0x37,0x6e,0x34,0xef,0x87,0x93,0xc5,0x2d,0x24,0xcb,0x4c,0x9d,0x6a,0x59,0xaa,0xf9,0x52,0xcc,0xe1,0x23,0x66 }, { 0xe8,0xea,0x3d,0xf8,0x08,0xe4,0x2a,0x8a,0x2e,0x29,0x65,0xf1,0xc2,0xfc,0x03,0xd6,0x4b,0x6d,0xc4,0x59,0x99,0x8e,0xe5,0x92,0xb1,0xcc,0x4e,0xe5,0x7f,0xad,0x1f,0x58 }, { 0x8e,0x9a,0x8f,0x75,0x37,0xcf,0x51,0x39,0xfa,0x6b,0xfb,0x45,0x95,0x6e,0xd0,0x9e,0xba,0xef,0x85,0x54,0x4c,0x83,0x19,0xbc,0x34,0x09,0xe7,0x37,0xb8,0x7b,0xd5,0xe1 }, { 0x95,0xf0,0xec,0xad,0x43,0xe1,0x98,0x9b,0xb2,0x7f,0xbe,0x20,0xba,0xab,0x54,0x82,0x7a,0x0c,0x23,0xd7,0xef,0xb3,0x94,0x56,0x2d,0x73,0xc0,0x43,0x0c,0xd6,0x1d,0x5a }, { 0x53,0x45,0x9d,0x2c,0x16,0x2d,0xc0,0x84,0xc7,0xbf,0x2c,0xe6,0xb5,0xf6,0xf1,0xe7,0x3a,0x8f,0xd6,0x70,0x39,0xe5,0xdd,0x5e,0x5b,0xe3,0x45,0x5a,0xea,0xa7,0xd9,0x4f }, { 0x2d,0xdb,0xbd,0xe0,0xab,0x64,0x82,0x29,0x87,0x44,0x89,0xb0,0x24,0xb5,0x03,0xd4,0xc9,0x11,0x2b,0x2d,0x87,0xfa,0x80,0x43,0x67,0x67,0xab,0xa8,0x32,0x3e,0xcb,0x2e }, { 0xd9,0x92,0x4f,0x3c,0x94,0x98,0xba,0xcf,0x12,0x63,0xd0,0xb6,0x86,0x0d,0x47,0xc1,0x7e,0x4d,0x71,0xd7,0xf0,0x0e,0x0b,0xcf,0x68,0x8e,0x13,0xeb,0x6b,0xc7,0x89,0xa0 }, { 0x4d,0x3a,0x0e,0x53,0x13,0x8f,0x3e,0xec,0x30,0x39,0x0b,0xa8,0x0a,0xce,0x77,0x92,0x30,0x11,0x43,0x9a,0xd5,0x4c,0x45,0x79,0xea,0x4a,0xb9,0x04,0x3f,0xdd,0x31,0xe2 }, { 0x87,0x7b,0x67,0x86,0xc5,0x69,0x9e,0x88,0xb9,0x07,0x68,0x4e,0xb5,0x92,0x05,0x58,0xc1,0xed,0xa7,0xd0,0x58,0x85,0xa2,0x04,0x8d,0x16,0x33,0xc1,0x91,0x09,0x7d,0x51 }, { 0xcb,0x9f,0x80,0xa3,0xbb,0xb8,0x1a,0xf7,0xb9,0xbc,0x33,0xbc,0x93,0x2e,0x52,0x28,0xf6,0x35,0x7c,0x6c,0xa7,0x16,0xcb,0xb6,0xde,0xff,0x23,0x9d,0xb0,0x79,0x2d,0xad }, { 0x18,0x49,0xa4,0xb2,0xda,0x7b,0x8e,0x79,0xef,0xb5,0x47,0x6d,0x4d,0x61,0x79,0xbe,0xc3,0x6b,0x16,0x99,0xd5,0xb1,0x60,0x8c,0x9f,0xc7,0x7c,0x08,0x2f,0x17,0x4e,0xe4 }, { 0xc4,0xc8,0x1a,0x39,0x33,0xd6,0xc3,0xa4,0x66,0x44,0xbf,0x41,0x15,0x96,0x46,0x51,0x05,0x05,0x7f,0xa0,0x77,0xcb,0xf8,0x28,0xb7,0x38,0x14,0xb9,0x0b,0x5e,0x3d,0xd5 }, { 0xd0,0xa5,0x87,0x8e,0x47,0x96,0x8f,0x54,0x9a,0x7b,0x8d,0xe0,0x80,0x92,0xf6,0x82,0xe1,0x54,0x6f,0x87,0xbb,0xad,0xa9,0x45,0xb3,0x30,0x97,0x38,0x62,0xf8,0x73,0x39 }, { 0xb9,0xa6,0x52,0xe8,0xe2,0x80,0x89,0x0c,0x7a,0xea,0xa0,0xb2,0x39,0xbe,0x0b,0x88,0x81,0x23,0xf0,0x12,0xcf,0xc8,0x86,0xf0,0x1d,0xfb,0x13,0x66,0xc7,0x8f,0x4a,0xa0 }, { 0x36,0x5b,0xcb,0xb5,0x8c,0xc9,0x58,0xd9,0x39,0x9f,0x03,0xfc,0x0c,0x37,0x75,0x91,0x7f,0x79,0xb9,0x00,0xd0,0x68,0xe9,0x41,0xe7,0xfe,0xb6,0x94,0x36,0x9b,0xb2,0x32 }, { 0x3f,0x5c,0x51,0x8d,0x59,0x90,0x6f,0xf2,0xbd,0x89,0xea,0x69,0x7b,0x85,0x98,0x3c,0x30,0x76,0x44,0xc0,0x01,0x44,0xf5,0x34,0x5b,0x02,0xa8,0x8a,0xdd,0xce,0xb0,0xfd }, { 0x4c,0xfa,0x4b,0xe4,0x3a,0xb2,0x76,0xf4,0x10,0xbc,0xae,0x5e,0xe6,0xe7,0x6e,0x01,0xe3,0xc3,0xe0,0x03,0x8a,0x5c,0xa2,0x37,0x0b,0xf1,0x0e,0x4a,0x2c,0x23,0x50,0x5d }, { 0x83,0xed,0x6e,0x02,0x76,0x5f,0x9b,0xf7,0x7c,0xb3,0xe1,0xd6,0x28,0xc4,0x49,0x9e,0x60,0x08,0x60,0x4a,0x3e,0xe8,0xdd,0xc5,0xd7,0xbd,0xeb,0xf4,0x4f,0x7c,0xf5,0x41 }, { 0xbe,0xbd,0x51,0x6a,0xab,0x15,0x29,0xca,0x28,0x91,0xa2,0x90,0x92,0x20,0xaa,0x2c,0x41,0xe9,0xae,0xa4,0xe3,0x98,0xc9,0xc3,0xb1,0xcf,0x9d,0x29,0x69,0x18,0x25,0x6d }, { 0xe5,0xd4,0x92,0x79,0xee,0x8b,0x0d,0xf4,0xfd,0xb8,0x90,0xa9,0xbc,0x08,0x37,0x05,0x81,0x16,0x1a,0xdf,0x37,0xbc,0x47,0xd3,0x4a,0x3b,0x34,0xe5,0x6a,0x1f,0xad,0x65 }, { 0x23,0xbf,0xcc,0x11,0xd9,0x36,0x4d,0xf4,0xc0,0x48,0x41,0x78,0x72,0xcd,0xa5,0x14,0x87,0x4c,0x5d,0x62,0xe2,0xdf,0x03,0xce,0x71,0x2d,0xe9,0x5e,0x50,0xdf,0xcb,0xc3 }, { 0xfb,0x03,0xb7,0x3f,0x73,0x60,0x86,0x86,0x0f,0x7a,0xaa,0x70,0x7f,0xd1,0xe3,0xeb,0x43,0xfc,0x38,0x21,0xee,0x39,0x60,0x10,0x03,0x52,0x8c,0x74,0xd0,0x87,0x70,0xb8 }, { 0x73,0x53,0x2d,0xaa,0x21,0x3b,0xc1,0x88,0x9a,0xe9,0xb5,0x13,0x01,0x68,0x24,0xd8,0x07,0x6b,0xab,0x74,0x76,0x05,0xbc,0x02,0x91,0x08,0xb5,0x11,0x5f,0x17,0x2c,0x36 }, { 0x09,0xd8,0x7c,0x23,0x8e,0xc0,0x7c,0xa1,0xe4,0xff,0x24,0xbe,0xed,0x4b,0xa1,0x8a,0xfb,0x6d,0x29,0x11,0x62,0xdb,0xc9,0x05,0x53,0x76,0xbf,0xcf,0x93,0xfb,0x57,0xec }, { 0x44,0x0f,0x72,0x64,0x08,0xcc,0x92,0x88,0x15,0x3d,0xcc,0xae,0xc6,0x59,0xfe,0xd3,0x64,0xb7,0x69,0xa5,0xc8,0x63,0x12,0xfa,0xb4,0xf4,0x71,0xd3,0x04,0xaa,0x73,0x98 }, { 0x73,0x6d,0x24,0xdc,0x95,0x2f,0x5e,0x39,0x01,0xcb,0x24,0x83,0x50,0x21,0x13,0x45,0xf4,0x60,0x1e,0x11,0xa7,0x9b,0x97,0x23,0x74,0x29,0x21,0xd3,0xab,0x06,0x19,0x32 }, { 0x1c,0x00,0xce,0x05,0xf0,0x2d,0xc7,0x35,0x3b,0x57,0xe3,0xba,0x95,0xd4,0x1c,0x87,0x91,0x26,0xdd,0xa5,0xec,0x42,0xd6,0xb7,0x07,0x21,0x22,0x35,0xbf,0x9c,0xd1,0xaa }, { 0xfa,0x14,0x3a,0xcb,0x7a,0x25,0x1d,0x57,0x29,0x3e,0xc5,0x30,0xed,0xe1,0xfd,0x85,0x0c,0xe4,0xc1,0xdd,0x04,0xd7,0x9b,0xaa,0x68,0x83,0xb9,0xb3,0x1f,0xf1,0x6b,0xfe }, { 0x24,0x31,0xcd,0xa4,0xb5,0x63,0xbb,0xd1,0xd6,0x72,0x9e,0x9d,0x22,0xcc,0x61,0xc0,0x25,0x8a,0x09,0x9b,0xd6,0x6f,0xf4,0x74,0x92,0xef,0x53,0x9f,0x4c,0x59,0xca,0x2f }, { 0xe1,0xb8,0xd5,0xfd,0xeb,0xbe,0x87,0x07,0x7e,0x1b,0x92,0xdb,0x14,0x44,0xe2,0x03,0x47,0x30,0xae,0xa5,0xf9,0xad,0x8c,0xff,0xc6,0xc8,0xb3,0x50,0x1c,0x7f,0xad,0xf4 }, { 0xad,0x98,0xf4,0x2c,0xb6,0x88,0x90,0xaf,0x56,0xe2,0x30,0x7c,0x16,0xe0,0xe3,0x21,0xea,0x52,0x67,0x87,0xa2,0x9f,0xeb,0x10,0x13,0xa6,0x5a,0x78,0xc0,0xd2,0x1c,0xce }, { 0xdd,0xf3,0xf2,0xce,0xb3,0x03,0x81,0xcc,0x95,0xc8,0x79,0x63,0xb4,0xae,0x5a,0x25,0x67,0x5f,0xca,0x6c,0x58,0x04,0xb7,0xc9,0xb7,0xc1,0xc6,0x55,0xc6,0x49,0x6d,0x44 }, { 0xdc,0x2a,0xc1,0x6f,0x15,0x2b,0xbf,0x2d,0xcf,0x72,0xd3,0x94,0xc7,0x7c,0x5c,0x52,0xe2,0xd3,0xfd,0x40,0xc5,0x78,0x3d,0x56,0xd7,0x51,0x6d,0x67,0x2c,0x31,0x52,0x24 }, { 0x00,0xc7,0xae,0xf5,0xd2,0xa8,0x9c,0x0a,0x8c,0xd0,0xa2,0xe9,0x68,0x85,0x69,0x7b,0xcb,0x66,0x01,0xdc,0xef,0xe5,0x3a,0x22,0xfd,0x6d,0xdc,0x6d,0x30,0x41,0xb3,0x39 }, { 0x90,0x0c,0xc8,0x4f,0xe6,0x3b,0x0d,0xc1,0xf0,0x80,0x16,0xa9,0x24,0x65,0x5f,0x3e,0x93,0x17,0xf0,0xa8,0xdd,0xa7,0x1a,0xb7,0x42,0xdb,0x13,0x8e,0x77,0x5f,0xe6,0x8b }, { 0x25,0x30,0x08,0x75,0xcf,0xe5,0xf8,0x36,0x36,0xdf,0xc2,0x92,0x9b,0x37,0xc9,0xe2,0x65,0x29,0xed,0xfe,0x44,0xe4,0x51,0x3e,0xc0,0xb7,0x83,0xad,0x5e,0x6b,0xd7,0x4b }, { 0x7c,0x08,0x24,0x72,0xa2,0x7e,0xd2,0x3b,0x90,0x5c,0xd7,0x39,0x1b,0x01,0xbd,0x4c,0xda,0xec,0xfb,0x6d,0xff,0xd1,0x67,0xcc,0x09,0xb5,0x3a,0x53,0xdf,0xef,0x25,0xff }, { 0x7a,0xdb,0xd9,0x44,0xf8,0x11,0x53,0x7e,0x37,0x7a,0x67,0x3c,0x31,0xd5,0xae,0x2f,0x3d,0xdf,0x7f,0x10,0x69,0x9f,0xab,0x9f,0xfd,0x43,0x23,0x3a,0xda,0xd6,0xcb,0x78 }, { 0xde,0x78,0x35,0x34,0x55,0x3b,0x4e,0xe2,0x5c,0xe2,0xa9,0x49,0xb6,0x03,0x41,0x89,0xbd,0x75,0x4b,0x10,0xc4,0x66,0x21,0x95,0x8c,0xad,0x3f,0xc1,0xb7,0x93,0x3c,0x6a }, { 0xa5,0xa8,0xe5,0xbf,0xf7,0x75,0x9e,0x46,0x2e,0x1b,0x2c,0xea,0x74,0x42,0xc9,0x29,0x95,0x60,0x01,0xa2,0xd4,0x2d,0x0e,0x73,0xb4,0x46,0x67,0x85,0x67,0x6b,0x7e,0x8f }, { 0xe2,0xc6,0xaa,0x2a,0xf8,0x67,0x08,0xb9,0x3e,0x2a,0xdc,0x41,0xeb,0x7f,0x33,0xc4,0x86,0x59,0x91,0xe7,0x06,0x34,0x12,0xe5,0x07,0xe7,0x94,0xee,0x14,0x8a,0x53,0x24 }, { 0xfc,0xd9,0x2d,0x84,0x16,0x44,0xd1,0x15,0xd0,0x08,0x22,0x11,0xcc,0x38,0xad,0x02,0xda,0x01,0x08,0xf3,0x8f,0x1a,0xac,0x53,0x7c,0xd3,0x1c,0x61,0x43,0xae,0x69,0x99 }, { 0xb8,0x83,0x11,0x4d,0x7d,0x96,0x74,0x4d,0xc9,0xe5,0xe5,0x01,0x19,0xca,0xfe,0x6d,0xf9,0x3c,0x61,0x09,0x45,0x59,0x7a,0xfc,0x7b,0x7d,0x5d,0x26,0x4b,0x55,0xa2,0x8f }, { 0x7e,0x4b,0xbc,0x65,0x26,0xc2,0x4f,0x73,0xe4,0x43,0x92,0xa5,0xf7,0x6a,0x19,0xd5,0x33,0xaa,0x3f,0x98,0x7e,0x49,0xb9,0xf5,0x79,0xb1,0xc6,0x5a,0x9d,0x36,0x77,0xc6 }, { 0xe8,0x17,0xc7,0xad,0xbd,0xf6,0x1e,0x16,0x53,0x81,0xbf,0x56,0x74,0x5e,0x21,0x35,0x4a,0xdf,0x64,0x82,0x61,0x15,0x87,0x15,0x8d,0x0e,0x65,0x8f,0x6d,0x52,0x19,0xee }, { 0x1c,0x7e,0x9a,0x1a,0x67,0xb3,0x70,0xc2,0xa2,0x1c,0x3c,0x52,0xe1,0xc1,0xfb,0x90,0x44,0x61,0x0e,0xaf,0x40,0x5b,0x69,0x20,0xea,0x4a,0x10,0x70,0x12,0xb0,0x55,0xe3 }, { 0x46,0x6c,0x29,0x33,0xda,0x48,0xca,0x77,0x2b,0x43,0x8a,0x87,0x3c,0x05,0x53,0x10,0x3d,0x04,0x26,0x2d,0xf0,0x13,0xbe,0x43,0x0f,0x28,0x9a,0x5f,0xc5,0x56,0xce,0x3d }, { 0xd3,0x29,0xf6,0x93,0x9d,0xa5,0xfd,0xfa,0xac,0x79,0x45,0xcf,0x85,0x05,0x7c,0x19,0x77,0x04,0xc2,0x19,0xb3,0xbc,0xea,0xe1,0xaf,0x9c,0x3f,0x3f,0x19,0x7e,0x8d,0x84 }, { 0x77,0x6b,0xec,0x1a,0x55,0x86,0x0e,0xf5,0x31,0x66,0xb2,0xdc,0xe5,0xae,0x90,0xba,0xc4,0x4c,0xe9,0x72,0xc7,0x7d,0xdc,0x5a,0xf7,0xec,0x1a,0x86,0x5c,0x0b,0x2a,0xa6 }, { 0x10,0x74,0x9e,0xf6,0x9e,0x52,0x48,0xa6,0xc5,0x09,0xf5,0x4b,0xee,0x84,0xce,0x59,0x06,0xa0,0x8f,0xf7,0xeb,0x2b,0x66,0x9d,0x1c,0x37,0x20,0x60,0xf1,0x5b,0xa1,0x07 }, { 0x1c,0x64,0xcb,0x0d,0x63,0x13,0x06,0x01,0x43,0xf4,0x01,0xd2,0x88,0xd3,0x87,0x27,0x5f,0x8c,0xfb,0x05,0x09,0xb0,0x6d,0x2b,0x90,0x8a,0x75,0x28,0x86,0x34,0x89,0x39 }, { 0x33,0xd7,0xaf,0xc4,0x2a,0x42,0x64,0xac,0xd4,0x0e,0xcb,0xa2,0xa9,0xd2,0x87,0xc9,0x18,0x3d,0x57,0xec,0xea,0x1b,0xf1,0xe9,0x43,0x7b,0x4b,0xde,0xf6,0x97,0xcd,0xcc }, { 0x0a,0xe0,0xf6,0x1c,0xdf,0x6b,0x21,0x78,0x54,0x36,0x07,0x29,0x49,0x42,0x4b,0xdd,0xde,0x17,0xc0,0xa3,0x4b,0xa4,0xfb,0xc2,0xf8,0x70,0x65,0xec,0x34,0x05,0xfd,0xc7 }, { 0x00,0x62,0x82,0x4c,0x1a,0x78,0xae,0x3c,0xca,0x9e,0x5b,0xdf,0xf1,0x6c,0xd1,0x12,0xb4,0x2b,0x4f,0xcf,0xdc,0x46,0xd1,0x97,0xfc,0x7a,0x7d,0x5b,0xe9,0x6b,0x41,0xbd }, { 0x42,0x02,0x81,0x96,0x2f,0xb7,0xc8,0xe7,0x59,0x78,0x06,0xe8,0x11,0x4c,0xf9,0x07,0xa3,0x6c,0x33,0x4b,0xab,0xc2,0xc8,0xbe,0xc7,0x5a,0x5d,0xa3,0x62,0xee,0xad,0xbd }, { 0x7d,0x66,0x79,0xcf,0xd5,0x8e,0xb7,0xd4,0x1d,0xdd,0x69,0x07,0x35,0x32,0x58,0xa6,0xfe,0x84,0xbe,0xa3,0x0c,0x80,0xf5,0x44,0xc6,0xde,0xb3,0x20,0x07,0x6a,0x06,0x09 }, { 0xca,0x22,0x9f,0xae,0x0e,0x09,0xea,0xe9,0xc1,0x65,0x5b,0x93,0xb9,0xd6,0x93,0xfe,0x36,0x16,0x9b,0x10,0x68,0x72,0x0b,0x11,0x17,0xbc,0xf9,0x39,0xa7,0x2c,0x55,0x5f }, { 0x6f,0xc1,0x80,0x78,0x3f,0x90,0x63,0x8c,0xf0,0x13,0x59,0x0f,0x81,0x96,0x39,0xfa,0x2b,0xb6,0xe0,0x94,0xd6,0xdb,0x9b,0xa8,0x37,0x2f,0xd2,0x7b,0x89,0x6b,0x63,0x0c }, { 0x69,0x52,0x52,0xd6,0x78,0x7c,0xf8,0xdf,0xe9,0xe8,0x29,0x46,0x03,0xce,0x70,0x24,0x80,0x1b,0x95,0x7e,0x56,0x41,0xad,0x9d,0x05,0x9d,0x20,0xa8,0x28,0xfc,0xf9,0xbd }, { 0x17,0x6f,0xfb,0xd1,0xe6,0x2b,0x37,0x8d,0xaf,0xe7,0xca,0x1a,0x98,0x04,0xcf,0x9b,0x54,0xaf,0xc5,0x2a,0x9b,0x76,0x2f,0x4b,0x78,0xef,0xf1,0xff,0xda,0xc3,0x69,0x95 }, { 0xbb,0x08,0xdb,0x29,0x65,0xf0,0x81,0xdf,0xf6,0xc3,0x64,0xa4,0x9a,0x34,0x10,0xfc,0xe5,0x2a,0xae,0x5c,0x89,0x1e,0x21,0xb4,0x4d,0x03,0xc4,0xea,0xcc,0xa1,0xf4,0x93 }, { 0xc5,0x54,0xe5,0x0a,0x60,0x06,0x2b,0x88,0xa9,0xcd,0x81,0xa1,0xa7,0x24,0xc8,0x84,0xc8,0x06,0xa7,0x7f,0x4f,0x96,0x59,0xf7,0x6a,0x05,0x83,0x54,0x1a,0x90,0x60,0xe1 }, { 0x2c,0x8b,0xa0,0xe3,0x11,0xba,0x32,0xac,0x8b,0x0b,0x29,0xca,0x83,0x79,0x9b,0x09,0x5f,0xde,0xa2,0x5c,0xbc,0x0a,0x9c,0xb7,0xcf,0x16,0xda,0x7a,0x95,0xaf,0x68,0xe8 }, { 0xc1,0xfd,0xd6,0xd0,0xa0,0xd8,0xb3,0x13,0x97,0x44,0xd0,0x0f,0x04,0x71,0x59,0xce,0x71,0xc8,0xa9,0xb4,0x3c,0xad,0x47,0x88,0xea,0xa5,0x3c,0xb8,0x3c,0x4f,0x35,0x66 }, { 0xb6,0xab,0x69,0xad,0xdd,0x05,0x82,0xda,0x01,0xd4,0x05,0x83,0x91,0x86,0xf6,0x80,0xc1,0x53,0x61,0xb2,0x7f,0x46,0x83,0x53,0x12,0x1b,0x6a,0x67,0xe6,0xa7,0xc3,0x8b }, { 0xa1,0xb9,0x8c,0x93,0xbe,0x35,0x59,0x7d,0x82,0xec,0x5c,0x18,0xd9,0x89,0x64,0x14,0x99,0x9a,0x23,0x64,0x55,0x25,0x6e,0x64,0xdf,0xc8,0x37,0x4f,0xd7,0xf6,0x04,0x76 }, { 0xcf,0xe5,0x65,0xb7,0xf0,0xfc,0x20,0xa8,0x85,0x4d,0x83,0x61,0xfc,0xa9,0x0c,0xeb,0x40,0xb5,0x9d,0x87,0x73,0x6c,0x3d,0x5b,0xaa,0x8d,0x7c,0xcb,0xd7,0x12,0xe5,0xc3 }, { 0x33,0x2d,0xdc,0xcf,0x07,0x23,0x20,0xe8,0x2a,0xa1,0xb2,0xda,0x42,0x30,0x34,0x41,0x0e,0x14,0x00,0x5a,0x06,0xa2,0x0b,0xb4,0x51,0xfc,0x67,0x4b,0x14,0x0d,0x54,0x5c }, { 0xa9,0x23,0x6a,0xdc,0x50,0x6a,0x09,0x63,0xe9,0x8d,0x40,0x21,0x78,0x06,0x4d,0xc8,0x97,0xa1,0x30,0x18,0x6b,0x0e,0x09,0x7a,0x5e,0x8f,0x1f,0x62,0xcf,0xee,0x69,0x4f }, { 0x88,0x96,0x6e,0xfe,0x06,0x43,0xba,0xf6,0x51,0xe7,0x8a,0x19,0x28,0x48,0xc7,0x77,0x56,0xf2,0x8c,0x32,0x10,0x4b,0x15,0x2d,0x9c,0x5f,0x8b,0x76,0x01,0xd7,0x6b,0xe3 }, { 0x7f,0x2f,0x99,0x8c,0x51,0x13,0xce,0x98,0x36,0x88,0x83,0xff,0x6e,0xa5,0xdf,0x69,0x8d,0x31,0x36,0x45,0x8b,0xe5,0x93,0xbd,0x53,0x00,0x0d,0x67,0x0b,0x93,0xfc,0x6d }, { 0xbe,0x2f,0x68,0x58,0xe6,0xb0,0x2e,0x5c,0x89,0x13,0x19,0x1f,0x60,0x52,0xb2,0x97,0x61,0x57,0x4b,0xcb,0x34,0x68,0xe6,0x1d,0x8a,0x48,0x4f,0x2d,0x66,0x99,0xe1,0xbe }, { 0x4c,0x24,0xe9,0x94,0x42,0x1c,0x72,0xaf,0xca,0x6d,0x6a,0xf4,0x48,0x7e,0x86,0x97,0x4d,0x65,0x4f,0x70,0x3d,0xae,0xe5,0x81,0xf1,0x16,0x32,0xff,0xa7,0x62,0xd4,0x1a }, { 0x14,0xd2,0x71,0x06,0x50,0x26,0xfb,0x5c,0x6f,0x8f,0x9c,0x6d,0xc1,0xbe,0x2b,0xb0,0x95,0x4f,0x90,0x92,0x6c,0xf1,0x64,0x4f,0xab,0x2f,0x03,0x8c,0x34,0x3b,0xac,0xf8 }, { 0x77,0x4d,0xc4,0x72,0x62,0xf8,0xd3,0xda,0x10,0x52,0x27,0x30,0xf7,0x3e,0x75,0x18,0xd8,0x30,0x39,0x6d,0x3c,0x38,0x73,0x05,0x20,0x4b,0x9b,0x1c,0x49,0xf0,0xcc,0x02 }, { 0xd3,0x74,0x07,0xf5,0x7c,0x16,0x15,0xe9,0xa1,0xc5,0x9b,0x1c,0xb9,0x64,0x3b,0xdf,0xaa,0xdc,0xa0,0xca,0x03,0xe9,0xb5,0xf9,0x79,0xcf,0x7b,0x0f,0x6c,0x07,0x14,0x0b }, { 0x03,0xc5,0x2b,0xb9,0x38,0x86,0xf0,0x5b,0xab,0xc3,0x03,0x04,0x3c,0xb4,0xc6,0xb1,0x24,0xcd,0x95,0x03,0xcf,0xfd,0xc1,0x93,0x8c,0x19,0x53,0xdc,0x7e,0x1d,0x2e,0x9c }, { 0x3c,0x47,0x67,0x8b,0xd0,0x43,0x2b,0x9d,0xe2,0x2f,0x67,0xc4,0x62,0x56,0xa0,0xe4,0x86,0x23,0xc4,0x65,0x78,0xdb,0x11,0x84,0x50,0xfe,0x8c,0x6e,0xb3,0x24,0xba,0xd6 }, { 0xa9,0x14,0x18,0xe6,0xf7,0x9d,0x48,0x31,0x94,0xa2,0x42,0x19,0x73,0x1e,0x9c,0xbe,0x18,0x46,0xa5,0xc8,0x21,0x97,0x60,0xb9,0x7a,0xaa,0x6a,0x17,0x4b,0xbf,0x89,0x26 }, { 0x9f,0x61,0x93,0x9a,0xb8,0xde,0x8d,0x63,0x9a,0x85,0x7a,0xc0,0x30,0x53,0xb2,0x1b,0x7e,0xc9,0x0b,0x8f,0xd6,0xcc,0x92,0x26,0x1c,0x82,0x46,0x0b,0x1a,0xa9,0x28,0xe4 }, { 0x08,0xae,0x96,0xc3,0x3c,0x3a,0x28,0xaf,0xaf,0xd9,0xc2,0xbb,0x8f,0xe2,0x86,0x2c,0x05,0x13,0x53,0x00,0x43,0xd6,0xb4,0xee,0x66,0xfa,0xb5,0xc6,0x15,0x03,0x15,0xe9 }, { 0x62,0x96,0xb1,0x11,0xc2,0x3b,0xbc,0xbd,0xf4,0x5e,0xe6,0x58,0xa7,0x6e,0x49,0x16,0x55,0x1b,0x79,0x6d,0x39,0x3e,0xd7,0x18,0xdd,0xee,0xbd,0x95,0xee,0x08,0xb7,0xb0 }, { 0x88,0xa8,0xad,0x15,0x10,0x14,0x3d,0xcb,0x0a,0xdf,0xa8,0xe8,0x04,0xa0,0x2f,0xd4,0x3a,0x71,0x06,0x85,0x86,0xe9,0xae,0x3c,0x29,0xe0,0xe7,0x10,0x6c,0x2d,0x24,0xb1 }, { 0x46,0xc2,0xd4,0x4f,0xd9,0x4f,0x46,0xd1,0xa7,0x27,0xcd,0xb9,0xd6,0x83,0xf6,0x2a,0x0b,0xfc,0xd4,0xf9,0xc7,0x15,0xe6,0xda,0x6d,0x3d,0x9a,0x70,0xaf,0x16,0x21,0x5c }, { 0xed,0xa7,0x25,0xc1,0x08,0x25,0xdb,0x9b,0xd7,0x97,0x27,0x14,0x96,0x8c,0x52,0x3e,0x7c,0xa0,0x65,0xe3,0x9e,0x08,0x9b,0xbf,0x61,0x4e,0x18,0x7d,0x6e,0xef,0x31,0x37 }, { 0xa8,0x77,0xa3,0xbf,0x93,0x86,0xfe,0xa1,0xf4,0xe4,0x2c,0xb6,0x7d,0x91,0xfe,0xa7,0x51,0xca,0x69,0xfd,0x09,0x72,0xb0,0xe2,0x61,0x67,0x70,0x3e,0x93,0x4a,0xe6,0x46 }, { 0x8a,0x58,0xfa,0x3d,0x82,0x1e,0x96,0x3a,0xc7,0x45,0x6c,0xb9,0xe6,0x59,0x43,0xd6,0xa0,0x10,0x99,0x83,0x22,0x4c,0xa7,0x20,0xae,0xaa,0xa2,0x73,0x93,0x0a,0x1d,0x57 }, { 0xf6,0x80,0x6e,0x85,0x69,0x62,0xc6,0x67,0x6b,0x01,0x50,0xaa,0xd0,0x2b,0x84,0x59,0x3f,0x85,0x64,0xe6,0xed,0xc0,0xd3,0x11,0x4e,0xad,0x51,0xd2,0x41,0xc1,0xb7,0x75 }, { 0x59,0xe8,0x10,0x44,0x08,0x67,0x84,0x79,0x50,0xe5,0x41,0x35,0xaa,0x3d,0x78,0x90,0x80,0x6b,0x85,0xdb,0xc6,0xf1,0x08,0x2f,0xf5,0x84,0x41,0x23,0xe6,0x39,0x3f,0x10 }, { 0x80,0x6c,0xc7,0x72,0xff,0x82,0xfb,0xf0,0x66,0x44,0xa4,0x8c,0x60,0xfe,0x04,0xe7,0xf5,0xfd,0x54,0x01,0xa8,0xac,0xbc,0xea,0x2e,0x48,0x44,0x12,0x5b,0x7b,0x1b,0x58 }, { 0x1f,0xcd,0xe4,0xca,0x8d,0xe6,0xd1,0xdd,0xad,0x8e,0x72,0xc6,0x39,0xf6,0xf2,0x76,0x03,0xc7,0x1c,0x2c,0x8a,0x11,0x86,0xcf,0x82,0x07,0xf6,0x67,0xba,0x54,0x20,0x2b }, { 0x20,0xf0,0x24,0xc6,0x4a,0xe3,0xca,0x6c,0x4f,0xf3,0x9d,0x5e,0x04,0x59,0x77,0x98,0x62,0xea,0x0e,0x39,0xee,0x11,0x2e,0xbd,0x57,0xea,0xea,0xeb,0xd7,0xe4,0x5c,0x85 }, { 0x85,0xe3,0x23,0xa4,0xdd,0xb8,0x24,0x86,0x10,0x74,0x1c,0x57,0x10,0x1c,0x40,0xef,0x58,0xa3,0x48,0xbb,0x03,0xb7,0xa5,0x87,0x74,0xdf,0x67,0xf3,0xb8,0xc9,0x83,0x78 }, { 0x8b,0x5d,0x34,0x4b,0x37,0xdf,0xe5,0x4e,0x94,0xd6,0x7b,0xb2,0x41,0xa0,0xd6,0x13,0x70,0xbb,0x2c,0x88,0x9a,0xec,0x52,0x1f,0x63,0xa3,0xf4,0x97,0x7e,0xde,0x7b,0xec }, { 0x3a,0x2d,0xf8,0xd4,0x96,0xb0,0xe0,0x28,0x78,0x53,0xed,0x2b,0x5c,0xa8,0x22,0x87,0x8e,0x7c,0x12,0xd1,0x06,0xad,0x10,0x29,0x14,0xd5,0x47,0x82,0xfc,0xfa,0x1b,0x08 }, { 0x35,0x50,0x69,0xf4,0xc8,0xeb,0x87,0x18,0x3c,0x05,0x16,0xeb,0xa3,0xc4,0x05,0x37,0xda,0x59,0x67,0xef,0x7d,0xea,0x22,0x4c,0x08,0x7d,0x34,0x0d,0xdd,0x80,0x89,0x69 }, { 0xbd,0x26,0x3e,0xd5,0xcc,0xb8,0x02,0x50,0x15,0x75,0x6c,0xed,0x7c,0x20,0x43,0x50,0x5d,0x8c,0x5d,0xea,0x10,0x7e,0x15,0x8b,0x37,0xa6,0xfd,0x90,0xd2,0x75,0xf6,0x33 }, { 0x05,0xf2,0x50,0x1c,0x57,0xbc,0x49,0xb5,0xdb,0xbe,0x0a,0x4c,0x94,0x5c,0x16,0xa6,0xba,0xf9,0x1f,0xaa,0x88,0x93,0x40,0x94,0x4d,0x81,0x9c,0x0d,0xae,0x7a,0x25,0xee }, { 0x9e,0xa6,0xdd,0x11,0xf9,0x38,0x1a,0xd2,0xdd,0x5f,0x47,0x49,0x16,0x7c,0xc9,0x32,0x25,0x3a,0xd8,0xdb,0x55,0x74,0xa7,0x4c,0xb3,0x7c,0x64,0xdc,0x38,0xdb,0xa4,0xad }, { 0xfb,0xda,0xe6,0x75,0x2f,0x0d,0x3d,0x76,0x98,0x90,0x7e,0x85,0x5a,0x67,0xde,0x70,0xb0,0x97,0x81,0x18,0xa0,0x59,0x30,0x5e,0x6d,0x5c,0x97,0x01,0xc7,0xc0,0xb6,0x3d }, { 0xb0,0x5d,0xdc,0x8b,0xbd,0xc9,0x63,0x1c,0x81,0xaf,0x00,0xb5,0x8f,0x38,0x27,0x71,0x90,0x57,0xc5,0xa6,0x33,0xb4,0xf7,0xd1,0x09,0x77,0xba,0xbf,0x42,0xdc,0x68,0x8a }, { 0x5b,0xc7,0x23,0x15,0x39,0x85,0xaf,0xaf,0xb8,0x06,0xe2,0x45,0xc3,0x1e,0xdc,0xae,0xf8,0x59,0x07,0x0e,0x14,0xef,0x32,0x35,0x89,0x1b,0x15,0x1b,0x48,0x04,0x94,0x35 }, { 0xeb,0x43,0x5b,0x96,0x59,0x5c,0x4f,0x8b,0x67,0xaf,0x32,0x65,0x0a,0xf8,0x0e,0xd0,0x9c,0x95,0xf5,0xe6,0x62,0xb4,0x50,0x0c,0x4f,0x80,0x54,0x61,0x5e,0x13,0x29,0xed }, { 0xb4,0xdf,0x32,0x52,0x6a,0x21,0x8e,0x27,0xa5,0xe0,0x4e,0x4a,0xaf,0x66,0xb7,0xc6,0x4c,0x55,0xcc,0x80,0x70,0x76,0x27,0x26,0x0f,0xcb,0xf9,0xbd,0x0d,0x27,0xd4,0x2d }, { 0x60,0x7d,0x45,0x13,0x80,0x53,0x0d,0xfa,0x3f,0x69,0x23,0x93,0x39,0xe6,0xeb,0x00,0x14,0x30,0x7c,0xf5,0xec,0x87,0x10,0x4b,0xa3,0xcd,0x8d,0xe7,0x02,0x81,0x5b,0x41 }, { 0x42,0xf2,0x18,0x7c,0x99,0x79,0xac,0xad,0x3b,0x36,0xe5,0x11,0x44,0xf2,0xe5,0x56,0x1a,0x09,0x41,0xd5,0x8e,0xb6,0x7c,0xfc,0x12,0xf6,0x12,0x04,0xb6,0x47,0x52,0x1e }, { 0xc5,0x54,0x82,0xbe,0x4c,0x0b,0x60,0xfb,0x09,0xea,0x93,0x2e,0x41,0x2f,0xe4,0x20,0xd1,0xa4,0x1f,0x06,0x1b,0xde,0xdf,0x0a,0xa0,0x9c,0x3c,0xf3,0x7e,0xe4,0x05,0xaf }, { 0x61,0xb8,0xd6,0x74,0x0a,0xc3,0xdd,0x43,0x72,0xfc,0xc0,0xdb,0x7d,0x7e,0x6e,0x3e,0x51,0xd4,0x87,0x66,0x92,0x47,0xb5,0x24,0x10,0xdf,0xe0,0xd7,0x5a,0x8e,0x79,0x4c }, { 0x06,0xc4,0x2a,0xef,0xf2,0x74,0x14,0x5b,0xec,0xda,0xab,0x49,0x19,0x16,0x1d,0x9a,0xd2,0x19,0x77,0xe6,0xf2,0x80,0xc5,0x5b,0xf1,0x52,0xbc,0xa4,0xaa,0x5d,0x54,0x7c }, { 0xe9,0xba,0xb5,0x91,0x8c,0x6c,0x56,0xad,0xf5,0xb5,0x2d,0x56,0xce,0x9a,0x7f,0x6b,0x61,0xfb,0xf4,0x08,0x37,0xf6,0x77,0xf5,0xe6,0x63,0x65,0xef,0x11,0x8a,0x33,0xe1 }, { 0x22,0xf2,0xf3,0xbc,0xa5,0x4e,0x3a,0xa6,0xcb,0xa9,0x34,0xab,0x7d,0x0f,0x6e,0xb1,0xda,0xa3,0x48,0xa4,0x9b,0xe3,0x9d,0x23,0x35,0x89,0x61,0x52,0xf2,0x36,0xa6,0xbe }, { 0x36,0xb9,0x08,0x45,0xe4,0x6a,0xe5,0x01,0xde,0xed,0xcd,0x81,0x63,0x30,0xf9,0x2a,0xf5,0x82,0xb7,0x2a,0x69,0x10,0xdf,0x65,0x64,0xe4,0x89,0xf0,0x0e,0x07,0xcc,0x9c }, { 0x0e,0xef,0x6b,0xb1,0xb5,0x5f,0x06,0x14,0x61,0xb1,0xba,0xe2,0xd3,0xc1,0x3a,0x97,0x76,0xe5,0xd6,0x22,0xed,0xd7,0xf8,0xb1,0xae,0x59,0x17,0xa2,0xc0,0xd3,0x65,0x90 }, { 0xb0,0x5c,0x0d,0xf0,0x28,0xe7,0x78,0x89,0x94,0xbc,0x42,0xf2,0x84,0xa6,0x5e,0x1b,0x20,0xd2,0xce,0xd7,0x7d,0x02,0x6c,0x86,0xb1,0xe4,0xa1,0x39,0x2d,0xd1,0xcb,0xb8 }, { 0xaa,0xca,0xeb,0xb0,0x68,0xcc,0xdd,0x5e,0x5c,0x36,0x13,0x8a,0x2d,0x0f,0xed,0xb8,0x1e,0x2e,0x73,0x31,0xdf,0x02,0xaa,0x1c,0xf7,0x76,0xaa,0x65,0x2d,0x3a,0x4f,0x02 }, { 0xa8,0xc2,0xff,0x2a,0x5a,0x87,0x33,0x51,0xcb,0x88,0xec,0xb1,0x3e,0xcc,0x68,0xb9,0x4e,0x5d,0x80,0x42,0xcd,0x90,0x6f,0x31,0xbe,0xf4,0x78,0xe3,0xe6,0x16,0x9d,0x66 }, { 0x0d,0xaf,0xc3,0x08,0x03,0xde,0xc0,0xcf,0xb4,0xd6,0xf9,0x32,0xa4,0x0a,0x01,0xbc,0x21,0x8d,0x4c,0xc3,0x5c,0x23,0x22,0x20,0x63,0x37,0x2e,0x26,0x15,0x3a,0x62,0x3c }, { 0x31,0x79,0x4d,0x34,0xfb,0xd0,0x8e,0x55,0xa1,0x66,0xc1,0xd0,0x90,0xe3,0xe5,0xc4,0x21,0x5f,0x19,0x80,0x60,0xd9,0xfe,0xb1,0x97,0x1a,0x6f,0x3d,0x84,0xe2,0xb4,0x7d }, { 0x53,0x9c,0xf0,0xde,0xe1,0x35,0xf1,0x48,0xbf,0xb7,0x91,0xf7,0x5f,0xfc,0x69,0x85,0xd8,0x25,0x1f,0xc0,0x65,0xf8,0x08,0xa5,0xda,0x3d,0xde,0x5a,0xdc,0x6c,0x76,0xed }, { 0x40,0xd5,0xec,0xbc,0x3c,0x0a,0x48,0x69,0x20,0xf2,0xd9,0xe3,0x7a,0x40,0xf9,0x5b,0xb1,0x62,0x9a,0x77,0xbe,0xf7,0x92,0x56,0xbf,0xe9,0xb9,0xaf,0x2a,0x6c,0xb9,0xf8 }, { 0xff,0x5e,0xfd,0x23,0x7b,0xf6,0x00,0x5e,0x96,0x0e,0x9c,0x5f,0x9b,0x86,0x0e,0x17,0x4e,0xe4,0x9d,0xd1,0x8b,0xaa,0x34,0xb0,0x81,0x4e,0xb1,0xee,0x5a,0x2e,0xd3,0x56 }, { 0xab,0x7f,0xc2,0x42,0xda,0xb0,0xcb,0x84,0xac,0x5d,0x41,0x13,0x95,0x83,0x04,0xc0,0x07,0x8e,0x08,0x60,0xb6,0xc0,0x03,0x11,0x86,0x2a,0xdd,0x77,0xf8,0x42,0xd8,0xc1 }, { 0x89,0x1d,0xeb,0x91,0xd9,0x56,0xba,0x73,0x33,0x9c,0xaf,0x1f,0xb0,0x34,0xd0,0x1e,0x25,0x8f,0xe6,0xe7,0xd4,0xb5,0x78,0xe0,0x40,0xd8,0xdd,0x98,0x2d,0xd9,0x6d,0xd6 }, { 0xa4,0x12,0xf9,0xe1,0xec,0x77,0x2f,0xec,0x5b,0xe8,0xd5,0xd2,0x85,0x2a,0xac,0x7d,0xda,0xf0,0xfb,0xe5,0x48,0x88,0x2b,0x81,0x06,0x65,0x85,0x13,0x61,0xc8,0x7a,0xff }, { 0xd7,0x54,0xca,0x59,0xd0,0xb6,0x0b,0x69,0x6a,0x6b,0xfd,0x4a,0xab,0x64,0x4f,0x49,0xde,0xa9,0x74,0xfc,0x49,0x82,0x1a,0x8c,0x54,0xa9,0xa5,0x12,0xef,0x4a,0x24,0xe9 }, { 0xb3,0x4f,0xa2,0x0b,0x57,0xd8,0x69,0xf5,0x47,0x48,0x8b,0x4b,0x31,0xc7,0x6f,0x2a,0xb3,0xf2,0xdc,0xeb,0xca,0xb1,0x24,0xf7,0x02,0xbe,0x8d,0x34,0xb1,0x1b,0x4c,0x87 }, { 0x1a,0xda,0x51,0x96,0xd2,0x60,0xde,0xac,0xf9,0xd5,0xa0,0xaf,0x53,0x08,0x29,0xd1,0x33,0x5e,0x10,0x25,0x37,0x3a,0x13,0x0a,0xf4,0x65,0x22,0x66,0x7c,0xcd,0xea,0x5b }, { 0x84,0x4e,0x59,0x84,0x78,0x46,0x58,0x4e,0x69,0x0d,0x4b,0x6e,0x9d,0xef,0xb9,0xf7,0xb5,0x4c,0xe3,0x76,0x49,0xb6,0x4a,0x0e,0xcb,0xa5,0x0d,0xee,0xcd,0x1b,0x7d,0x22 }, { 0xde,0x6c,0x5c,0xab,0xad,0x43,0xf0,0x51,0x56,0x6c,0x03,0x0a,0x6f,0xb9,0x70,0xcf,0x74,0x27,0xfb,0x1d,0x59,0xe7,0x02,0x69,0xa0,0xe2,0xcd,0x13,0x3f,0xf5,0x99,0xc9 }, { 0x14,0xb7,0x5d,0xe7,0x3e,0x57,0x3a,0xf6,0x42,0xff,0xcc,0x6a,0x37,0xf3,0xef,0x3e,0x7b,0xac,0xdd,0xf3,0x1c,0x29,0x03,0xc2,0xce,0xeb,0x49,0x68,0x35,0x78,0x49,0x3a }, { 0x9c,0x3a,0xe1,0x06,0xdd,0x0a,0x52,0x48,0x30,0x86,0xad,0xfa,0x32,0x90,0x2c,0xc2,0xaa,0x78,0xce,0x38,0x09,0x87,0x30,0x24,0x1e,0x15,0xb9,0x40,0x05,0x24,0x01,0x58 }, { 0x9f,0xd6,0x36,0xa5,0x60,0x59,0x67,0x1c,0x69,0xcc,0xc3,0xcc,0x52,0xd2,0x2c,0xf8,0xf8,0xec,0x6d,0x6d,0x0f,0xaf,0xc1,0xde,0x7a,0x6c,0xde,0xc1,0xbc,0xf4,0xc1,0x10 }, { 0x68,0x63,0x26,0xf2,0x6c,0x04,0x5b,0x74,0xb7,0xff,0x7e,0x68,0x8f,0xf9,0x64,0x6b,0x13,0x70,0xf3,0x0b,0x00,0xef,0x70,0xea,0x46,0x01,0x17,0x8c,0xdd,0xa4,0xa5,0xf0 }, { 0x2b,0x4f,0xf4,0xd1,0x85,0x26,0x59,0x78,0xf5,0x05,0x1e,0x14,0xaa,0x9e,0xfa,0x72,0x1e,0x76,0x0c,0x04,0xf3,0x78,0x91,0x0a,0x84,0x6d,0x1f,0xf2,0x2f,0x55,0x6d,0x32 }, { 0x18,0x82,0x1f,0xf3,0xfc,0x27,0xdd,0x89,0xf7,0x9c,0xde,0x34,0xc4,0x7c,0xc1,0xf1,0x28,0x77,0xa8,0x9e,0x31,0xe2,0x5b,0xd1,0xc9,0xe8,0x13,0x60,0x08,0x8f,0xc8,0xcf }, { 0xce,0x46,0x2c,0x5f,0x8d,0x46,0xe1,0x7e,0xc1,0x8c,0x49,0x13,0x7d,0xa1,0x0d,0x97,0x19,0xad,0xa0,0x5d,0xdc,0x5f,0xf7,0x03,0xe4,0x93,0xfa,0x53,0x14,0xdd,0xbe,0x8c }, { 0xde,0xc4,0x58,0xfb,0x6f,0x3c,0x18,0xe9,0xab,0xc4,0xeb,0x37,0x39,0x99,0x44,0x1d,0xc2,0x03,0x7b,0x7b,0x03,0x01,0x6e,0x8b,0x3f,0xb2,0x33,0xe5,0xb2,0x22,0x26,0x65 }, { 0xb4,0x88,0xec,0x48,0x16,0x1d,0xf3,0x67,0x78,0x08,0x16,0x8f,0xe8,0x93,0x88,0x21,0x29,0xcb,0x5c,0xfb,0xf7,0x65,0x56,0x74,0x2c,0xf7,0x76,0x26,0xdb,0xb0,0x8e,0x48 }, { 0xf9,0x31,0x31,0x20,0x2b,0x26,0xd8,0x41,0x26,0xe7,0x16,0x60,0x09,0xa5,0xa9,0x4b,0x1d,0x4d,0x04,0xc3,0x4f,0x74,0xbc,0x8e,0x56,0xd9,0x4d,0xbc,0x3c,0xaa,0x52,0x50 }, { 0xa0,0xd2,0x61,0xa7,0x1a,0x50,0xb8,0x8d,0xe6,0x29,0x36,0xb6,0x81,0x6d,0x3f,0x81,0x15,0x11,0x49,0x0f,0xcd,0x9d,0xce,0x52,0xee,0x25,0xd2,0x9a,0x22,0x22,0x7d,0x26 }, { 0x84,0x1b,0xc5,0x96,0x7a,0xf2,0x94,0x67,0x21,0x9b,0x1e,0x4e,0xa0,0xcf,0x68,0x01,0xac,0xf5,0xf3,0xe4,0x5c,0x4b,0x17,0x9f,0xce,0xa6,0x67,0x85,0x23,0xca,0xb8,0x51 }, { 0xd4,0x09,0x7e,0x8d,0x63,0x80,0x48,0x4c,0x60,0x45,0x57,0x17,0x64,0x36,0x5c,0xa2,0x65,0x99,0xee,0x7e,0x35,0xfe,0x9c,0x93,0xfc,0x75,0x93,0x94,0x25,0x38,0xc4,0xfe }, { 0x34,0xa6,0xab,0x4d,0xb1,0x5c,0x19,0x48,0xb5,0x92,0x14,0xbf,0xce,0xac,0x6a,0x97,0x7b,0x72,0x03,0x69,0xe4,0x71,0xbc,0x70,0x59,0x05,0x1d,0x1b,0xc6,0x2f,0xaf,0x0d }, { 0xf6,0x35,0x1e,0x5e,0x91,0x30,0x54,0x04,0xb8,0x1c,0xbd,0xe2,0x96,0x7d,0x4a,0xec,0xe7,0x6e,0xb3,0xf0,0x20,0x5d,0xdc,0x13,0x7d,0x88,0xd4,0xbe,0xee,0x7a,0x9e,0x79 }, { 0x5b,0xc9,0x13,0x79,0x73,0x81,0xba,0x63,0x80,0xa7,0xcd,0x6f,0xab,0xfe,0x21,0x5d,0x1b,0xc2,0xae,0x3f,0xea,0x4a,0x67,0x7b,0x81,0xe5,0xa7,0x2a,0xbb,0x70,0x5d,0x69 }, { 0x5d,0x9e,0x53,0x85,0x9d,0xfc,0x61,0xa2,0x23,0xdc,0x63,0xd9,0x4a,0x9e,0x0c,0x00,0x71,0x4e,0x9c,0x92,0x82,0x24,0xc7,0x0f,0xb1,0xe6,0xb1,0xfb,0x93,0x8b,0xeb,0xa5 }, { 0x0e,0x60,0x8e,0x13,0x1f,0x84,0x55,0x12,0x1b,0x10,0xc6,0x6e,0x87,0x8d,0xca,0xc4,0xdf,0xcb,0xa9,0x4a,0x37,0xbd,0xa2,0x85,0xc7,0xa0,0x9c,0x96,0x7c,0x69,0x53,0xca }, { 0x17,0x4c,0x0e,0x63,0x34,0xd4,0xf8,0x66,0x14,0xf2,0xe4,0x0b,0xde,0x6e,0x7d,0x57,0x66,0x58,0x85,0xff,0x2e,0x0a,0xdb,0x21,0x3a,0x1d,0x85,0x28,0x5c,0x7e,0x56,0xe2 }, { 0xf0,0x50,0x78,0x1b,0x7e,0x53,0x6b,0x68,0x3b,0x25,0x41,0x94,0x15,0xa9,0x09,0x4d,0x12,0xbd,0xa4,0xb3,0x8c,0x00,0x04,0x79,0x0d,0xa6,0x5a,0x1f,0x2d,0x85,0xca,0x26 }, { 0x3f,0xc7,0xf3,0x32,0xb7,0x33,0x3b,0x61,0x7e,0x1d,0x87,0x8b,0x4f,0x89,0x72,0x08,0x8b,0x9f,0x2b,0x77,0x26,0xe3,0x11,0x04,0x8f,0xd7,0xf1,0x9a,0x6c,0x01,0xda,0x73 }, { 0x3c,0xe5,0x65,0x37,0xd6,0x39,0x29,0xf8,0x0d,0x9a,0xc3,0x1d,0x5b,0x01,0x32,0x7d,0x29,0xe7,0x4a,0x73,0x85,0xa2,0xde,0xb7,0x45,0x44,0xe4,0x2a,0x9a,0x71,0xd0,0x2d }, { 0x54,0x70,0xeb,0x86,0xef,0x85,0x7f,0xf1,0xbb,0x7a,0x4a,0xbe,0xc0,0x87,0xff,0x3e,0x5e,0x9b,0x39,0xe8,0x07,0x6c,0x2b,0xda,0x96,0xc0,0xd9,0x49,0x83,0x47,0x47,0x9f }, { 0x32,0x85,0xc7,0x27,0x2e,0xcd,0x95,0x41,0x70,0xb2,0xf7,0x4d,0x04,0x42,0x6b,0x6d,0xed,0xae,0x97,0xbf,0x98,0xb3,0x14,0xe5,0x4e,0x93,0x6e,0xdb,0x00,0x97,0xa7,0xce }, { 0xd9,0x36,0x81,0xe1,0xaf,0x32,0x8f,0x46,0x2d,0xf8,0x3e,0xbb,0xe6,0x25,0x76,0xa5,0xfe,0x19,0x17,0x5a,0x8a,0x5a,0x67,0xab,0x34,0x87,0x88,0x52,0x95,0x44,0x14,0xc9 }, { 0xa5,0x19,0x11,0x79,0xd3,0x49,0x17,0x73,0x30,0x49,0xa7,0x59,0x9c,0xc5,0x5d,0xb1,0xb5,0x46,0x51,0xad,0xd1,0x48,0x7b,0x58,0x7d,0x67,0xe8,0x20,0xc0,0xb0,0xf2,0xda }, { 0xf4,0x35,0xed,0x81,0x45,0x2a,0x47,0xf5,0x5b,0x75,0x90,0x3f,0x37,0x8a,0x99,0x3e,0xdb,0x8e,0x81,0xf2,0xe7,0x06,0x58,0xe0,0xd6,0x07,0x1e,0xcf,0x77,0x44,0x74,0x33 }, { 0xc9,0xd1,0xdc,0x8a,0x51,0xb9,0xe8,0xe5,0xaf,0x60,0xd1,0x70,0x1a,0xb2,0x25,0xe1,0xa5,0xfd,0x24,0x2e,0x4e,0xd1,0xa6,0x53,0x5e,0xcd,0x63,0x68,0xbd,0xe7,0xff,0x42 }, { 0x36,0x62,0xa1,0xd3,0x62,0x56,0x93,0x66,0x6d,0xd8,0x51,0xd5,0x42,0xbf,0x8b,0x38,0x3c,0xb8,0x58,0xa8,0xd1,0x30,0xf0,0x1b,0x22,0x2d,0x00,0x57,0x7d,0x6f,0x5b,0xc3 }, { 0x6f,0x0d,0x74,0x77,0x2e,0x53,0x46,0xc6,0xf3,0x17,0x68,0xc4,0x23,0x90,0x81,0x1b,0xfc,0x27,0xf2,0x84,0xe4,0xcd,0x9e,0xb8,0xbd,0x15,0xcb,0xb0,0xe9,0xf3,0x0a,0xe1 }, { 0x7b,0x6d,0x80,0x73,0xdf,0x9e,0x90,0xc5,0xbd,0xf7,0xdd,0x63,0xae,0xd6,0x4b,0xeb,0x08,0x67,0x89,0x86,0x17,0x98,0xca,0x68,0xe7,0x29,0xb7,0x33,0xdf,0x3f,0xc9,0x19 }, { 0x65,0xe7,0xa9,0x08,0xc0,0xb9,0x16,0x4e,0xb1,0x0a,0xa8,0xf3,0x06,0x8e,0x98,0xc2,0x37,0x72,0xf8,0x74,0xa7,0x46,0x50,0x29,0x9e,0x8d,0x86,0x1d,0xcc,0x84,0x6f,0xa2 }, { 0xba,0x4b,0x5d,0x95,0x4d,0xae,0x5c,0xdd,0x75,0x2c,0x88,0x0d,0xe4,0xdf,0x79,0x0e,0x1e,0x28,0x4f,0x9b,0x94,0x8a,0x2e,0x77,0x5d,0x99,0xf7,0x4e,0xb2,0x42,0x07,0x9f }, { 0xb1,0xe5,0x92,0x60,0x64,0x92,0x50,0x2b,0x2d,0x70,0xa3,0xd1,0x5f,0xb0,0xb0,0x4b,0x90,0xfb,0x53,0xe8,0x64,0x44,0x9a,0x80,0x4a,0xc9,0xd6,0x8c,0x81,0x21,0x52,0xba }, { 0x2f,0x20,0xec,0xab,0x36,0x96,0x71,0x5b,0x68,0x5f,0x7c,0xd3,0x0e,0xb8,0x13,0xcb,0xbb,0xf2,0xa3,0xc1,0x55,0xdf,0x8a,0x4e,0xa1,0xfc,0x58,0x69,0xfb,0xd1,0xa0,0xe2 }, { 0x4c,0x5c,0xe3,0x7c,0xfa,0x58,0x65,0x60,0xc3,0xc2,0x2a,0xc1,0xa0,0xa9,0x59,0x0e,0x86,0xa7,0x31,0xd6,0x45,0xeb,0x98,0xcd,0x74,0x9f,0xe0,0x39,0x0e,0xe8,0x6b,0x73 }, { 0xbc,0x7c,0x6e,0x54,0x89,0xa4,0xa6,0xaf,0x47,0xc4,0x15,0xfc,0x2a,0xfa,0xf5,0xe1,0xe5,0x5e,0xce,0xed,0xfd,0xf5,0x1d,0xc7,0xa6,0x0f,0xe0,0x80,0x8a,0xf8,0x64,0x98 }, { 0x32,0x26,0x21,0x32,0xba,0xcd,0xb5,0xae,0xbf,0x1b,0x1f,0x89,0xe3,0x6b,0x15,0xac,0xc3,0xe5,0xbb,0xc0,0x08,0x25,0x71,0x1d,0xae,0x83,0x87,0x40,0xb1,0x1c,0x3b,0x73 }, { 0x0e,0xdc,0x03,0x3d,0x42,0xea,0x66,0xe2,0xa6,0x05,0x3c,0x27,0x1f,0x79,0x91,0x67,0xb3,0x85,0x25,0x28,0xac,0xe3,0x60,0xd1,0x2e,0xb7,0x23,0xd3,0xb1,0x19,0x73,0xbb }, { 0xc4,0x37,0x40,0xc0,0x80,0x16,0x18,0x3e,0x27,0xe1,0xc9,0xf0,0x07,0xe2,0x3b,0x00,0x9e,0xfc,0x78,0x11,0xd7,0xd8,0xff,0xbb,0x29,0x29,0xe6,0x84,0xbd,0xe5,0xad,0xdb }, { 0x2f,0x0c,0xa1,0x0d,0x50,0x38,0xf5,0xa0,0x53,0xfe,0xfc,0x75,0xb9,0x1c,0x3b,0x3e,0x97,0xe2,0x47,0x83,0xe8,0xa1,0xae,0x21,0x95,0x65,0xd7,0x35,0xb7,0x2b,0x1e,0x08 }, { 0xd5,0x17,0x58,0x78,0x34,0xac,0xba,0xd9,0xf5,0xc5,0x0a,0xa2,0xea,0x0c,0x78,0x50,0x23,0x62,0xe0,0xc7,0xab,0xc4,0xa0,0x4c,0xb5,0x0f,0xd5,0x9e,0x38,0xc8,0x29,0xf9 }, { 0x4e,0x7a,0xbf,0xaa,0x22,0xeb,0xaf,0x92,0xb3,0x93,0xcd,0xd3,0xc3,0x9e,0x8a,0xea,0x34,0x53,0xe3,0xd5,0x69,0x37,0xa4,0xeb,0x32,0xb8,0x30,0x47,0xc5,0xe6,0xb5,0xeb }, { 0x8a,0xc8,0x10,0xbb,0x0f,0x40,0x98,0x98,0xaa,0xdf,0x59,0xc7,0x0b,0xd8,0x6e,0xd3,0x1b,0xad,0x92,0x16,0x77,0x6f,0x4b,0x19,0xfd,0x66,0xb4,0x99,0xad,0x08,0xe8,0x44 }, { 0xcf,0x0a,0xfd,0x0d,0x18,0xd5,0xe1,0xde,0x9b,0x0f,0x91,0xdf,0xc5,0xf2,0x03,0xd4,0x51,0x02,0xb7,0x6a,0x2d,0x64,0x9f,0x70,0x4f,0x23,0x54,0x2b,0x6b,0x99,0x7d,0xcd }, { 0xfb,0x81,0x2b,0x2a,0xaa,0xc4,0x54,0x23,0x0f,0x09,0x7a,0xed,0x9f,0xa0,0x07,0xc2,0x6e,0x49,0xc7,0xdd,0x36,0xc6,0x6e,0x2e,0xd4,0xd7,0x6e,0xbe,0xe2,0x0e,0x46,0xb1 }, { 0xe7,0xe8,0x89,0x9e,0xe3,0x84,0xd3,0xdf,0xa2,0x16,0xde,0x76,0x18,0x0e,0x72,0x31,0xc2,0xfa,0x40,0x9a,0xc9,0x1e,0x76,0x2d,0x17,0x13,0x20,0x79,0xfa,0xa3,0x4c,0xa5 }, { 0xb3,0x84,0xc8,0xc4,0x3f,0x36,0x79,0x4f,0xc8,0xb8,0xce,0x4e,0x92,0xd4,0x90,0xd3,0xc9,0xe2,0x69,0x97,0x26,0xdd,0x8f,0x58,0x03,0xde,0x1d,0xf0,0x37,0xff,0xcd,0xa0 }, { 0x9a,0x39,0x41,0xa7,0xd4,0xa4,0xd1,0x04,0x0b,0xb7,0x3b,0x3c,0x3c,0x79,0x2c,0xdc,0x6a,0x75,0x33,0x62,0xb7,0x0e,0x8b,0xe8,0xd2,0x11,0x7c,0x75,0xb1,0xa1,0xd4,0xd5 }, { 0x95,0x6b,0xe0,0x38,0xfd,0xe1,0x11,0xd7,0xe9,0x41,0x63,0xcf,0x3e,0xe5,0xdf,0x6c,0xab,0xf7,0x61,0xec,0xe8,0xaa,0x6b,0x6b,0x3f,0x6a,0xe2,0x43,0xf9,0x55,0x23,0xdf }, { 0x99,0x13,0x75,0xd6,0x75,0x4b,0x2d,0x3c,0xc2,0x07,0x4f,0xeb,0x8d,0x9c,0x2b,0x1d,0x92,0x04,0x34,0x2d,0x55,0xf9,0x80,0xa1,0x45,0x6a,0x59,0x6a,0xc6,0x90,0xbe,0x2b }, { 0x2c,0xcb,0xe8,0x83,0x5e,0x42,0x6d,0x93,0xea,0xa8,0x94,0xf9,0xfa,0xb2,0x80,0x8d,0xaa,0x04,0xfa,0x57,0x37,0x36,0x71,0xea,0xf9,0xdd,0xe1,0x71,0xdb,0x4b,0x97,0x95 }, { 0x0c,0xdd,0xaa,0xa8,0x7d,0xf9,0x4f,0xd2,0xb5,0xdf,0x20,0xf5,0x10,0xc0,0x0c,0xd3,0xd0,0x8e,0xd4,0xd3,0x6a,0x13,0x60,0xb3,0x1c,0x5b,0x7b,0x75,0x18,0xe7,0xe4,0x47 }, { 0x4e,0x73,0xd5,0x6b,0x41,0x7d,0x7a,0xc7,0x08,0x78,0x47,0x81,0xbc,0x5e,0xcf,0xd9,0xfc,0x4d,0xdc,0x0f,0xe5,0x43,0x4b,0xe2,0x92,0x57,0x25,0x87,0x54,0xae,0xc2,0x68 }, { 0x26,0xea,0xfc,0x93,0x67,0x03,0x3b,0xca,0x18,0xf5,0x6f,0x3f,0x66,0x30,0x8a,0xca,0x9b,0x50,0x76,0x6f,0x2f,0x67,0x62,0xa5,0xf6,0x0e,0xa9,0xee,0xc3,0x77,0xed,0xfc }, { 0xa1,0x58,0x13,0x5e,0xc9,0x21,0x45,0xdc,0x58,0x90,0x4d,0xb9,0xc7,0x0d,0x25,0xa5,0x05,0x6d,0xe3,0xd8,0xb7,0xb3,0x95,0xd9,0x49,0x74,0xb4,0xf5,0xb6,0x26,0x22,0x9c }, { 0x5f,0x63,0x31,0x9b,0xc1,0xda,0xb0,0xdb,0xc6,0x30,0xfb,0x1a,0x89,0x82,0x11,0x77,0x98,0x78,0xbd,0x57,0x22,0x90,0x0b,0x5e,0xad,0x14,0x70,0x5c,0x0e,0x91,0x12,0xde }, { 0x59,0x3b,0x95,0x18,0xef,0x2a,0xe4,0xf1,0x19,0xf2,0x74,0x78,0x2d,0xde,0xbc,0x41,0x11,0xe0,0xe8,0xf6,0x6b,0xa1,0x15,0x77,0x34,0x40,0x50,0xc1,0x4f,0x25,0x3f,0x95 }, { 0x8c,0x6c,0x91,0xd4,0x6a,0xe3,0xd5,0xfd,0x68,0x42,0x64,0x77,0x5e,0x46,0x98,0x86,0x67,0xc8,0x88,0x59,0xf8,0x01,0x02,0xd8,0xad,0xa6,0x51,0x4a,0x03,0x97,0x21,0x56 }, { 0x4f,0xfa,0x6e,0xce,0x61,0x04,0xbd,0xed,0x58,0x17,0xfc,0x73,0x9a,0xba,0x5c,0x3e,0x5f,0xcd,0x51,0x2f,0x04,0x1f,0xea,0x59,0x67,0xb3,0x74,0x79,0x39,0x6a,0xa6,0xd5 }, { 0xf2,0xf5,0x24,0x28,0x81,0x8c,0xc6,0x71,0x71,0xdb,0x77,0x13,0x34,0xbf,0xa2,0xe9,0x0f,0x0c,0xc8,0x77,0xdf,0xac,0xbc,0x0c,0x79,0xcd,0x55,0xb6,0x55,0xf1,0x71,0x6c }, { 0xd6,0x85,0x76,0xda,0x23,0xc8,0x2b,0x60,0x34,0x3e,0x53,0xfd,0x5d,0x0b,0x85,0x05,0x6b,0xec,0x26,0x5b,0x8e,0x32,0xef,0x66,0x47,0xf3,0xcb,0xb7,0x15,0x42,0xa7,0xda }, { 0x11,0x26,0x8e,0x70,0xd5,0xdb,0x9e,0xa0,0xf6,0x87,0x13,0xc7,0xf3,0xc8,0x11,0x15,0x02,0x2a,0xf9,0xd5,0x0f,0x93,0xb5,0x42,0xe7,0xc4,0xec,0x07,0xe7,0x51,0x3b,0x15 }, { 0xeb,0x3b,0xcd,0xea,0x83,0xe1,0xa4,0x05,0x6c,0xcf,0xbc,0xd1,0x66,0xd5,0xca,0x6a,0x88,0xca,0x88,0xe1,0x54,0xa2,0x43,0xb0,0x6f,0xee,0x9c,0xfc,0xe2,0x36,0x9c,0xf8 }, { 0x74,0x82,0xd4,0x36,0x8a,0xb1,0xa3,0x00,0xb2,0x00,0xf6,0x83,0x5e,0x4a,0x54,0xf1,0xee,0x38,0x7d,0x6a,0xeb,0x87,0x4d,0x8d,0xfa,0x36,0x57,0x20,0x3d,0x3a,0xc1,0x5f }, { 0xb8,0x41,0xee,0x0c,0x97,0x27,0xdb,0x15,0x72,0x3e,0x83,0x66,0x9b,0x4a,0x43,0x9d,0xf2,0xbb,0xe6,0x36,0x10,0xfe,0x8f,0x4b,0x60,0x9f,0xa1,0xfa,0x59,0x95,0xb3,0xa2 }, { 0x98,0xe6,0x99,0xd8,0x21,0x7f,0x9d,0x2f,0xc9,0x99,0x99,0x8b,0x7b,0xde,0x51,0x65,0xda,0x8f,0xe5,0xa7,0x43,0x9a,0xb6,0x93,0xae,0xbe,0x52,0x0b,0x87,0xe4,0x06,0xba }, { 0x6b,0xbc,0xf1,0x10,0xfd,0xbb,0x98,0x83,0xa7,0x38,0xe6,0x28,0x7a,0x23,0x3a,0x24,0x9d,0x87,0x09,0xd2,0x2a,0x5d,0x2e,0x66,0xa3,0xb2,0xcd,0x82,0x45,0xb9,0xf8,0x51 }, { 0x51,0x08,0x6b,0x61,0x53,0x7c,0x25,0x75,0xb1,0x9e,0xc3,0x7b,0xd5,0xf5,0xdc,0xb6,0x0e,0xe9,0xe4,0x24,0x48,0x7f,0x5e,0xb0,0xe3,0x71,0xc4,0x9b,0x50,0x53,0x5b,0xdc }, { 0x4b,0x1f,0xb6,0x05,0x1b,0xf4,0x37,0x96,0xf8,0xd2,0xb3,0x83,0xba,0xc4,0x9b,0x7a,0x8a,0xfa,0x2f,0x27,0x31,0x14,0xe2,0x0e,0x7d,0xae,0x59,0xc7,0x9f,0x98,0x85,0x7c }, { 0xef,0xd5,0xb5,0x5d,0x5b,0x85,0x00,0x21,0xfc,0xad,0xf6,0x95,0x55,0x47,0xf3,0x77,0xa0,0x17,0xc8,0x39,0x17,0xb8,0xaa,0xd2,0xb4,0xfb,0xd8,0x23,0xf4,0x14,0x73,0x34 }, { 0xb4,0x63,0x74,0xa9,0xa5,0xc7,0x84,0x8c,0x4c,0x8d,0xbf,0x93,0x8e,0x08,0x50,0xc8,0x31,0xc1,0x18,0xd9,0xd0,0x9b,0x60,0x8f,0xf3,0x6f,0xe1,0x99,0x18,0x7e,0x2c,0xc9 }, { 0x2e,0xb1,0xea,0x67,0xdf,0x60,0x32,0xb4,0x76,0x9b,0x40,0x50,0x7f,0x56,0xb0,0x5c,0x5e,0x23,0x79,0x65,0x7e,0x2b,0xfe,0x17,0xd5,0x12,0xe6,0x72,0x61,0xc5,0xc1,0x0e }, { 0x19,0x8f,0x5f,0x10,0x7b,0x89,0x27,0x6f,0xab,0x8a,0x99,0xf6,0xdc,0xe6,0x59,0xf4,0x22,0x3f,0x67,0xbb,0xb5,0x7c,0x8d,0x56,0x94,0x91,0x9a,0xb0,0x46,0xb2,0x39,0x7b }, { 0xe4,0xe7,0x28,0x12,0x9b,0x8e,0x42,0xe2,0xec,0x71,0xa7,0x18,0xf5,0x7b,0x55,0xb4,0x72,0xeb,0x22,0x2a,0x7c,0x2d,0x18,0x03,0x84,0xbf,0x17,0x7f,0x01,0x31,0xad,0x37 }, { 0x90,0x07,0x5b,0x34,0x43,0x74,0x1c,0xc5,0x5b,0x3d,0xe7,0x54,0xb7,0x13,0x05,0x51,0xba,0xe0,0xf3,0x84,0x03,0x47,0xe1,0x15,0xdf,0x5e,0x7b,0xcb,0xc2,0xda,0xba,0x4f }, { 0x94,0x76,0xd3,0xfd,0x17,0x7d,0x2c,0x3c,0x82,0x15,0x82,0x9c,0xb4,0xfa,0x47,0xd3,0x32,0x4c,0x3d,0xc2,0xe8,0x30,0x94,0xf7,0xb4,0x0a,0x5d,0x55,0xe4,0xde,0xcb,0x9f }, { 0xb4,0xa2,0xce,0xe2,0x13,0xd4,0xda,0x35,0x7b,0x40,0x78,0x4e,0x79,0x57,0xf4,0x52,0x85,0x7e,0x59,0x9c,0xe7,0x8a,0x85,0x55,0x65,0xd1,0x53,0xdc,0xf4,0xf0,0xb4,0xe8 }, { 0x38,0xd5,0x7e,0x38,0xb9,0x40,0xfd,0x95,0x4a,0x58,0xbf,0xb8,0xb8,0xfc,0x33,0x19,0x50,0xcd,0xb9,0x35,0x83,0xd7,0x4e,0xe8,0x8e,0x24,0x39,0x78,0x99,0xc3,0xdb,0xc9 }, { 0x75,0xd6,0xca,0x30,0x33,0xc3,0x38,0x00,0x32,0x30,0x07,0x44,0xdc,0xc0,0xaf,0xdf,0x30,0x5f,0x9c,0xf7,0x45,0x08,0xde,0x3e,0x8a,0xad,0x83,0xcb,0x7a,0xef,0x1e,0xe3 }, { 0xef,0x80,0x33,0x70,0x5d,0x52,0xa5,0x10,0x85,0xc6,0xf8,0x98,0x95,0xc2,0x21,0xba,0xed,0x5d,0x9b,0x42,0x88,0xb8,0x77,0xea,0x5f,0x40,0x44,0xaa,0x82,0xb9,0x66,0x7d }, { 0x3c,0x84,0x1d,0x10,0x54,0x1e,0xff,0x55,0x17,0x0e,0xfd,0x6f,0xcd,0x90,0xa0,0xa0,0x11,0x83,0x4b,0xc5,0x9b,0x01,0x46,0x0d,0xd2,0xe7,0x14,0x8e,0x5d,0xf7,0xe8,0xa4 }, { 0xc5,0x2c,0x2f,0xb9,0x64,0xe3,0x9d,0xd2,0xa3,0xcb,0x5c,0x6d,0xb0,0xcb,0x95,0x57,0x2d,0xbf,0xd4,0x6e,0x2e,0xb3,0xbb,0x92,0xee,0x52,0xa2,0x11,0x6a,0x9b,0xeb,0xb1 }, { 0x05,0xe8,0xdf,0x7b,0x16,0xab,0x60,0xf8,0xbc,0x11,0xc5,0xe3,0xd0,0x7c,0xe7,0xa8,0x60,0x39,0x22,0x2b,0x53,0x94,0x44,0xd0,0x81,0xa6,0xf9,0xc8,0x0f,0xc1,0xf3,0x10 }, { 0x1b,0xed,0x26,0x52,0x48,0xc9,0xda,0xd5,0x1e,0x70,0xb9,0xff,0xbb,0x19,0xe1,0xd3,0x94,0x67,0xc5,0xc1,0x3d,0x3b,0xc0,0x88,0x76,0x7b,0xa8,0xa0,0xf8,0x6b,0x68,0x04 }, { 0x05,0x45,0x41,0xdf,0x3c,0x12,0xdb,0xaa,0xe7,0x41,0xe6,0x6f,0x0f,0x35,0x38,0x94,0x43,0x72,0x93,0x72,0x0e,0x5b,0x26,0xa2,0x89,0x38,0xf5,0x8b,0x0e,0x37,0x80,0xc3 }, { 0x8a,0x3d,0xb2,0x9c,0x23,0x17,0xbf,0xc5,0x57,0x94,0xa2,0xcd,0x03,0x43,0x69,0xf7,0x0a,0xa7,0xc2,0xbb,0x41,0x58,0x37,0x23,0x6a,0xb2,0x9a,0xc0,0x89,0x4a,0x54,0x5a }, { 0x66,0x56,0x36,0x92,0xe8,0xb4,0x21,0x43,0x42,0xbe,0x8b,0x1c,0x6d,0x27,0x65,0xb8,0x46,0x35,0xb4,0x48,0xf2,0x5a,0x96,0x70,0x8f,0xb6,0xf2,0x36,0x62,0xc3,0x0b,0x31 }, { 0x7d,0xaa,0x26,0x43,0xe3,0xe2,0xe4,0x20,0xbb,0x91,0x08,0xc9,0xd7,0x38,0x03,0x2b,0x0a,0x68,0x3d,0x9c,0x14,0x5f,0xc4,0x0b,0x3d,0xfc,0x51,0xe6,0x1a,0xcf,0x88,0xba }, { 0xbc,0xf1,0xec,0x34,0x94,0xc8,0x97,0x47,0xc7,0x67,0xfc,0xbb,0xf6,0xd6,0x37,0x68,0x6f,0xc8,0xb5,0x3b,0xd5,0x45,0x4f,0xd5,0x5d,0xf5,0xfa,0xea,0x6c,0xd2,0x89,0xf0 }, { 0xc1,0x67,0xba,0xf8,0xdc,0xf5,0x7b,0xe1,0x7b,0x34,0xbe,0x0b,0xd3,0x84,0xf2,0x46,0x66,0x3c,0xd0,0x69,0xbb,0xbc,0xcd,0xc5,0xfd,0xb4,0xec,0xb9,0xe0,0xbb,0x47,0x88 }, { 0x28,0x3f,0x7c,0xff,0x32,0x6e,0x60,0x82,0x23,0xc6,0xb5,0xaf,0x10,0x52,0xcf,0x14,0x50,0x22,0x34,0x7e,0x47,0x90,0x81,0xa5,0xc7,0x14,0x12,0xc5,0x24,0x5d,0xbf,0xe7 }, { 0x5c,0xe1,0x58,0x7e,0x2e,0xcc,0x43,0xb9,0x4c,0x98,0x4b,0x9c,0xa1,0xd0,0x2b,0x4e,0x80,0x00,0x5a,0x99,0xc6,0x93,0xb8,0x14,0x2f,0x14,0xd6,0xf7,0x07,0x92,0x9b,0x2a }, { 0xf7,0xa0,0x18,0x07,0xe3,0xe2,0xc5,0x35,0x1c,0x47,0x02,0x2f,0x89,0xb1,0x50,0x38,0x22,0xec,0x83,0xc0,0x7c,0x2c,0x97,0x29,0x0d,0xd8,0xbc,0x8d,0xf9,0x97,0xdf,0x9b }, { 0x7d,0x60,0x21,0xb9,0xc6,0x7d,0xb4,0x1a,0x06,0xbc,0x3b,0x14,0xe1,0xf6,0xa2,0xb2,0xa2,0x4a,0x6f,0x55,0xc8,0x8f,0xd0,0x70,0xd6,0x62,0xdd,0xfb,0x44,0x55,0x85,0x36 }, { 0x13,0x32,0xb7,0x7b,0xa1,0x9d,0xa2,0xd2,0xe4,0xa7,0x33,0x53,0x17,0x1f,0x80,0xfe,0x16,0xad,0xd4,0x85,0x29,0x82,0xc1,0xf1,0x32,0x91,0x04,0xf2,0x7d,0x8c,0xc8,0xe3 }, { 0x95,0x79,0x3b,0xa1,0x62,0x09,0x07,0xa9,0xc3,0x41,0x0f,0xb3,0xe7,0xae,0x2f,0xfc,0xd0,0x06,0x82,0xcb,0x5f,0xc8,0x37,0xf5,0x73,0xee,0x10,0xed,0xd2,0x7a,0x09,0x61 }, { 0x8f,0x20,0x01,0x67,0x62,0x92,0xd5,0xac,0x5b,0xdf,0xaf,0x41,0x0f,0x64,0xd1,0x6d,0x78,0x2e,0xc4,0xa3,0x2c,0x66,0x03,0x7a,0x28,0xa3,0x51,0x01,0xcc,0x21,0xc4,0x7c }, { 0x2c,0x07,0xe5,0xb5,0x90,0x51,0x25,0xdd,0x17,0xa0,0x48,0x7e,0xdc,0x90,0xff,0x03,0x7a,0x7d,0x9e,0x2a,0xb8,0x5f,0xfa,0x5b,0x15,0xe8,0x46,0x77,0x03,0x24,0x5a,0xfd }, { 0xe0,0x11,0xed,0x04,0x6d,0x13,0x38,0x53,0x83,0xee,0x92,0x0f,0x8b,0x5f,0xb2,0xa4,0x95,0x3a,0x09,0x3f,0xdb,0xe6,0xdf,0x39,0x6f,0x9b,0xe6,0x37,0xce,0x67,0x3a,0xe1 }, { 0x7c,0x62,0x73,0x94,0xb8,0x73,0x9f,0xa5,0x66,0x96,0xe2,0xfb,0xcd,0x88,0xff,0x01,0xb5,0x86,0x72,0x0d,0x9d,0xb9,0x89,0x12,0x56,0x6d,0x89,0x2b,0x76,0x92,0xfc,0xed }, { 0xad,0x99,0xdc,0x16,0x4a,0xe1,0xd3,0xb3,0xb6,0x5b,0xc0,0xfd,0x16,0x1c,0xf2,0x33,0xb7,0x30,0x4f,0x46,0xd9,0xce,0xa3,0xc9,0xdc,0xb1,0x8b,0x23,0xb1,0x4c,0xbc,0x85 }, { 0xe4,0xa5,0x73,0x24,0x4b,0x60,0x17,0xda,0x70,0xf9,0x5d,0x7d,0xc2,0xee,0xfb,0x95,0x7e,0x79,0xe6,0x20,0x12,0x63,0xe6,0xf7,0x3c,0x5a,0x86,0x72,0x31,0xfd,0xf1,0x0f }, { 0x02,0x2e,0x00,0x61,0xee,0xe6,0xad,0x97,0x2f,0x91,0x49,0x57,0xbd,0x9e,0xe0,0x33,0x60,0xe5,0x6b,0xd2,0x4d,0x1b,0x24,0x47,0x34,0x11,0xc6,0xef,0xc3,0xd4,0x26,0x87 }, { 0xd1,0x71,0x18,0x02,0x4e,0xc1,0x09,0x35,0x39,0xf2,0xe9,0x3c,0x6a,0x34,0x4c,0x1a,0x73,0xcb,0x7e,0xf0,0xd6,0x99,0x19,0xd2,0x73,0x5e,0x0f,0x32,0xc7,0x72,0xe3,0x01 }, { 0x45,0xa8,0x04,0x56,0x0a,0xdc,0x82,0x76,0x12,0x71,0xec,0xa3,0x7d,0xac,0x5b,0xb7,0xc0,0xa9,0x5e,0x93,0xe6,0x33,0xa0,0x93,0x57,0xcc,0x1a,0xd1,0xec,0x6b,0xa7,0x4c }, { 0x7f,0x28,0x51,0x11,0x92,0x5f,0x4a,0x8f,0xdc,0xea,0xeb,0xe8,0x1a,0x0a,0xd9,0xef,0xf3,0x29,0x81,0xad,0x0e,0x5a,0x49,0xa7,0xc6,0x61,0xb8,0xf1,0x78,0x90,0x2b,0xdc }, { 0xf1,0x6a,0xb8,0xe4,0xdc,0x66,0xa2,0xb0,0xd8,0x8e,0x42,0x2b,0xed,0xc9,0xc5,0x6f,0x0a,0xf1,0xaf,0x6a,0xac,0x4a,0x12,0xcf,0xa5,0xa6,0x85,0xa3,0x69,0x94,0x0d,0xf4 }, { 0x03,0xa6,0xec,0x92,0xb9,0x64,0x24,0x18,0xda,0xfb,0x9d,0x71,0xfc,0x7f,0xd6,0x37,0x3b,0xf3,0x4e,0xb3,0x15,0xa5,0x92,0x84,0x4f,0x97,0x7e,0x8f,0xa8,0x70,0xbb,0x1c }, { 0x64,0x87,0x02,0xf5,0xa1,0x7b,0xc1,0xdb,0x1a,0xec,0x56,0x37,0x4a,0xd7,0x53,0xa0,0x2b,0xdd,0xf6,0xfa,0x19,0x0c,0xc2,0xb9,0x0b,0xc6,0xa5,0xef,0x1b,0x7b,0xb9,0x00 }, { 0xf6,0x34,0x4a,0xee,0x58,0xb7,0x6c,0xc3,0x3d,0x3c,0x2c,0x04,0xf2,0xed,0x67,0x86,0x9e,0xbc,0xda,0x0c,0xf5,0x6f,0x19,0x6a,0x3d,0xeb,0xeb,0x39,0x45,0xd6,0xee,0x02 }, { 0x90,0xf2,0xd0,0x2c,0x37,0xeb,0x57,0x62,0x4c,0xb0,0xc8,0xf2,0x84,0xc1,0x71,0xb8,0x79,0x0a,0xe5,0x6a,0xa9,0xeb,0xce,0xef,0x64,0x83,0x7e,0x26,0x26,0x5c,0x66,0x4d }, { 0xdf,0x89,0x65,0x51,0xc7,0xb4,0x33,0x62,0xc8,0xe4,0xac,0x27,0x12,0x50,0x73,0xd1,0x86,0x9c,0xbc,0xcc,0xc5,0xb6,0x1e,0x3a,0xaa,0x77,0xfd,0x4d,0xcf,0xe6,0xa7,0x16 }, { 0x00,0xe0,0xd1,0x07,0x3a,0x64,0xf0,0xd3,0xec,0x6c,0x81,0xda,0xeb,0x87,0x12,0xd0,0x3c,0x3b,0xc1,0x1c,0x07,0x42,0x1c,0x1f,0x9c,0x86,0x31,0xa2,0xf2,0x4a,0x2c,0xf8 }, { 0xbe,0xa9,0xbf,0x9d,0x58,0x2d,0x15,0x97,0xc4,0x5a,0xc1,0xb1,0x99,0xa9,0x7a,0x42,0xfb,0x4b,0xd2,0x01,0x41,0x46,0x3f,0x42,0xce,0x6f,0xb6,0xa9,0xff,0xc3,0xf2,0xde }, { 0x20,0xac,0xb3,0x3a,0x88,0xf5,0x34,0x36,0x07,0xae,0x06,0xa8,0xba,0x3e,0x78,0x7f,0xef,0xd0,0x22,0xa8,0x92,0x6f,0xce,0x5b,0xf2,0xc6,0x7a,0xdd,0xaf,0x50,0xf1,0x6e }, { 0x49,0x8b,0xfe,0x18,0x3e,0xd5,0xf9,0xa9,0x26,0x4e,0xb6,0xb3,0x03,0xd8,0x04,0x57,0x99,0xd1,0x94,0x17,0x3d,0x7a,0x29,0x3c,0xd8,0x38,0x53,0x43,0x0f,0xe3,0xe7,0xa9 }, { 0x1f,0xfc,0x79,0x45,0xd2,0x44,0x39,0x97,0x89,0x4c,0x8e,0x4d,0xad,0x3f,0xbd,0x02,0x9e,0x9d,0x46,0x06,0x34,0x4b,0xa3,0x89,0x0f,0xd3,0xb7,0xc3,0xb6,0x6a,0xbf,0x27 }, { 0x85,0x0b,0xb7,0x2c,0x10,0x1a,0xce,0x8f,0xc4,0xc9,0x4f,0x90,0x64,0x8b,0x92,0x5f,0xb7,0xa1,0x5f,0xf7,0xbe,0xa6,0xe3,0x9f,0x23,0x8f,0x0d,0x8d,0xda,0x0d,0x87,0xa1 }, { 0xa3,0x25,0xa6,0x27,0x0f,0x0c,0x33,0x49,0x1f,0x5f,0x28,0xa3,0xbb,0xbd,0xbb,0x7a,0x04,0x7d,0x8d,0x30,0xbc,0x1b,0xe6,0xca,0x64,0xb3,0x1d,0x1d,0xab,0xda,0x46,0x26 }, { 0xb3,0x01,0xf6,0x2d,0xe2,0xb0,0xd4,0x6d,0xa9,0x1a,0x88,0x80,0x83,0xa2,0x0a,0x9d,0x7f,0x27,0xb9,0x8e,0xe9,0x63,0xf0,0xdf,0xc1,0xd4,0x4f,0xba,0x07,0x2c,0x48,0xd1 }, { 0x12,0x74,0xfa,0x20,0x41,0x30,0x47,0xe5,0x3a,0x09,0x42,0x71,0x7e,0xa6,0xea,0x77,0x17,0xb7,0x3f,0xe8,0x99,0xad,0xca,0xff,0x12,0x36,0x5e,0xc2,0xca,0xca,0xf6,0x1b }, { 0xb2,0xa9,0xb4,0x09,0xdb,0xc9,0xd3,0xd0,0xf4,0x96,0x7f,0x93,0x48,0x4d,0x73,0x3b,0x3a,0xc0,0x9f,0xc8,0x3e,0x8f,0x9a,0xe0,0x9a,0xe2,0x80,0xd0,0xd9,0xb4,0xfa,0x62 }, { 0xa6,0x50,0x67,0xf6,0xc1,0xcd,0x06,0xaa,0x2a,0x6b,0xce,0x1d,0xd6,0x0a,0xa1,0x98,0x63,0x8a,0xda,0x5a,0x18,0x9f,0xc0,0x6d,0xfa,0xfb,0xf5,0x5b,0xbb,0x3e,0x62,0xa9 }, { 0x39,0xe4,0x98,0x90,0x9f,0xa6,0x18,0x58,0x4e,0x28,0x54,0x53,0x15,0x35,0x72,0x87,0x48,0xd4,0x4f,0xe7,0x90,0x51,0x90,0x61,0x76,0x56,0x8f,0x34,0x6b,0x4a,0x24,0x90 }, { 0x7a,0xe7,0xa2,0xca,0xa7,0x58,0x9c,0x85,0xbc,0x16,0x3a,0x0c,0xff,0x51,0x9c,0xf3,0x5d,0x18,0x62,0xc1,0x9a,0x98,0xd0,0x6c,0x3a,0x70,0xca,0x6b,0x95,0xdf,0xed,0x24 }, { 0xad,0x77,0xc9,0x4a,0xd1,0xa1,0x2d,0x32,0xc2,0xd0,0x57,0x24,0x27,0x9a,0x8e,0x03,0x0a,0x17,0x0c,0x84,0x33,0x5b,0xd5,0xff,0x59,0x59,0x88,0xf0,0xcf,0xbb,0xed,0x35 }, { 0x25,0x59,0x7a,0xd8,0x5b,0x30,0x7a,0xf1,0xa6,0xea,0x07,0x51,0xc4,0xe4,0x21,0xd0,0x8a,0x28,0xea,0x9b,0xa3,0xb1,0x1f,0x76,0x24,0x67,0xb1,0x38,0x23,0xdb,0x2e,0xdf }, { 0x6d,0x08,0xc6,0xc5,0x19,0x2a,0x70,0xe4,0x3b,0xa0,0xe7,0x3b,0x2b,0x46,0xcc,0x3a,0xf2,0xd7,0x78,0x6a,0x4d,0x82,0x03,0x97,0x76,0x25,0x2d,0x93,0x1a,0xbe,0x9b,0x0f }, { 0x5f,0x2b,0x93,0x9a,0x6b,0x30,0xf2,0xe5,0x94,0xf7,0x8e,0xb9,0xc4,0x82,0x45,0xbe,0x3a,0xa5,0x08,0xb1,0xf3,0xc2,0x19,0x49,0xe4,0x13,0xfb,0x03,0x1d,0xac,0x54,0x64 }, { 0x31,0xc7,0x52,0x7f,0x03,0x66,0x8d,0x71,0x30,0x6b,0xe4,0x45,0xe0,0x83,0xe8,0x70,0xa9,0x47,0xba,0xb4,0x69,0x56,0xa3,0x56,0xe1,0x6b,0x22,0xa8,0xf4,0x11,0xed,0x1d }, { 0x21,0x23,0x6e,0xc7,0xe5,0xe7,0x86,0xd5,0x23,0xca,0x35,0xef,0x00,0x46,0x1e,0xa8,0xfb,0x80,0x8e,0x96,0xbb,0xcc,0xbd,0xc7,0x22,0x20,0xb3,0x59,0x1b,0xbb,0x81,0xcc }, { 0x86,0x54,0xcd,0x55,0x11,0x49,0x83,0x8d,0x37,0xd2,0x16,0x1b,0xfc,0x34,0xc9,0x01,0x17,0x1f,0x33,0x65,0x86,0xe7,0xb5,0x99,0x48,0x0e,0xe8,0x05,0x8f,0x61,0xb8,0x60 }, { 0x37,0x48,0x08,0x8f,0xb5,0x86,0x1f,0xb0,0x0c,0xf9,0xff,0x0d,0x26,0xbc,0xbf,0x4b,0x79,0xfa,0xfb,0xfa,0x5a,0x28,0x14,0x75,0x90,0x4d,0x80,0x64,0x06,0x2f,0x3b,0xa7 }, { 0x7e,0x5d,0x32,0x2a,0xdf,0x11,0xc5,0x12,0xe1,0xbb,0xea,0x65,0xa9,0x02,0x9c,0x5c,0x89,0x64,0x33,0x9c,0xfa,0x68,0xc8,0x6d,0x68,0xa4,0x1b,0x2f,0x50,0x9f,0xe8,0x4c }, { 0x01,0x03,0xd1,0xa9,0xc7,0x2f,0xab,0x1e,0x7a,0x17,0xa0,0x94,0xca,0x55,0x33,0x3b,0x1f,0x97,0xee,0xff,0x1e,0x3c,0xd6,0x6f,0x2f,0xd9,0x72,0xf9,0xd8,0x25,0x26,0x55 }, { 0x9c,0xa7,0x7b,0xd4,0x2b,0x60,0x99,0xe3,0x81,0xb8,0x8d,0x80,0x07,0xe8,0x24,0x99,0x20,0x98,0x7b,0x54,0x11,0x32,0x6e,0x5f,0x53,0xf0,0xab,0x89,0xc8,0xd3,0x21,0x8c }, { 0x3f,0xb9,0xc3,0x85,0x36,0x75,0xe8,0xa8,0xec,0x41,0xc2,0x70,0x5c,0x8c,0xb7,0x23,0xed,0xc3,0x52,0x35,0x3a,0xd6,0xae,0x36,0x54,0xe6,0x9e,0x90,0x91,0x9b,0xa2,0xfa }, { 0x59,0xf4,0x4a,0x48,0x78,0xa1,0x7f,0x23,0xfa,0x38,0x91,0x19,0xb7,0xef,0xaa,0x47,0x8c,0x8f,0xd4,0x9b,0xe0,0x0b,0x40,0xb5,0x1f,0x32,0x47,0x4f,0x93,0xf6,0x4d,0x14 }, { 0x5d,0x4c,0x3e,0x8a,0xc9,0x97,0x79,0x7e,0x36,0xdb,0xd5,0x7c,0x3f,0x5e,0xf7,0x2f,0x35,0x2b,0xf9,0x6f,0xe4,0xa1,0xc3,0x97,0xfd,0xdf,0xee,0xcd,0xcf,0x8e,0xf2,0x0b }, { 0x64,0x0e,0x94,0xcb,0x92,0xa7,0xde,0xd2,0x64,0xb6,0x95,0x2b,0x06,0xf0,0x73,0x62,0xc6,0x95,0xeb,0x87,0x3c,0xe5,0xe8,0x0d,0xb1,0x20,0xd8,0xfc,0x7d,0x1a,0x2f,0x44 }, { 0xb1,0x70,0x3f,0xe3,0xcf,0xd4,0xdb,0x24,0xd0,0xf7,0x94,0x66,0x87,0x5b,0x8c,0xc8,0x3c,0x03,0xd0,0x5f,0xf4,0xc9,0x82,0x7b,0xc1,0x4c,0x44,0xf7,0xdf,0x33,0x22,0x83 }, { 0x10,0x2e,0x63,0x19,0x66,0xe0,0x54,0xf6,0x19,0xf1,0x79,0xa3,0xd6,0x90,0xcb,0xca,0x81,0x5d,0x9b,0x7d,0x68,0x33,0x06,0x5c,0xdc,0x63,0xfc,0xb8,0x48,0x60,0x5e,0x73 }, { 0xe6,0xe8,0x98,0x07,0x80,0x27,0x26,0x45,0x07,0x3c,0x91,0x03,0x0e,0x28,0xaf,0xaa,0x52,0xbc,0x67,0xb4,0xdb,0xbe,0x4f,0xbd,0x8b,0x70,0x38,0x82,0x14,0x18,0x5c,0x35 }, { 0x65,0xf2,0xa8,0x3e,0x5f,0x71,0xdd,0x07,0xd7,0xd0,0x18,0x0e,0xb8,0x1c,0xff,0x5e,0x3f,0xe8,0x1d,0x68,0xf5,0x9d,0x55,0x30,0x3d,0x45,0x9d,0x82,0x89,0xe9,0x7b,0x8f }, { 0xaa,0x2b,0xcb,0xa0,0x45,0x53,0x6e,0x9f,0x8a,0x9e,0xca,0x6e,0xc0,0x85,0x14,0x91,0xbc,0x55,0xa5,0x7b,0x25,0xa7,0xf1,0x88,0xd7,0x60,0x39,0x41,0x4c,0x7f,0xf8,0x2e }, { 0x7a,0x5c,0x88,0xae,0xb2,0xb8,0x5a,0x9f,0x23,0x77,0x07,0xf7,0xf3,0x34,0x77,0x20,0xec,0x5e,0x94,0xf0,0x0f,0x34,0x7c,0x58,0x80,0x49,0xb3,0x14,0xe5,0x37,0xff,0xbe }, { 0x36,0xa3,0xff,0x74,0xde,0x41,0x9a,0xc9,0x5b,0x11,0x88,0xff,0xfd,0x78,0x7a,0x48,0x3c,0x3a,0x5c,0x24,0xbf,0x25,0xcb,0x32,0x9e,0x93,0x7a,0x58,0x35,0xb3,0x0d,0xae }, { 0x3c,0xba,0x17,0xb5,0x1d,0xa7,0x43,0x61,0x71,0x0c,0xdb,0x11,0x02,0x69,0xaa,0x8c,0xab,0x86,0x04,0x82,0xc4,0xdb,0x7a,0x9a,0x96,0xfb,0xb8,0xc5,0x10,0x6e,0x9b,0x60 }, { 0x68,0xdc,0xbc,0xee,0x8f,0x9d,0xe4,0xbb,0xd5,0x99,0x7b,0x29,0xa9,0x52,0x58,0x5a,0x78,0x70,0xa9,0x89,0x3d,0x5c,0x6c,0x44,0xcd,0x30,0x2a,0x1e,0x70,0xf0,0xfc,0x37 }, { 0xf6,0x7f,0x1f,0x54,0x76,0x33,0x0d,0xbf,0x03,0xc2,0xc3,0x0e,0xfb,0xbf,0xd9,0xe8,0x02,0xb9,0xb6,0xad,0x53,0x59,0x69,0xff,0x76,0xf3,0xb6,0x0f,0x42,0xad,0x2a,0xf2 }, { 0x00,0xa9,0x42,0x7c,0xbd,0xe1,0x4b,0x13,0xd5,0x5d,0x31,0x88,0x99,0xc6,0xa8,0x5d,0x43,0x57,0xb2,0xed,0xdd,0x62,0x15,0xf7,0xc9,0x4f,0x6f,0x09,0x6a,0xb1,0xf3,0x17 }, { 0x5a,0xeb,0x28,0x4e,0x33,0xaa,0x10,0x25,0x74,0x9a,0xe1,0xc3,0x29,0xa8,0x73,0x8b,0x3d,0x47,0x32,0xac,0x2d,0x9c,0xa0,0xb5,0xaa,0x7b,0x64,0x34,0xe2,0xfc,0xda,0xe1 }, { 0x4b,0x14,0x24,0x0a,0x46,0x84,0xac,0x8d,0x83,0xb8,0x2f,0xd0,0xa0,0x32,0xc5,0x83,0x87,0x1a,0x68,0x3b,0xe7,0xcd,0xe0,0x95,0x0c,0x8c,0xd2,0xff,0xba,0xc0,0x35,0xce }, { 0xd8,0x0b,0x4e,0x35,0x65,0x63,0xa9,0x50,0xb5,0xbd,0xfc,0x23,0x3f,0xe1,0xf5,0xc4,0x60,0xd6,0x78,0x3d,0xae,0xd8,0x7a,0x6c,0xf6,0x7e,0x04,0x36,0xca,0xb5,0xcc,0x08 }, { 0xba,0x78,0xd9,0x71,0xef,0x76,0x0b,0x5e,0x81,0xa1,0x03,0x0f,0x88,0xbb,0x35,0x36,0xc0,0x4f,0xc9,0x61,0xba,0xb7,0x8e,0xb8,0x3e,0xcb,0x6a,0x45,0x83,0x30,0xea,0x54 }, { 0x21,0x64,0xc1,0x50,0x3e,0x32,0xac,0xeb,0xe1,0xff,0xa0,0x3b,0x75,0x5a,0xf6,0x70,0xae,0x8e,0x8e,0xd6,0x42,0x3a,0x7a,0x91,0xbf,0xb2,0x30,0x86,0x87,0x25,0xb8,0x75 }, { 0x55,0x9c,0x58,0xea,0x8c,0x85,0x57,0x7c,0x4b,0xab,0xd5,0xec,0x85,0x60,0x8e,0x56,0x63,0x2c,0x12,0x97,0x8d,0x8e,0xb2,0xa2,0x04,0xc1,0x45,0xee,0x6a,0x44,0x1c,0xcc }, { 0x13,0xf2,0x14,0xd7,0x1c,0xac,0x94,0x35,0xf4,0xbd,0xcc,0xa3,0xac,0x5c,0x11,0x74,0x35,0x86,0x2d,0xfe,0x5d,0xc9,0x5d,0xbe,0x2b,0xf4,0x0e,0x60,0x36,0x13,0x9a,0x2a }, { 0xb3,0x6c,0xf6,0x64,0x8d,0x13,0x88,0x06,0x4d,0xfc,0xad,0xee,0x77,0x1c,0x24,0x73,0x5d,0x4f,0xd2,0x63,0xf0,0x8f,0xf8,0x5a,0xcb,0x95,0x7b,0x99,0x30,0xb3,0xd5,0x71 }, { 0x8c,0xf0,0xbc,0x82,0x36,0x27,0xdf,0x6b,0x82,0x1e,0xd6,0x14,0xf8,0xce,0xf0,0x73,0x64,0x24,0xf4,0x04,0xf7,0x46,0x91,0x9b,0xa6,0x57,0x4f,0x06,0x2c,0xa3,0x5b,0xb9 }, { 0xe3,0x6e,0xbe,0xa2,0xba,0x51,0xa7,0x95,0xc6,0xf1,0x9c,0xb5,0xfe,0x8b,0x6d,0x8b,0x34,0x5e,0x83,0x67,0x07,0xef,0x13,0xb6,0x54,0xd8,0x82,0x54,0xb0,0xcd,0xb6,0x9d }, { 0x1d,0xe9,0x97,0x8b,0x4d,0xb6,0x91,0x1c,0x56,0xdd,0xfa,0x33,0x94,0xff,0x5c,0xdd,0x73,0x94,0x2d,0x98,0x9f,0x93,0xbb,0xf6,0x2f,0x71,0x64,0xdc,0x4e,0x2d,0x4b,0xfc }, { 0xbe,0xee,0xc0,0x6a,0xc6,0x88,0x38,0x65,0xa9,0x7f,0xce,0x33,0x9f,0x99,0x0c,0x5c,0x4d,0x97,0x1a,0x4a,0xe4,0xc0,0x32,0xbc,0xf8,0xa6,0xbd,0x11,0x9a,0x6f,0x6f,0xf3 }, { 0x45,0x40,0x45,0x1d,0x12,0x1e,0x50,0x33,0x30,0x3a,0x94,0x8c,0xb7,0x51,0x98,0x1e,0x6d,0x70,0x53,0xea,0x71,0x32,0x56,0x02,0x2b,0xe0,0x82,0x54,0x72,0x0d,0x74,0x4e }, { 0x97,0x66,0x38,0x8e,0x4d,0x4e,0xca,0xe9,0x15,0x26,0xda,0x96,0xef,0x4a,0x2c,0x5e,0x77,0xaf,0x02,0xb8,0xcc,0x9f,0xd0,0x96,0x8f,0x1b,0x4a,0x69,0xb8,0xd7,0x36,0x11 }, { 0x9b,0xcd,0x2b,0x9a,0x67,0x7c,0x34,0x21,0x12,0xbb,0xce,0x4b,0xd2,0xda,0x1d,0x82,0xf3,0x73,0x21,0x86,0x39,0x28,0xbf,0x04,0x28,0x53,0x5d,0x05,0xaf,0xfd,0xf9,0x17 }, { 0x21,0x4f,0xf0,0x74,0x1c,0xfc,0x1a,0x68,0x2a,0xd5,0x52,0xfa,0x18,0xa9,0xa0,0x7c,0x89,0x87,0x23,0xd6,0xa4,0x3d,0x17,0x97,0x83,0x34,0xf4,0x26,0xc3,0x56,0xfd,0x9f }, { 0x2c,0x77,0x46,0x03,0x10,0xd4,0x3a,0x6d,0x46,0xa6,0x5f,0x16,0x0d,0x3e,0x6e,0xaa,0x2e,0x69,0x40,0xc8,0x2d,0x4d,0x53,0xd5,0x17,0x8e,0x48,0xcf,0x6a,0xbd,0x38,0xcc }, { 0xf2,0x4c,0x4c,0x1b,0x70,0xb0,0x29,0xec,0x2c,0x89,0x0b,0xc9,0xa1,0x2c,0x1c,0xfb,0x15,0x57,0xc8,0xf4,0xf8,0x96,0xfc,0xbf,0xb3,0x38,0x4b,0x62,0xdb,0xc8,0x47,0x6f }, { 0x00,0x50,0xb8,0x65,0x75,0x66,0xac,0x6c,0xfb,0x15,0x95,0xbb,0x11,0x35,0xa4,0x6b,0x1a,0xbd,0x4f,0x01,0x49,0x8d,0x72,0x03,0x6b,0xb4,0xaa,0x0e,0x47,0x55,0x10,0x14 }, { 0xee,0xcd,0xb5,0x17,0x5f,0xc8,0x9b,0x0d,0xce,0x1f,0xb0,0x96,0xf5,0x88,0x98,0x1c,0x23,0x6c,0x7e,0x27,0xa0,0x4a,0xc7,0x22,0x0b,0x4f,0x3b,0x2b,0x60,0xe1,0xd0,0xd2 }, { 0x33,0xac,0x46,0x7c,0x0d,0x6a,0x9c,0x4b,0x8a,0x8e,0x32,0xed,0x9a,0x96,0x3a,0x7d,0xe1,0x13,0xae,0x29,0xa6,0x66,0xc1,0xbd,0x9a,0x0b,0xde,0x76,0xbd,0xc3,0x77,0x31 }, { 0x08,0x68,0x49,0x2e,0xee,0x33,0x81,0x81,0xf2,0xfa,0xa1,0x9d,0xad,0x67,0xaf,0x34,0x82,0xae,0x69,0x99,0xd0,0xce,0xbc,0x91,0x10,0x42,0x5d,0x61,0xb4,0x08,0x6a,0xe1 }, { 0x5f,0x6a,0xab,0xf1,0xc0,0xba,0x50,0x9a,0xad,0xdb,0x08,0xa1,0x65,0x14,0x70,0x95,0x9d,0x1c,0xe6,0x5f,0x78,0x1d,0x4a,0x37,0xf1,0xa7,0xda,0x29,0xa9,0xb1,0xf8,0x60 }, { 0x58,0x15,0x2f,0x42,0x93,0xdf,0x87,0x10,0x15,0xda,0xa9,0x92,0x8d,0x45,0x8c,0xd3,0xbb,0x01,0x15,0x1f,0x2b,0x27,0x21,0xd5,0x76,0x53,0x28,0x04,0x60,0x75,0x92,0xd6 }, { 0xbc,0x30,0x33,0xbd,0x26,0x83,0x75,0xee,0x48,0x97,0x53,0x89,0xff,0xb7,0x0f,0x11,0x9a,0xd4,0xc3,0xce,0x76,0xb0,0x4e,0x50,0x47,0xd3,0x76,0xf7,0x59,0xec,0xf0,0x1d }, { 0x52,0x6c,0xd7,0x12,0x48,0xda,0xf5,0x46,0x89,0xf6,0xe2,0x4f,0xd2,0x99,0x3e,0xa4,0x87,0xa7,0x52,0x1d,0x36,0x73,0x7b,0x67,0x28,0x4b,0x34,0xdc,0x75,0x72,0xf8,0x1c }, { 0xf3,0xb8,0xcf,0xac,0x57,0x62,0x86,0x3d,0xde,0x46,0x26,0xbe,0xb0,0x0b,0x65,0xa4,0xf6,0xf3,0x19,0x05,0xad,0x35,0xb4,0xa9,0x79,0x25,0xcf,0xb1,0x6b,0x1c,0x48,0x1c }, { 0x1c,0x76,0x59,0x01,0x9f,0xca,0x7b,0x15,0x16,0xc2,0x87,0xd1,0xf9,0xea,0xcb,0x6d,0x5f,0x5c,0x9f,0xa6,0xe9,0x6e,0xe9,0x57,0xfb,0xb4,0xc0,0x8e,0x8e,0x93,0xa2,0xbd }, { 0xfa,0x67,0x40,0xf6,0x42,0xfa,0x94,0x1f,0xab,0xe2,0xda,0x17,0x59,0x78,0x0e,0x80,0x64,0x6c,0xb4,0xcd,0xc3,0x68,0xbe,0xab,0xbf,0x91,0xc1,0xbb,0xce,0xed,0x47,0x61 }, { 0xe4,0xf4,0xf6,0xc8,0xe1,0xc5,0xdd,0x00,0x4c,0x23,0x9c,0x17,0x4e,0xd0,0xc1,0xba,0xe8,0xf3,0x1a,0x76,0x38,0x3e,0x13,0xc3,0x9d,0xc5,0x89,0x6a,0xfa,0x5e,0xc4,0xcd }, { 0x37,0xfc,0x76,0x83,0x20,0xb8,0x06,0xbb,0x75,0x2f,0x97,0x95,0x1a,0x93,0x8a,0x01,0xd2,0xe6,0x40,0x04,0xdf,0x3a,0xeb,0xf2,0x1b,0xed,0x79,0x59,0xbe,0xbf,0x4f,0x0d }, { 0x2a,0x51,0x7f,0x17,0xc4,0xad,0x0b,0xc6,0xb4,0xaa,0x88,0x1a,0x3f,0x4e,0xb5,0xc0,0xb8,0x59,0x2a,0x09,0x59,0x93,0x01,0xc2,0x2f,0xae,0xf1,0x44,0x89,0x61,0xa5,0x1b }, { 0x29,0x64,0xb5,0xf9,0x2f,0x3d,0x21,0x2e,0x4f,0x56,0x75,0x87,0x07,0x4b,0xd9,0xd1,0x95,0x03,0xb4,0x73,0xcb,0xcc,0x68,0xe1,0x18,0x1e,0x6d,0xae,0x92,0x62,0xf7,0x32 }, { 0x0a,0x95,0x52,0x88,0x6e,0x7d,0xbd,0xdc,0x4f,0x4f,0x96,0xc5,0x8f,0xb0,0x64,0xda,0x7c,0xd4,0x5a,0x84,0x2c,0xf0,0xf3,0x1c,0x91,0xba,0x0e,0x70,0xf7,0xc4,0x47,0xef }, { 0x8c,0x92,0xb8,0x21,0x23,0x4b,0x94,0x67,0x0d,0xaf,0xbf,0x12,0x50,0xb0,0xea,0xdc,0x0c,0x95,0x00,0x4f,0xa2,0x18,0x76,0xd4,0xdf,0xb5,0xfa,0x29,0xf9,0x97,0xf2,0xfc }, { 0x30,0x9c,0x79,0xb7,0xa0,0xa6,0x50,0x1f,0xc3,0x8b,0x35,0x16,0x54,0xef,0x3b,0xb6,0xab,0xcc,0x2b,0xd3,0x8c,0x0f,0x2b,0x71,0x33,0x7c,0x58,0x76,0x8f,0x05,0x14,0x91 }, { 0x4a,0xf4,0x8d,0x6e,0xab,0xb8,0x77,0x21,0x65,0xc2,0x65,0x63,0xec,0xc1,0x21,0x95,0x62,0xa7,0xd6,0x45,0xd6,0x8b,0xcb,0x6f,0xb1,0x1e,0x9f,0xd3,0xfe,0xcb,0x64,0xec }, { 0x45,0x2d,0x95,0x8f,0x35,0xea,0xc9,0x39,0x9c,0xec,0x0e,0xea,0x0d,0xf4,0xab,0x7e,0x25,0x81,0x51,0xb2,0x3b,0x52,0x4d,0x73,0xb0,0x7a,0xe4,0x48,0x6a,0xc4,0x4d,0x7d }, { 0x62,0x0e,0x7b,0x5a,0xca,0xd7,0x6a,0x6b,0xd1,0x51,0x69,0x1f,0xca,0xca,0x19,0x87,0x38,0x8c,0xbb,0x7d,0x03,0xcf,0x18,0xff,0x58,0xb7,0xae,0x23,0x71,0xe2,0x8d,0x14 }, { 0xbb,0xb2,0xf0,0x48,0x12,0x4e,0xde,0x35,0x9d,0x3a,0x70,0x1c,0x3a,0x60,0x9c,0xe9,0x10,0xae,0x1e,0xf7,0x5b,0xea,0xd8,0xb2,0xff,0x34,0xae,0x49,0x23,0x2a,0xd5,0x75 }, { 0x64,0x27,0x1f,0xe0,0x8d,0x0a,0x94,0xb4,0x7f,0xad,0xfd,0x88,0x2a,0xe3,0x8e,0x32,0xcf,0x1c,0xd8,0x50,0xa3,0x2d,0x83,0x4e,0x79,0x81,0xa9,0x2a,0x63,0xbf,0x32,0xb6 }, { 0x67,0x36,0x33,0xcc,0xb1,0xf1,0x91,0x09,0x97,0x9f,0x9c,0xe3,0x14,0x7d,0x2b,0x20,0x6f,0xb8,0x2f,0x10,0x6e,0x8d,0x09,0xb0,0xe0,0x5d,0xde,0xb1,0xab,0x63,0x43,0x68 }, { 0x44,0xd2,0x0b,0xc9,0x98,0xee,0x07,0xdd,0x7f,0x66,0x87,0xd1,0xaf,0x9d,0x1b,0xa6,0x26,0x8e,0x53,0x5d,0x5b,0x8d,0x90,0x8d,0xbb,0xff,0x7b,0xf0,0x46,0x64,0xbb,0x4d }, { 0x65,0x40,0x81,0x85,0xc4,0xc0,0xde,0x27,0x99,0x26,0x35,0x5a,0x2f,0x4e,0xd4,0x45,0x90,0xfe,0x70,0xea,0xbc,0x41,0x3a,0x54,0xba,0x13,0x11,0x89,0x1f,0xc1,0xf8,0x5d }, { 0x86,0xf0,0x9c,0xf2,0x29,0xa9,0xb3,0x00,0xe6,0x24,0x3f,0x51,0x25,0x2e,0x62,0x6a,0xcf,0x2e,0x3a,0x30,0xbd,0x34,0x42,0xcf,0x4e,0xff,0xe8,0x2b,0xfc,0x3c,0x71,0xa3 }, { 0x36,0x75,0x35,0x7f,0x0d,0x7b,0x56,0x06,0x7d,0xf3,0xa9,0xf2,0x14,0x37,0x46,0x18,0x1b,0x7f,0x70,0x5c,0x3a,0x27,0x35,0x32,0xae,0xad,0x82,0x06,0x97,0x5c,0x17,0xfa }, { 0xd0,0xb9,0xfa,0xfe,0x16,0xb4,0xac,0xa5,0x79,0x55,0x45,0x6b,0x1c,0x8f,0xe3,0x3b,0xee,0x39,0xaa,0xf3,0x6a,0x9e,0x25,0x2b,0x98,0x86,0xf8,0xf3,0x61,0x57,0x94,0x4c }, { 0x68,0x78,0x7d,0xd9,0xd7,0x11,0x06,0x42,0x69,0x00,0xda,0x20,0x30,0xf8,0x57,0x7c,0xa6,0xeb,0x82,0xa7,0x76,0x9e,0xac,0x9d,0x1a,0x2a,0x3d,0x2d,0x73,0x0d,0x3f,0x80 }, { 0x41,0xee,0x6e,0x9d,0x12,0xc4,0xf4,0x98,0x17,0x60,0x3c,0x7d,0xad,0xe5,0xe6,0x84,0x1a,0xa9,0x33,0x09,0x89,0x25,0xe5,0xf7,0x1d,0x73,0x4d,0x10,0xad,0x92,0xbd,0x61 }, { 0x72,0xf3,0xb1,0xc5,0xf8,0x45,0xa6,0x56,0x7c,0x89,0x50,0x4e,0x1a,0x12,0x88,0x8e,0xb6,0xa3,0x24,0x4c,0xa4,0x80,0x2c,0xa3,0x86,0xe4,0x58,0xe9,0x82,0xf7,0x25,0xdc }, { 0x2b,0x19,0xe1,0xbb,0x36,0x60,0xe4,0xb3,0x89,0xc9,0xc2,0x74,0xeb,0x3e,0xc0,0xb1,0x84,0xa9,0xab,0xa5,0x88,0x4f,0x4e,0xf6,0x57,0x63,0x2d,0xd8,0x9d,0xda,0x4c,0x4d }, { 0x9f,0x8f,0xd7,0x4e,0x6c,0xba,0xcc,0x20,0xd1,0x35,0x7e,0x14,0xac,0xf4,0x6e,0xb9,0xdc,0x11,0x52,0x35,0xef,0x0d,0x4d,0x51,0xa3,0xe3,0xc5,0xb1,0xe2,0x31,0x3a,0x8c }, { 0xb6,0xc8,0x67,0xf6,0x5e,0xc8,0x18,0x0c,0xc1,0xcc,0xa1,0x1f,0x76,0x72,0x22,0x25,0x60,0xcc,0x87,0xc8,0x18,0x1f,0xd9,0xce,0x7f,0x0f,0x7f,0x6b,0x80,0x33,0xfd,0x60 }, { 0xd5,0xb6,0x6e,0xf1,0xf5,0xf2,0x25,0x25,0xef,0x77,0x1f,0x20,0x47,0x6f,0x63,0x0e,0xb4,0x27,0x1c,0xff,0x53,0x9a,0x47,0xee,0x8c,0x0d,0x81,0x35,0x4b,0x7d,0x2f,0xe9 }, { 0x84,0x98,0x75,0xd1,0x89,0xc5,0x13,0xe4,0x89,0xb6,0x7c,0x72,0xff,0xe8,0xfc,0xd1,0x74,0xa3,0x83,0xf9,0xc3,0x29,0x2a,0xff,0x50,0xfc,0x0c,0x06,0x85,0x13,0x30,0xa1 }, { 0xe3,0x11,0x05,0x4c,0x48,0xeb,0xca,0x1f,0x79,0xe7,0x81,0x1c,0x1d,0x0a,0x45,0xbb,0x9d,0x1c,0x33,0xfd,0x13,0xe5,0x3a,0x4d,0xe1,0xeb,0x76,0xcc,0xc6,0x11,0x93,0xa3 }, { 0xe3,0x5d,0xb7,0x48,0x3e,0x20,0xce,0xfe,0x75,0x36,0xe6,0x4e,0xea,0x60,0xbd,0x5b,0x93,0x3b,0xcd,0x20,0xc5,0xd1,0xed,0x53,0x4c,0x86,0x2b,0xdf,0xea,0x56,0xf3,0xbd }, { 0xb1,0xf8,0x04,0xda,0xbc,0x68,0x27,0x4c,0x12,0x33,0x99,0x5c,0x5a,0x91,0x19,0xb5,0x69,0x35,0xbc,0xdd,0x83,0xb7,0xde,0x07,0xec,0x72,0x6d,0xce,0xdc,0x4e,0x9c,0xe7 }, { 0x50,0xab,0x35,0x39,0x7c,0x4f,0xcd,0xf6,0xc6,0x57,0x9b,0x61,0x20,0x43,0xbf,0xa5,0x8f,0x5d,0xa9,0x1f,0xf2,0x54,0xbc,0x82,0xea,0x09,0x8b,0xf8,0x20,0x73,0x88,0xcf }, { 0x6a,0x0f,0x6a,0x28,0x3a,0x8e,0x4e,0x86,0xd2,0xa3,0xd6,0x0e,0xf9,0xe3,0x7e,0xc3,0x3f,0x2a,0xb6,0x07,0x1a,0x30,0xe0,0xa4,0x77,0x73,0x51,0x28,0xe7,0x57,0x1e,0xb0 }, { 0xdd,0x6b,0x8f,0xb4,0x46,0xd0,0x2d,0x1e,0xc0,0x14,0xc2,0x01,0x11,0xec,0xbe,0xae,0xfc,0xad,0xf8,0xc8,0x5d,0xbd,0xab,0xbd,0x23,0xdf,0x19,0x14,0x32,0xdb,0x5d,0x59 }, { 0xd1,0xf8,0x7d,0x98,0x5a,0xde,0xe0,0xc3,0x46,0x6a,0xc0,0x45,0x87,0x45,0x99,0x8f,0xc0,0xf3,0x9a,0x98,0x84,0x89,0x7c,0xe4,0xc7,0x54,0x8d,0x1d,0xb8,0xe1,0x06,0x42 }, { 0x38,0x49,0xbf,0x20,0xa8,0xdd,0xdc,0x80,0x22,0x10,0xfc,0x7e,0xe8,0xf4,0x0d,0x53,0x25,0xf9,0x02,0x94,0xca,0x83,0x01,0xf5,0x00,0x4f,0xc7,0x8c,0xef,0xdd,0x04,0x25 }, { 0xdf,0x1c,0x5b,0x4a,0x92,0x9b,0x53,0xf9,0x32,0xe0,0x25,0xdf,0xff,0x4e,0x62,0x23,0x2e,0x1b,0x8f,0x82,0x4c,0x68,0xa8,0xcb,0xd6,0x2b,0x05,0x86,0x2c,0xae,0x19,0x57 }, { 0xae,0x03,0x31,0x4b,0xf2,0xfa,0x5f,0x70,0x0a,0x5f,0x57,0x4e,0x4a,0x4a,0x4f,0x37,0xe2,0x88,0xd6,0xba,0xa7,0xb1,0x1c,0x1b,0xf4,0x2e,0xcb,0xbd,0x42,0x9d,0x0d,0x5e }, { 0x31,0x56,0xfa,0xe0,0x8e,0x41,0x2d,0x21,0x42,0xe1,0x51,0x47,0xda,0xb5,0x63,0x58,0xdd,0x25,0x1b,0x7d,0xa8,0x08,0x11,0x8a,0xc1,0x7c,0xcb,0x07,0xc5,0x39,0xb2,0x8e }, { 0xa8,0x87,0x4e,0xbf,0xb7,0x88,0x55,0xe3,0xa3,0x54,0x2b,0x67,0x66,0x73,0x17,0x6c,0xf3,0x86,0x7f,0x08,0x5a,0x2a,0x17,0xff,0x40,0x98,0x2c,0x12,0x9c,0x62,0xb4,0x13 }, { 0xe3,0xaa,0xdb,0x7d,0xea,0x40,0xd2,0x5b,0xbb,0xba,0xec,0x41,0x40,0xbf,0xb7,0xba,0xd2,0x96,0x3f,0x87,0x48,0xd3,0x61,0xce,0x7b,0xbb,0xd1,0x1a,0xcb,0xa0,0x9d,0x54 }, { 0x62,0x47,0x88,0x0b,0xff,0x0e,0x29,0x4d,0x09,0x43,0x05,0x6f,0x10,0x70,0x85,0x46,0x92,0xec,0x92,0x7b,0x72,0x41,0x7d,0x12,0x7c,0x2b,0xea,0x60,0xa3,0xba,0xcf,0x1f }, { 0x1a,0xa9,0x05,0xfa,0xe6,0xbb,0xdf,0xfc,0x27,0x6b,0x6f,0x6a,0xb7,0x8a,0x57,0xd3,0x27,0x93,0x42,0x6d,0x06,0x66,0x8b,0x13,0x7b,0x45,0xdc,0xed,0x49,0x5d,0x71,0x20 }, { 0x99,0xbc,0x88,0x21,0xd6,0xc0,0xa1,0x5f,0x42,0x15,0x72,0xb3,0xa6,0xe9,0x49,0xc0,0xdf,0xc3,0x80,0x78,0x29,0x4a,0xea,0xb2,0xfe,0xa0,0xc3,0x1d,0x92,0xf0,0xc4,0x8c }, { 0x65,0xd5,0x5a,0x45,0x8d,0x78,0x94,0x20,0xc3,0xae,0xa4,0x8b,0x19,0x43,0x14,0x2c,0xd7,0x7b,0x45,0xd0,0xed,0xbd,0x16,0x67,0x43,0x87,0x10,0xb5,0x6c,0x96,0x91,0xd5 }, { 0x9f,0xb9,0xfb,0x22,0x05,0xc5,0xf8,0x72,0xda,0x6d,0x3e,0x0b,0xcc,0x69,0x32,0x33,0x85,0x8f,0x68,0x41,0x22,0xa8,0x62,0x9b,0xb3,0x9f,0x78,0xcb,0x99,0x75,0x20,0xd6 }, { 0x93,0x2e,0x1e,0x5f,0x01,0xa5,0x0d,0x36,0x15,0xa9,0x30,0x32,0x6c,0x14,0xd2,0xb3,0x58,0xfe,0x1c,0x58,0xcc,0x78,0x7f,0xb6,0xe9,0xe4,0xf7,0xc7,0xe1,0x38,0xaf,0xb4 }, { 0x1f,0xd9,0xcf,0x33,0xe2,0x59,0x21,0x53,0x2a,0xb1,0x28,0xbd,0x77,0x55,0x38,0xa8,0x8e,0x4e,0xe8,0x85,0x16,0xed,0x22,0x16,0x1d,0x52,0x2e,0x9a,0x75,0x85,0xab,0xb5 }, { 0xb3,0x73,0x5b,0xdc,0x73,0x7d,0x36,0x02,0x99,0xf7,0x6c,0xad,0x58,0x80,0x9c,0x37,0x39,0x29,0x37,0x04,0x79,0xd1,0xcc,0x18,0x2e,0x59,0xc7,0xb7,0x92,0x77,0xa4,0x2c }, { 0x52,0xb8,0xab,0x72,0x28,0xf8,0x12,0xdd,0x13,0x9c,0xf1,0x6d,0x53,0x57,0x35,0x35,0xe1,0x7d,0x72,0x32,0x88,0x60,0xdf,0x36,0x62,0xcb,0xba,0xfe,0xb4,0xf4,0xf1,0x9e }, { 0x2f,0x9e,0xc3,0xe9,0xcf,0x00,0xf3,0x77,0x08,0x11,0x2f,0xde,0x3d,0x0a,0x92,0x67,0x9d,0xb9,0xc3,0x65,0x41,0x8a,0x7b,0x34,0x5a,0xe9,0x6d,0x11,0x99,0xc5,0x98,0xf0 }, { 0x89,0x02,0xe9,0x94,0xee,0xd6,0x72,0xae,0x0a,0x5e,0x6b,0xca,0xf8,0x67,0x42,0x08,0x60,0x29,0xa3,0x83,0xbd,0xb9,0x96,0x68,0x3d,0x02,0x11,0xf8,0xd2,0x16,0x83,0x05 }, { 0x36,0x87,0x73,0xbc,0x0a,0x52,0x3c,0x7a,0x32,0xf0,0x05,0x15,0x9e,0xd7,0xd5,0xd2,0xb4,0x45,0xca,0x52,0x06,0x9d,0xea,0xe0,0x92,0x5c,0x79,0x02,0xca,0xa3,0x0f,0xa3 }, { 0xb3,0xae,0x80,0x29,0x8e,0xe6,0x5c,0x81,0xb0,0xcd,0xed,0x0e,0x4b,0x08,0x6f,0x34,0xbf,0x3d,0x5f,0xc3,0xdb,0xca,0xaf,0xe6,0xfb,0x2e,0x58,0xfa,0x7b,0x4f,0xb5,0xf5 }, { 0x00,0x11,0x07,0xa1,0x50,0x43,0x93,0x22,0xde,0x39,0x4e,0xe0,0x9d,0x20,0x4b,0xa2,0x37,0xb5,0xae,0xc2,0x8b,0x63,0xa3,0x03,0x9c,0x14,0x3b,0x80,0xcc,0x7c,0xa7,0xca }, { 0x4a,0xfe,0x5c,0xb7,0xa8,0x34,0xab,0x3f,0xf0,0x18,0xb2,0xee,0xf1,0xce,0xfb,0xef,0x9e,0x55,0xbe,0x5c,0xdf,0xfa,0x08,0x27,0xfe,0x89,0x2d,0x26,0x41,0x8f,0x42,0xee }, { 0xf2,0xed,0x5f,0x22,0x20,0xe7,0xa9,0xe6,0x3a,0x2c,0x7a,0x5e,0xf4,0x79,0x6d,0x7c,0x1e,0x23,0x16,0xbb,0x7b,0x1a,0x27,0x7e,0x78,0x96,0x3e,0xf5,0xb1,0x54,0x81,0x90 }, { 0xa7,0xef,0x22,0x4a,0x5a,0xe7,0x74,0x1a,0x2a,0x95,0xba,0xdf,0x8b,0x36,0x56,0x05,0xb5,0x20,0x53,0x62,0x25,0x54,0x5e,0xbd,0x31,0xcf,0x60,0x81,0xc9,0x19,0xb8,0xc0 }, { 0x66,0xaf,0x71,0xf6,0x61,0xd8,0x7c,0x7b,0x01,0x9a,0xd5,0xd2,0x0f,0xb5,0x2d,0xe9,0xa0,0x4f,0xb4,0x11,0x52,0x1b,0x97,0x43,0x11,0xa0,0x64,0xc8,0x4d,0x1c,0x41,0xd9 }, { 0x2a,0x91,0xf3,0xb8,0x98,0x84,0x63,0x7b,0x29,0xe5,0x9b,0xdf,0xd6,0xbb,0x96,0x9c,0x02,0x5c,0x09,0xb2,0x71,0xb5,0x81,0x6a,0xe3,0xde,0x84,0x46,0x94,0x8a,0x83,0x30 }, { 0xae,0xb2,0x11,0x78,0x9a,0xa1,0xec,0x24,0xe9,0xde,0x9e,0xfd,0x4e,0xa9,0xac,0xfc,0x73,0x6a,0xba,0x70,0x50,0x9a,0x08,0x08,0x9f,0x7d,0xc9,0x8e,0x4b,0x3d,0xf8,0x92 }, { 0xe0,0x95,0xa1,0xea,0xb5,0x0c,0x09,0xf7,0x27,0x2d,0x80,0xce,0xc9,0x01,0x34,0xe0,0x64,0x9a,0x43,0x18,0x27,0x8d,0xd6,0x90,0xa8,0x44,0x65,0x79,0x98,0x92,0x27,0x0d }, { 0x9f,0x5d,0xd0,0xaf,0xb2,0x5c,0x64,0xfe,0x2f,0x52,0xa0,0xa4,0x7f,0x49,0x0a,0xf0,0x12,0xe8,0x73,0xaf,0x61,0x79,0x5e,0x56,0xd2,0x25,0xec,0xa2,0xba,0x5a,0xa3,0xf3 }, { 0x25,0x1c,0x54,0x0e,0xfc,0x8d,0x3b,0x93,0x71,0xc4,0x45,0xb7,0xd9,0xc0,0x15,0x99,0xd2,0xf1,0x58,0x44,0xd8,0x48,0x28,0xd5,0xf8,0x2e,0xda,0xa9,0xc6,0x2b,0xf4,0x83 }, { 0x36,0xea,0x4c,0x1c,0x66,0x2c,0x64,0x37,0x65,0x08,0x98,0xeb,0xa3,0x46,0xba,0xef,0x06,0x72,0xaf,0x1c,0xb4,0xcb,0x6f,0xd6,0xf0,0xda,0xeb,0x5d,0xa1,0x47,0x95,0xfb }, { 0x3e,0xaf,0x46,0x8a,0xd3,0x68,0x3b,0xb0,0x2c,0x56,0xdb,0x92,0x56,0x34,0x83,0x5b,0xac,0x62,0x95,0x53,0x36,0x29,0x9b,0xb1,0x07,0x84,0x68,0x26,0x2d,0x31,0xfa,0x95 }, { 0x1a,0x9c,0x46,0x88,0xf1,0x09,0xfa,0xc0,0x1c,0x08,0xd2,0x7d,0x62,0xc9,0xfc,0x13,0x16,0xfa,0x80,0xe8,0xa7,0xed,0x92,0x0e,0xdb,0x2b,0xa9,0x50,0xe1,0xba,0x3f,0xc8 }, { 0x86,0xa8,0x5f,0xf5,0x78,0x76,0xfd,0x33,0x7a,0x3d,0x5f,0x18,0xda,0xa5,0xd1,0xac,0xd8,0x1f,0xf8,0x4d,0x59,0x05,0xdb,0xac,0x93,0x67,0x56,0x2f,0xf0,0x54,0x45,0x45 }, { 0xf4,0x49,0x04,0xfb,0x7d,0xc3,0x36,0x43,0x97,0xc5,0xbe,0xb7,0xd8,0x0c,0x3e,0x97,0x48,0xde,0x29,0xbf,0x8c,0xe8,0x6b,0x40,0xd7,0xd8,0xce,0x6a,0x4a,0xf7,0xb9,0xb5 }, { 0x77,0xa3,0x0c,0x8b,0x67,0x6c,0x11,0x22,0xc8,0x2e,0x63,0x0d,0xa4,0x4b,0x07,0xea,0x5a,0x98,0x43,0x5f,0x00,0x2d,0x86,0xd2,0x0e,0xc8,0x91,0xcb,0xc4,0x61,0x45,0x6f }, { 0x38,0x2c,0xd1,0x8e,0xa0,0x36,0xd8,0x49,0xc4,0xd3,0xb7,0x6a,0x59,0xa1,0x05,0xe2,0x07,0x88,0x19,0x8d,0x6b,0x56,0xcd,0x97,0x11,0x99,0xaa,0xcb,0xea,0xe5,0xb9,0x25 }, { 0x7d,0xbe,0x66,0x58,0x78,0x59,0x8d,0x31,0x37,0xe4,0x8c,0x06,0xef,0x2e,0xf7,0xc7,0x87,0x0d,0x86,0x5a,0x1d,0x3a,0x85,0xa8,0xa8,0x25,0x57,0x61,0xf3,0xc8,0xd6,0x29 }, { 0x67,0x5e,0xf5,0x35,0x02,0x3b,0x6e,0x40,0x4a,0x98,0xd9,0x47,0x15,0xc2,0x71,0x6f,0xb2,0x95,0xea,0x40,0xd5,0x6b,0x2d,0x03,0xe9,0x5c,0xb1,0x2b,0x18,0x5d,0xad,0x36 }, { 0x71,0x88,0xab,0xb1,0xe3,0x30,0x74,0xca,0xf0,0x5e,0xa5,0x80,0xe9,0xf3,0x15,0x3c,0x70,0xd6,0x5e,0x10,0x4d,0xd7,0x8c,0xbf,0xac,0xad,0xaa,0x4f,0xdc,0x9e,0xf6,0x79 }, { 0xf5,0xcf,0x6f,0xb2,0x9e,0x90,0xa9,0x01,0xc4,0xad,0xa5,0x23,0xf2,0x09,0x37,0x93,0x8d,0xea,0xa4,0x46,0x13,0x97,0x2a,0x6c,0xfa,0xb5,0x48,0x16,0x44,0xc0,0x0c,0xc4 }, { 0x3e,0x3a,0xfb,0xd1,0x6f,0x8c,0xc3,0x1c,0x51,0x97,0x16,0x83,0xad,0x71,0xcf,0x2a,0x37,0x7b,0xd0,0x5c,0x0b,0x66,0x75,0x8a,0xbd,0x66,0x3e,0x9e,0x02,0x03,0x90,0x81 }, { 0xd7,0xd7,0xa4,0x41,0x21,0x70,0x00,0x03,0x44,0xf2,0x24,0x72,0xdf,0x32,0xde,0x51,0xad,0xd6,0x90,0x8c,0x02,0x7e,0xe4,0xb2,0x54,0x72,0x38,0xc7,0xcc,0xb9,0x20,0x7a }, { 0x68,0x18,0x3d,0x3a,0x3e,0x35,0x6c,0x43,0xeb,0x58,0x52,0x3f,0x49,0x55,0xef,0xa6,0x7f,0x47,0x9d,0x0c,0x21,0x37,0xd7,0xa1,0x1b,0xcb,0x50,0x2f,0xcb,0x4d,0x0b,0x33 }, { 0x76,0x5f,0x68,0x7f,0xf1,0x3b,0x1c,0xf3,0x00,0xdf,0x26,0x65,0x71,0xaa,0xdd,0x83,0xaf,0x23,0xba,0x44,0x1d,0x98,0xb4,0xec,0xb7,0xcc,0x59,0x9a,0x82,0xbc,0xc0,0x81 }, { 0xf3,0x0b,0x26,0x28,0x96,0xe0,0xc0,0x99,0x73,0x4e,0xd6,0xa7,0x53,0x72,0x99,0x00,0x88,0x57,0x9c,0xb7,0x0a,0x16,0x33,0xe2,0xbc,0x12,0x94,0xe5,0x81,0x71,0x2a,0x63 }, { 0xae,0xde,0x95,0x0c,0xf7,0xb7,0x14,0x89,0xff,0x71,0xd2,0x1b,0xec,0x53,0x06,0x26,0xfa,0x5b,0x0d,0x0a,0x94,0xd5,0x42,0xf4,0xb3,0x80,0x11,0x59,0x2c,0x1c,0x65,0x62 }, { 0xce,0xcc,0x15,0x07,0xdc,0x1d,0xdd,0x72,0x95,0x95,0x1c,0x29,0x08,0x88,0xf0,0x95,0xad,0xb9,0x04,0x4d,0x1b,0x73,0xd6,0x96,0xe6,0xdf,0x06,0x5d,0x68,0x3b,0xd4,0xfc }, { 0x68,0x06,0xcd,0xcc,0x96,0x22,0x3a,0x72,0x73,0xc1,0x07,0x66,0x05,0x7f,0x60,0x84,0xf7,0x82,0x33,0xea,0x79,0x06,0x82,0x1b,0x43,0x2a,0xfa,0xeb,0xa2,0x97,0x9a,0xd9 }, { 0x6b,0x79,0xc5,0x7e,0x6a,0x09,0x52,0x39,0x28,0x2c,0x04,0x81,0x8e,0x96,0x11,0x2f,0x3f,0x03,0xa4,0x00,0x1b,0xa9,0x7a,0x56,0x4c,0x23,0x85,0x2a,0x3f,0x1e,0xa5,0xfc }, { 0x33,0x23,0x89,0xbb,0x1a,0xf1,0x50,0xd9,0x23,0xd0,0x3a,0x75,0x17,0xf1,0xb0,0xa2,0x41,0x60,0x85,0xe0,0xad,0x0e,0x40,0x26,0xd4,0x20,0x9c,0xba,0x7e,0x9e,0xb8,0x99 }, { 0x9b,0xe3,0x28,0x77,0x95,0x90,0x78,0x09,0x40,0x7e,0x14,0x43,0x9f,0xf1,0x98,0xd5,0xbf,0xc7,0xdc,0xe6,0xf9,0xbc,0x74,0x3c,0xb3,0x69,0x14,0x6f,0x61,0x0b,0x48,0x01 }, { 0x9f,0x79,0x95,0xb1,0x74,0x5a,0x25,0x8f,0x10,0xab,0x68,0x10,0x32,0x04,0x4c,0xaf,0xa7,0x95,0x74,0xdf,0x27,0xeb,0x80,0xbc,0x4f,0xd4,0x1a,0xbf,0xfc,0xee,0xc0,0x6c }, { 0xd4,0xc5,0x06,0x1b,0x81,0xc4,0x68,0x2b,0x27,0xa0,0xcf,0xc6,0x45,0x9c,0xd9,0xd7,0x89,0x2e,0xb6,0x0a,0x43,0xf7,0x3d,0xd1,0x06,0x0b,0x6c,0x47,0x8a,0xa7,0xc3,0xd8 }, { 0x09,0x34,0xcc,0xb0,0x2f,0x1e,0x2d,0xa3,0xf1,0x85,0xb4,0xf9,0xe1,0xfa,0x3a,0xda,0x02,0x8a,0xcb,0x14,0xd1,0x71,0xd1,0x8a,0xb9,0xd7,0x6f,0x7d,0x59,0x75,0xa3,0xfd }, { 0x69,0x10,0x4e,0xf2,0x0c,0x66,0x76,0xaa,0xcc,0x9e,0x8c,0x29,0x18,0x00,0xd1,0xb7,0xe9,0x11,0xe2,0x0f,0x85,0xb4,0x06,0x61,0x56,0xea,0x11,0x8a,0xce,0x44,0xb8,0xd7 }, { 0xc2,0xb0,0x87,0xe8,0x02,0x84,0x4a,0xbc,0xa9,0x92,0x7a,0x67,0xd6,0x06,0x75,0xe1,0x08,0xf7,0xb1,0x10,0x92,0xfe,0xcf,0x8b,0x2b,0x66,0xe0,0x0c,0x53,0xdc,0x49,0x53 }, { 0x3b,0xe5,0x33,0x82,0x2b,0x14,0x6a,0x67,0xb7,0x64,0x93,0x97,0xf6,0xfd,0xcd,0xe0,0x45,0x12,0x33,0xed,0xa2,0x82,0x99,0x7f,0xe3,0x1c,0x4d,0xcc,0x0a,0x9b,0x09,0xfb }, { 0xf2,0x4c,0x0a,0xc0,0x1e,0x5b,0x7d,0xd9,0x45,0x85,0xa4,0x48,0x46,0xae,0xd3,0x1c,0x3f,0x84,0x3f,0x6f,0x6b,0xd1,0x7e,0xd4,0x3c,0xfa,0x92,0x9f,0xae,0xdb,0xe3,0x8e }, { 0xf5,0x38,0xcb,0xdd,0x2a,0x80,0xda,0xa5,0x14,0x8c,0x77,0x11,0xe4,0xde,0x66,0x7e,0xab,0xdc,0x90,0xf6,0x1f,0xbd,0x1a,0x9a,0xed,0xbd,0xff,0x47,0x80,0xda,0xd5,0xe1 }, { 0xd4,0x39,0x4a,0xaa,0xef,0x05,0xeb,0xdf,0xbd,0xcb,0xb4,0xb0,0xfe,0xc0,0x8b,0xda,0x11,0x20,0xe6,0xad,0x53,0x41,0x96,0x67,0x89,0xdc,0x22,0x8d,0x49,0x14,0x79,0xd4 }, { 0x29,0xd8,0xad,0xa1,0xdc,0x71,0x2d,0x24,0x64,0x8a,0xd5,0x3f,0xbd,0x7f,0x00,0xde,0x37,0x7f,0x67,0x24,0x6f,0x0a,0xfc,0xbb,0x4d,0xb8,0x61,0xfc,0x53,0x7e,0x4b,0xb2 }, { 0xfe,0xf6,0x5a,0xd6,0x79,0xa0,0x6b,0x18,0x36,0x56,0x39,0xa9,0x45,0xb3,0x10,0x2d,0x77,0x13,0x05,0xc6,0x68,0xbf,0x99,0x23,0x57,0x71,0x01,0x19,0xa5,0xb1,0xd7,0x38 }, { 0x05,0x51,0x39,0xb0,0xf6,0xda,0xf3,0x3b,0x3f,0xdc,0x29,0x4e,0x2b,0xfc,0x1a,0xd9,0x14,0xde,0x91,0xf7,0xd6,0xe9,0xf7,0x17,0xb4,0x50,0x9c,0x04,0x7f,0xbc,0x6a,0xcc }, { 0x7f,0x0c,0x8f,0x8c,0xbf,0x23,0xbd,0xaa,0xd8,0x5b,0x17,0x1a,0x4b,0xcd,0xa1,0x67,0x38,0xd3,0xe8,0x1a,0xcb,0x93,0x4f,0x7c,0xe7,0xb6,0xa8,0xfd,0xe8,0x97,0x21,0x5a }, { 0x5c,0x35,0xbe,0x3c,0x93,0xb6,0xab,0x3c,0x47,0xc5,0x5d,0xa7,0x4d,0x94,0x17,0x0b,0x0b,0x5e,0xb3,0x2a,0xbf,0xf2,0x0f,0x92,0x2f,0xaa,0xf2,0x1c,0x04,0xb9,0xee,0x18 }, { 0x0c,0xdc,0x95,0x23,0x1e,0xdd,0x87,0x63,0x4f,0x42,0xec,0x16,0x6c,0x3e,0x96,0x11,0x57,0x12,0xa4,0x8f,0x01,0x63,0x77,0xeb,0xe3,0x8a,0x30,0x23,0x48,0xeb,0x0c,0x1d }, { 0x28,0x6b,0xe3,0x20,0x13,0xbd,0x2a,0x04,0x4d,0x4b,0x6c,0x93,0xa6,0xd8,0xb7,0x23,0xcd,0x1f,0xff,0xd6,0x4e,0x75,0xaf,0x1c,0xaf,0x24,0x5e,0x57,0x0b,0x93,0xd5,0x9f }, { 0x0f,0x96,0x8d,0x60,0x70,0x44,0x6f,0xaf,0x45,0x53,0xdd,0xca,0x74,0xc1,0xbf,0xea,0x14,0x89,0xa5,0x6b,0x23,0xe7,0xca,0xd4,0x6d,0x5f,0x8a,0x95,0x76,0xaa,0x54,0x86 }, { 0xa1,0xfa,0x54,0x0c,0x8c,0x3d,0xeb,0x01,0xd5,0xb0,0xa2,0x43,0xbe,0xc3,0xf9,0xb1,0x7c,0xed,0x1f,0x3f,0xae,0x67,0xc7,0x34,0x07,0xb0,0x39,0xdf,0x93,0x8b,0x3a,0x68 }, { 0x74,0x74,0x9f,0xcb,0x58,0x72,0x24,0x48,0x7f,0x06,0x68,0x0c,0x23,0xf7,0xb4,0x5a,0x0c,0x7f,0x11,0x1d,0x3f,0xc7,0x98,0x15,0x0a,0x1e,0x3a,0xe7,0xa3,0x49,0xcf,0xb3 }, { 0x70,0x9a,0x22,0x79,0xcc,0x68,0xcf,0x00,0x7c,0x15,0x5e,0xb9,0x2f,0xd9,0x85,0x82,0xd8,0xe3,0xa3,0xad,0xce,0x47,0xa3,0x13,0x59,0x98,0xee,0xc9,0xa4,0x58,0xe6,0xd9 }, { 0xcb,0xbe,0xc9,0xa3,0xb1,0x61,0x52,0x64,0x7f,0x74,0x44,0xf4,0x66,0xd8,0x9f,0xee,0x0a,0xf3,0x55,0x54,0xfe,0x28,0xc9,0x92,0x88,0xa0,0x8c,0x88,0x5c,0xf3,0x19,0x7e }, { 0x8b,0x8a,0x88,0xd1,0x76,0xa4,0x1d,0x5e,0xbd,0x33,0x79,0xc2,0x20,0xef,0x0f,0xbb,0xa2,0x7e,0xcb,0x39,0x02,0x2c,0xe3,0xbf,0x60,0xc4,0x8c,0x03,0xe3,0x69,0x26,0x7d }, { 0x30,0x9f,0xa9,0x99,0xd7,0x87,0x86,0x4e,0xdd,0x1a,0x53,0xd7,0x3a,0xfa,0xd8,0x26,0xef,0x3a,0x3f,0xd9,0x30,0x54,0xa7,0xb6,0x48,0xad,0x26,0x2b,0x37,0xba,0xf1,0x9c }, { 0xdc,0xa4,0xe7,0x8d,0xb0,0x37,0x99,0xdd,0xa7,0x5e,0x8a,0x29,0x5c,0x0d,0xc7,0x21,0x6b,0xb6,0xbd,0xc6,0x96,0x7c,0x27,0xc1,0xb0,0xbb,0x05,0xc7,0x54,0x9e,0xa6,0x56 }, { 0xba,0x4d,0x60,0xd2,0xb5,0xff,0xeb,0x63,0x33,0x6c,0xf8,0xa0,0x9e,0x6c,0xe6,0x75,0xea,0x08,0x87,0x4b,0x71,0x8c,0x58,0x82,0xfc,0xd3,0xd6,0xe4,0x76,0xe5,0x2c,0xe0 }, { 0x1f,0x17,0xc2,0xd0,0xdc,0x7c,0xb7,0xec,0x7d,0x8a,0x1a,0xb9,0xf6,0x2c,0x9d,0xc0,0x97,0x05,0x1a,0xa4,0x11,0x5a,0x8c,0x01,0x13,0xa4,0x85,0xed,0x82,0x0e,0x1a,0x5a }, { 0xa3,0xc2,0x04,0xe1,0x74,0x99,0x6f,0x18,0xe3,0x56,0x5f,0xfd,0x66,0x5d,0x41,0x71,0x75,0x4d,0xca,0x20,0xb7,0xb9,0xc2,0xd0,0xe8,0x8a,0xf0,0xd5,0x36,0xc4,0x19,0x85 }, { 0x71,0x92,0xbe,0xc2,0xc8,0xb7,0x8d,0xe5,0x9a,0x3e,0x00,0x45,0x23,0x54,0x40,0xe0,0xd6,0x56,0x3c,0xc4,0x99,0x91,0xbe,0x63,0x97,0xbd,0x27,0xa0,0xff,0xa8,0x1d,0x18 }, { 0x81,0x1e,0x2a,0xe8,0xd6,0x34,0x4a,0x78,0xac,0xf6,0xfe,0x8e,0x29,0x5d,0x4f,0x53,0x8e,0x54,0xe7,0x3b,0x3b,0xd1,0x21,0x25,0x84,0x6f,0x60,0x9e,0xc4,0x1d,0xbd,0xaf }, { 0xc9,0x5d,0xf2,0x25,0xb7,0x6c,0xf4,0x96,0x55,0xbc,0x2d,0x12,0xfc,0x78,0x0a,0xab,0x96,0x4c,0x07,0xdc,0xcb,0x08,0xb2,0xe7,0xcc,0xcb,0x61,0x1a,0x48,0x34,0xe1,0xfd }, { 0x30,0x51,0xfa,0x7f,0x38,0xad,0xce,0x51,0x9e,0x6a,0x8d,0x35,0x85,0x97,0x69,0xed,0x9b,0xf1,0x5c,0xa5,0x91,0x5f,0x5b,0x9c,0xc7,0x0f,0xcc,0x34,0x5c,0xca,0x53,0xf9 }, { 0x46,0x45,0xee,0x13,0xc1,0x7a,0xa7,0x9c,0xe3,0x4c,0xfc,0x00,0xb2,0xbb,0x67,0xd4,0xb1,0x6d,0xf1,0x01,0x04,0x28,0x21,0xe1,0xe4,0xc4,0x45,0x8a,0x31,0xbe,0x87,0xdd }, { 0x86,0xdb,0x38,0x67,0xaf,0x37,0x79,0x11,0xda,0x0f,0x40,0xcd,0xb9,0xac,0xb0,0x8d,0x66,0x35,0x95,0x39,0xb0,0x70,0xc5,0xc5,0x5c,0x95,0xda,0x4d,0xa0,0x97,0xff,0x86 }, { 0x88,0xe5,0x3e,0x75,0x15,0xca,0xc8,0x77,0xe3,0x5a,0x5b,0xa8,0x52,0xa0,0xfc,0x38,0x3f,0x50,0xcf,0x5c,0x45,0x7a,0x74,0x6f,0x60,0x19,0x41,0x89,0xbc,0x76,0x00,0x24 }, { 0x92,0xd8,0xe6,0x2c,0x1a,0x4f,0x88,0x14,0x55,0x93,0xe6,0x08,0xf5,0x70,0xba,0x52,0x41,0x5a,0xac,0x53,0xa3,0x91,0x45,0xfa,0xb6,0x8e,0x46,0x10,0xef,0x1b,0xb2,0x79 }, { 0x26,0x6b,0x5d,0x36,0x45,0x51,0xf7,0x3b,0x9c,0xdb,0x75,0x34,0x09,0x9b,0x68,0x09,0xaf,0x9b,0x72,0xa4,0xe6,0x59,0xcc,0x5a,0xa9,0x51,0xb1,0x18,0x60,0xf7,0xd5,0x7c }, { 0x7b,0x18,0xc4,0x02,0x34,0xb0,0x98,0x63,0x7d,0x98,0xd0,0x15,0xd1,0xed,0xdf,0x17,0x91,0xe8,0xdb,0xe2,0x2d,0xf8,0x1b,0xb7,0xb6,0x65,0xf9,0x82,0xf4,0x88,0x45,0x9b }, { 0x6b,0x03,0x2c,0xc7,0xac,0xc2,0x14,0xa6,0x84,0x85,0x57,0xb5,0x1e,0x10,0xc4,0xc9,0x5c,0xdd,0x2c,0x41,0x78,0xcf,0x87,0x43,0x38,0xd7,0x87,0x85,0x5e,0x9c,0xc2,0x7f }, { 0x07,0xb2,0x9d,0x71,0xe8,0x77,0xd2,0x1c,0x93,0x56,0x52,0xd8,0x90,0xc8,0xee,0xd6,0xc4,0x91,0x82,0x19,0x1f,0x87,0xf3,0xd8,0x35,0x62,0x88,0xb1,0xb4,0xb5,0xc3,0x54 }, { 0x8f,0x8e,0xc6,0x2a,0x2a,0xe1,0xb6,0x6c,0xf5,0x0e,0x6c,0xab,0x96,0x91,0xc0,0x9e,0x87,0xa4,0xd4,0xba,0x55,0x42,0xd3,0xa1,0x90,0x38,0x6d,0x9d,0x9c,0xa2,0xdc,0xf0 }, { 0xa3,0x38,0xc8,0x6a,0xb2,0xb8,0x50,0xa5,0x14,0x45,0x2c,0x3a,0x70,0x2d,0xcf,0x47,0x45,0x79,0x1d,0x3d,0x8f,0x40,0xc8,0xfa,0xd6,0xde,0x4f,0x64,0x23,0x6b,0x49,0xca }, { 0xe6,0x3a,0xb1,0x11,0x20,0x88,0xb1,0x71,0xdf,0x28,0xb5,0x14,0x7c,0xad,0x05,0x23,0xf5,0x14,0x72,0x1b,0xd4,0x0d,0x9b,0x59,0xc1,0x8f,0x4f,0x91,0x7b,0x6a,0xc6,0x80 }, { 0x74,0x1c,0x65,0xf3,0xd7,0x1f,0xf0,0x3d,0xe7,0xf4,0x91,0xc0,0x08,0xcb,0x9a,0x26,0xf7,0x46,0x84,0xf7,0x0a,0x3e,0x78,0x71,0x71,0xa8,0x58,0x41,0x05,0x90,0x15,0xab }, { 0x36,0x64,0x01,0x7a,0x6e,0xdd,0xc9,0xfd,0xb7,0x3c,0x5f,0xb8,0xfd,0xc7,0xe6,0xbf,0x76,0xfc,0x70,0x30,0x11,0xbd,0x85,0x41,0xad,0xc0,0x47,0x44,0x5d,0x96,0x5f,0x9d }, { 0xd4,0x50,0x74,0x60,0xa9,0x22,0x0a,0x7f,0x0a,0x62,0x51,0x99,0x0f,0x51,0x49,0x5d,0xdd,0xa0,0xc1,0x33,0xba,0x6a,0x4e,0x3b,0x1b,0x2a,0x98,0xd7,0x84,0xa0,0xcc,0xed }, { 0x77,0xc8,0xfb,0x96,0xf1,0x4f,0xf4,0x21,0xe0,0x03,0xe2,0xdb,0x02,0x9d,0xf0,0xd4,0x5b,0xd3,0x77,0xd0,0x8f,0x84,0x45,0x50,0x10,0x21,0xbf,0xd5,0xa2,0x73,0x1e,0xf8 }, { 0x19,0x41,0xb8,0x39,0x58,0xed,0x3d,0x33,0xf9,0xd5,0xcb,0xb8,0xde,0x05,0xa3,0xdf,0x9f,0x96,0x44,0x9c,0x1e,0x7c,0xc3,0x28,0x22,0xcf,0x41,0xf6,0x72,0xad,0x49,0xc6 }, { 0x7e,0xb1,0x40,0xba,0xe6,0x43,0x2b,0xdc,0x5c,0xd7,0x81,0xa8,0x6d,0x41,0x31,0x92,0x33,0xa9,0x88,0xc2,0x0f,0xd5,0x87,0xd8,0x5d,0x72,0xd2,0x9f,0xa7,0xa3,0x82,0x53 }, { 0x1c,0x4c,0x04,0xcb,0xfb,0x6f,0xe9,0xc7,0xa6,0x82,0xee,0x85,0x6a,0x02,0x81,0x25,0x3c,0x6b,0x70,0xcf,0xb1,0x2a,0x47,0xc4,0x5d,0xd2,0xb0,0xb4,0xf5,0x1d,0x60,0x5b }, { 0x6c,0x3b,0xbb,0x18,0xf9,0x3f,0x29,0x88,0xa1,0x20,0xb2,0x09,0xc0,0x34,0xa2,0xbd,0xa5,0x22,0xec,0xdf,0xf9,0xce,0xe8,0xf8,0x01,0xba,0xbd,0xeb,0x4c,0xba,0x64,0x61 }, { 0xf0,0xa5,0xaf,0x4b,0x37,0x97,0x21,0xc4,0x1c,0x76,0x1b,0x1c,0x85,0x88,0xb7,0xad,0x2c,0x07,0x80,0xe9,0xb2,0xfb,0x44,0x87,0x85,0x5d,0xa1,0xb2,0x64,0x8a,0x29,0x1c }, { 0xc9,0x15,0x5e,0x23,0x95,0x4c,0x3a,0xb6,0x30,0xec,0x6e,0xd8,0xc6,0x47,0x8c,0xf2,0xaf,0x48,0x13,0x2a,0x23,0x0d,0xef,0x8e,0x83,0xb0,0xe3,0x26,0x3c,0x37,0x0a,0x5c }, { 0x55,0x62,0xe5,0xe4,0xe2,0x55,0x23,0x2a,0xd8,0xaf,0x45,0x1c,0x0e,0x26,0x4b,0xae,0xf4,0xf1,0x9d,0x26,0xc7,0x97,0x9a,0x69,0x82,0xa3,0x71,0x9e,0xa6,0xa9,0xb0,0xce }, { 0xb0,0xd2,0xb4,0xff,0x99,0xa1,0x84,0x27,0xbd,0x01,0xec,0x78,0x80,0x36,0x86,0x62,0xae,0xf3,0x39,0x3b,0xf9,0x90,0x5d,0xee,0xd1,0xd8,0xae,0x3e,0x9a,0x42,0x17,0x8e }, { 0x37,0x77,0xde,0xa6,0xc5,0xd0,0x5a,0xdc,0x4b,0xbb,0xc0,0xf5,0xd8,0x1c,0x22,0x6b,0xc1,0xd8,0xb8,0x8f,0xfc,0xb7,0x55,0xa0,0x79,0x74,0x54,0x31,0xaf,0x0f,0x2a,0xc4 }, { 0x61,0xe2,0xe1,0xbd,0x6e,0x74,0x2c,0xf3,0x22,0xfb,0xfc,0xac,0x8a,0x2f,0xab,0x18,0x12,0xff,0xb5,0x81,0x30,0x19,0x99,0xc1,0x31,0xa0,0x79,0xab,0x3b,0x94,0x2b,0x3b }, { 0x76,0xca,0x87,0x12,0xb4,0xbc,0xec,0xaa,0x62,0x6a,0x38,0xc2,0xe0,0xc5,0x87,0xc0,0xc8,0x59,0xf1,0x7c,0xc6,0xff,0x95,0x82,0x32,0x4e,0x3b,0xf3,0xe9,0x0b,0xa0,0x4b }, { 0xee,0xc5,0x74,0x1a,0x61,0x60,0xc3,0x5c,0xcb,0xc5,0x81,0xda,0x8e,0x67,0x0a,0x78,0xc5,0x6e,0xa5,0x3a,0x6e,0x95,0x44,0x0b,0x88,0x6e,0x4f,0x96,0xf6,0x87,0x51,0x67 }, { 0x27,0xef,0x47,0x76,0x9e,0x2e,0xf4,0x46,0x0d,0x21,0xfa,0x23,0x91,0x88,0xa5,0xfb,0xb7,0xd2,0x9b,0x67,0xa4,0xb1,0x3b,0xc0,0x70,0x61,0x36,0x55,0x46,0xac,0x5c,0x6e }, { 0xa3,0xc4,0x41,0xca,0x11,0x92,0x31,0xcd,0x56,0x41,0x02,0x94,0x07,0xc2,0xa8,0x0b,0xd3,0xfe,0xbd,0xb1,0xa2,0x49,0x8c,0xb3,0xc4,0x73,0xd5,0x37,0x3a,0xbc,0xd4,0x6b }, { 0x0b,0xb2,0x7e,0xf6,0x72,0x15,0x84,0xd7,0x2c,0xee,0x85,0x8a,0xee,0xdf,0xad,0x02,0x33,0x1f,0xc6,0x8f,0xfe,0x88,0x5e,0x0f,0x16,0xc8,0x4e,0x22,0xbb,0x32,0xaa,0x8e }, { 0x09,0x5e,0xee,0xa3,0x7c,0xf9,0xae,0x12,0x6f,0x61,0xf2,0xb1,0x74,0x8b,0x14,0xcc,0xca,0x16,0x92,0x1f,0xc6,0x08,0x35,0xd8,0x7d,0x1b,0x08,0x36,0x3f,0x14,0x76,0xb6 }, { 0xb1,0x11,0xf2,0x2e,0xff,0xbc,0x77,0xbb,0x8d,0x9a,0xfc,0xe0,0x78,0x44,0xe9,0xc0,0xec,0x65,0xfa,0x1f,0xa1,0xa1,0x2d,0x9a,0x34,0x23,0x37,0x50,0x95,0xa3,0x71,0xb6 }, { 0xda,0x5f,0x04,0xd1,0xa4,0x01,0x3b,0x3e,0x29,0x44,0xb2,0x5d,0x2e,0x32,0x9c,0x75,0xdb,0x2e,0x27,0xb2,0x4e,0x20,0x45,0x3a,0x51,0x63,0xf6,0x58,0xa5,0xa1,0x34,0xb7 }, { 0xfa,0xd7,0xee,0x91,0x9a,0x41,0xd0,0xc4,0xce,0xd8,0x08,0xcb,0x5f,0x89,0xbe,0x20,0xd2,0xe4,0x3a,0x9a,0x66,0xcb,0x0c,0xfc,0x5d,0x39,0x52,0x2a,0xa6,0x88,0xa1,0x2a }, { 0x16,0x22,0x4f,0xc3,0x98,0x9e,0x5a,0x5f,0x39,0xe8,0xac,0xad,0x3c,0xc3,0x67,0xa2,0x4d,0x3a,0x25,0x67,0x80,0xab,0x8e,0xbe,0xa1,0x9b,0x27,0x9c,0x9f,0xcd,0x68,0xf3 }, { 0x4d,0x4d,0xbd,0x12,0x93,0xb9,0x7c,0x0e,0xaf,0x33,0xb8,0xf7,0x13,0x7a,0xfb,0x55,0xb4,0x0a,0x97,0x1a,0x22,0xee,0x45,0x6f,0xb6,0x53,0x5b,0xaf,0xc8,0x7b,0x63,0x83 }, { 0x44,0x30,0xff,0x1e,0xed,0xc8,0xdd,0x56,0xf8,0x71,0xde,0xb8,0x4a,0x5b,0xe3,0x0c,0xe7,0xa2,0x5e,0x40,0x61,0x1e,0x31,0xff,0x9b,0xf1,0xbc,0x3a,0x72,0xeb,0xb4,0xc6 }, { 0xe3,0x30,0x01,0x80,0x63,0x1b,0xe6,0xb1,0x09,0x41,0x5f,0x49,0x86,0x3e,0x10,0xb9,0x42,0x51,0xe9,0xee,0x98,0xbf,0xd6,0xbd,0x93,0x15,0xe1,0x54,0x60,0x72,0x22,0xc0 }, { 0xeb,0xab,0xa3,0xd2,0xcb,0x08,0x31,0x18,0x51,0xaa,0x23,0x95,0x5c,0x19,0x46,0xd8,0x18,0xff,0x9c,0x47,0x3d,0xdc,0xff,0xe8,0xf1,0x23,0x14,0xe8,0xd9,0x32,0xa4,0xe1 }, { 0x9a,0xcd,0x4c,0x39,0x75,0x01,0x2e,0x23,0x9e,0x25,0x1f,0xf2,0xf9,0xa0,0x71,0x74,0x3c,0x5b,0xd4,0x3c,0xa2,0xbb,0x99,0xa5,0xe9,0x5b,0x54,0x5e,0x98,0xa7,0xe3,0x87 }, { 0x47,0xe6,0x41,0x7e,0xf2,0x21,0x1c,0x26,0xd6,0xcb,0x05,0xb5,0xc0,0x9a,0x08,0xa2,0x4d,0xa2,0xbb,0x86,0x78,0xed,0xde,0xee,0xa4,0x18,0xfb,0xae,0xc8,0x84,0x52,0xa0 }, { 0x87,0x89,0x84,0x0a,0x8a,0xc2,0x84,0x0f,0x95,0xba,0x16,0x8a,0x83,0x23,0x17,0x3a,0x71,0x0e,0x77,0x4a,0x0b,0xbe,0x6b,0xb8,0x39,0xf7,0x7f,0xe9,0x99,0x9f,0xa0,0x8a }, { 0x95,0xda,0x23,0x38,0x72,0xce,0x27,0x5c,0xc9,0x1c,0x9a,0xea,0x8e,0x0b,0xac,0xa8,0xa2,0x6a,0x51,0xee,0xf1,0x56,0x4b,0x97,0x2d,0x1c,0x40,0xa7,0x90,0x71,0x22,0x59 }, { 0xbf,0xab,0x17,0x8a,0xff,0xb9,0xdb,0xf6,0x5d,0x61,0x53,0x65,0xf6,0x3e,0xea,0x2f,0xc0,0xae,0xc5,0x82,0xe6,0xc1,0xd8,0x9d,0x22,0x1a,0x22,0xa5,0x4b,0x22,0x0d,0xca }, { 0x21,0xa5,0xca,0xf5,0xa0,0xdc,0xd4,0xd4,0x4d,0x47,0x2a,0xfb,0x54,0x56,0x4f,0xb7,0xe1,0x3d,0xf5,0x9d,0xfb,0xfc,0xec,0x54,0x52,0x60,0x4c,0xf7,0xad,0xc7,0xcd,0x1a }, { 0x4e,0x36,0x4e,0xa3,0x9c,0x8b,0x2b,0xb5,0x44,0x89,0x81,0xd0,0x24,0x70,0x32,0xe0,0x1c,0xb6,0x85,0x3f,0x1b,0x12,0xc8,0x4f,0x89,0xdc,0xda,0x09,0x3a,0x3d,0x46,0x23 }, { 0xc0,0x06,0x42,0x99,0xa0,0xaa,0x48,0xe2,0xc9,0x8e,0x4b,0x4e,0x65,0x03,0xdf,0x04,0xc0,0x3e,0x15,0x73,0x41,0x7d,0xdf,0xd3,0x52,0x2c,0xbc,0xde,0x85,0x7d,0x10,0x3a }, { 0x04,0x33,0x0e,0xf5,0xe1,0xb9,0xb1,0x65,0xe2,0x1d,0xf2,0x60,0x62,0x63,0x40,0xce,0x1e,0x33,0x7b,0x31,0xfc,0xbf,0x50,0x55,0x05,0x2d,0x1c,0xe2,0x95,0x54,0x1b,0x30 }, { 0x44,0xc5,0xfb,0x6a,0x83,0x38,0xd3,0x73,0xf9,0xab,0xdd,0x6c,0xd7,0xa3,0xd2,0x12,0x35,0x34,0xcc,0x41,0x28,0x6f,0x7c,0x02,0xd3,0x52,0x47,0xee,0x70,0xa8,0x39,0x26 }, { 0xeb,0xdd,0xe7,0x7a,0xf6,0xdb,0x5a,0xb9,0xb5,0x22,0xa7,0x64,0x4b,0x03,0x61,0x6c,0x16,0x24,0xda,0xf0,0x90,0xf2,0xbd,0xaa,0x61,0xfd,0xd8,0x62,0x60,0xb0,0xdd,0x35 }, { 0xae,0x8e,0x3a,0xa1,0x74,0xbf,0x43,0x37,0xe3,0x9d,0xe0,0xe0,0x8c,0xbd,0x88,0xb1,0xcd,0xf1,0x73,0xb2,0xc6,0x93,0xc1,0x09,0x55,0x52,0xcc,0xdb,0xa9,0x51,0x50,0x16 }, { 0xf4,0x95,0x68,0x6c,0x53,0x81,0x1b,0xd4,0x11,0xbb,0x92,0xbc,0x83,0x24,0xf6,0xd0,0x25,0x6d,0x66,0x50,0xf8,0xdc,0x11,0xd2,0x24,0x25,0xb3,0xa2,0x19,0xae,0x34,0xbe }, { 0x77,0xcd,0x4a,0x30,0x38,0xcd,0x19,0x8a,0x78,0x8c,0x19,0x5b,0x21,0x2b,0x53,0x1f,0x79,0x7a,0x18,0x94,0x19,0x05,0x10,0xfa,0x22,0x38,0x7b,0x43,0x5b,0x37,0x1d,0x24 }, { 0xc4,0x59,0xca,0x15,0x0f,0xba,0xab,0xd1,0x72,0xcc,0xd4,0x7f,0xc0,0x90,0x31,0x69,0x61,0x4c,0x21,0xdc,0x13,0xcc,0x9a,0x4a,0xae,0x23,0xd0,0x08,0x74,0xcb,0xd2,0x0e }, { 0x9c,0xbe,0x98,0x41,0xf0,0xb1,0xa5,0x98,0xc1,0x3b,0x40,0x2a,0x39,0xf4,0xbb,0x2f,0xa3,0xf2,0x8a,0xea,0x58,0x25,0x4d,0xe2,0x59,0x97,0x1e,0x43,0x20,0x07,0x6b,0x39 }, { 0x27,0xbe,0xe7,0xb5,0xc3,0x67,0x52,0xb2,0x79,0x95,0xba,0xb2,0x60,0x73,0xb1,0x4f,0x36,0xfd,0x4f,0x08,0xc5,0xf9,0x9e,0x9a,0xcb,0xc0,0x0a,0xda,0x11,0xe8,0x60,0xcc }, { 0x18,0xe6,0x56,0x78,0xbc,0xec,0xf4,0x4c,0x18,0x64,0x25,0xd4,0x1d,0xde,0x99,0x23,0x83,0xfd,0x79,0xdf,0x66,0xc1,0x9a,0xa7,0x3a,0x31,0xdc,0x80,0xc0,0x31,0x2c,0x9b }, { 0x44,0x4d,0xc6,0xcd,0xd8,0xcc,0x2f,0x7e,0xf6,0x55,0x74,0x61,0xea,0x40,0xf9,0x83,0x48,0x11,0xfb,0x59,0x39,0x66,0xec,0x95,0x94,0xcd,0x74,0x47,0x21,0x47,0xd0,0xdf }, { 0x60,0x87,0x98,0x76,0xa4,0xce,0x9d,0xd3,0x95,0x08,0x79,0xdd,0xbb,0xd6,0xd0,0x04,0x88,0xd6,0x1e,0x53,0x46,0xcd,0x79,0x1d,0x39,0x7d,0xd5,0x24,0x35,0x4c,0xe7,0xf7 }, { 0x71,0xf1,0x06,0xee,0xd3,0xbe,0x65,0xc0,0x73,0x2b,0x4d,0x4d,0xab,0xa1,0xb9,0x64,0xfc,0x18,0xb4,0x69,0x32,0xf2,0xd5,0xe1,0xf4,0x73,0xf0,0x4e,0x64,0x4c,0xec,0x54 }, { 0xda,0xab,0x1b,0x53,0xb6,0x7d,0xa0,0x4c,0x6b,0x07,0x3b,0x18,0x45,0x18,0x76,0xf4,0x90,0x43,0x9a,0xd5,0x7c,0xa3,0xb2,0xbb,0xca,0xf4,0x3c,0x60,0x8e,0x65,0x36,0x25 }, { 0xa8,0x1c,0x76,0x34,0x52,0xa2,0x70,0x5a,0x1c,0x35,0x04,0xbd,0xbc,0x4d,0x75,0xcb,0x62,0xf6,0x78,0x37,0x7d,0xe7,0xfa,0xdc,0xf7,0x47,0xd4,0xd1,0x70,0xf5,0xb0,0xde }, { 0x0b,0x8c,0x00,0x2b,0x0f,0x1b,0x5f,0xa1,0xcc,0x6c,0x6a,0x87,0xcd,0xb0,0x59,0x77,0x60,0xd3,0x14,0xb4,0x4b,0x5d,0xe7,0x07,0x3d,0x3a,0x29,0xd1,0xec,0xd3,0x29,0x2f }, { 0x37,0x5a,0xe1,0x59,0x3a,0x8f,0x12,0x2f,0x3b,0x6b,0xd0,0x37,0x5f,0xa1,0x6d,0x9f,0xb8,0xb4,0x69,0x8f,0xbe,0xea,0xd9,0x16,0xe7,0x99,0xac,0x08,0xc8,0xd3,0x91,0x7f }, { 0xbb,0x52,0xbf,0x72,0x34,0x32,0xed,0xb0,0xf2,0x22,0x7a,0xa2,0x2b,0xbf,0x58,0xd3,0x64,0x8b,0x74,0x4b,0x80,0xea,0xb7,0x82,0xa8,0xba,0xbd,0x42,0x4c,0x44,0x58,0xca }, { 0x59,0x24,0xf0,0x0e,0x2d,0x21,0xdf,0xb0,0xf7,0x4e,0x03,0x20,0x36,0x10,0x69,0xac,0x06,0xee,0xab,0x5d,0x96,0x12,0x31,0x4b,0x05,0xb3,0x13,0xab,0xf9,0x13,0x1d,0xb7 }, { 0x30,0x77,0xf7,0x05,0x92,0xeb,0x03,0x5c,0x23,0xf6,0x83,0xe5,0x0a,0xa3,0xd8,0x6f,0x08,0xb6,0x38,0x5a,0x67,0xb0,0xde,0xa6,0x08,0xb5,0x0d,0xd8,0x0f,0xec,0x0f,0xce }, { 0x64,0x86,0x84,0x59,0xe6,0x04,0x73,0x98,0xe3,0x7e,0x70,0x8e,0x85,0x36,0x27,0x93,0xe0,0x87,0x3e,0x94,0xda,0xba,0x6e,0xea,0xf0,0x40,0x23,0x2f,0xf6,0xd7,0x3a,0x20 }, { 0x77,0x1d,0x30,0x3c,0xb6,0x2f,0x5b,0x77,0x36,0xc9,0x8d,0xda,0xa4,0xdb,0xee,0x4e,0xb4,0xa3,0x04,0x6b,0x8f,0xb1,0x77,0x0e,0x15,0x56,0x50,0x43,0xa9,0x77,0x2a,0x18 }, { 0x9f,0x79,0x64,0x44,0xc5,0x0e,0x31,0x73,0xb7,0x22,0x38,0xa0,0x00,0x09,0x54,0x11,0x15,0xf6,0x0c,0xac,0x91,0x5e,0x11,0xf3,0x49,0xb9,0x20,0xd4,0x5a,0xb0,0xcf,0xe2 }, { 0x8d,0x2c,0xe8,0x00,0xd5,0xa8,0xf6,0x5f,0xda,0x82,0xdc,0xd3,0x38,0x99,0x51,0xa2,0xed,0xd6,0xdb,0xad,0x88,0x2d,0x9e,0x69,0xf1,0x2b,0x51,0x34,0xcf,0x60,0xc6,0x7e }, { 0xa6,0xe5,0x40,0x06,0xad,0x70,0x26,0x20,0x2f,0xfc,0x82,0x37,0x58,0xce,0x4e,0x54,0xa9,0x65,0x70,0x79,0xc8,0x6a,0x57,0x8d,0x14,0x1c,0xbb,0x0a,0xc7,0xbe,0x83,0xa7 }, { 0x7f,0x23,0x6a,0x5f,0x62,0x16,0xb9,0x50,0xc8,0xbb,0xa1,0x6c,0xf8,0x1c,0xcf,0x6f,0x0a,0xd0,0x2a,0x46,0xb9,0x59,0x2b,0x31,0x38,0xa3,0x5e,0x37,0x0b,0x3a,0x53,0x63 }, { 0xb6,0xff,0x42,0xa5,0x45,0xb7,0x35,0x62,0xa0,0xba,0x54,0x43,0x80,0x77,0xa4,0x6a,0x07,0xe0,0x12,0xeb,0x5f,0xe4,0x4e,0x13,0x62,0x16,0xed,0x33,0xde,0x80,0x97,0xc8 }, { 0xfb,0xcb,0xe3,0x8e,0xdf,0x86,0x7f,0x76,0x7e,0x9c,0x7f,0xc4,0xab,0x8c,0x16,0xc7,0x90,0x66,0x95,0x49,0x47,0x73,0x2a,0x82,0xd5,0xa9,0x4d,0x41,0xf0,0xbc,0x27,0xe2 }, { 0x12,0x21,0x5f,0xbc,0x93,0x7a,0xca,0x84,0x08,0xd3,0xf0,0xb0,0xca,0xfe,0xad,0x7b,0x2b,0x9e,0xb1,0x60,0xe2,0xcd,0x5d,0x1a,0x9f,0xec,0xd1,0xc8,0x62,0xa8,0x6c,0xb5 }, { 0x23,0x28,0x9e,0x35,0xe7,0xb5,0x12,0x09,0x5e,0x82,0x73,0x00,0xe4,0x72,0x4f,0xaa,0xfb,0xba,0x55,0xe8,0x7f,0xd4,0x83,0xb0,0x7f,0x50,0xab,0x1a,0x22,0xdb,0x86,0x8e }, { 0x27,0x6a,0xc6,0x37,0x1e,0xc3,0x89,0xf3,0x7e,0x30,0xdf,0x0f,0xba,0xc2,0xdf,0x71,0x7b,0x7b,0x9c,0x86,0x30,0xae,0x5e,0x9c,0x72,0xd7,0x0f,0x3b,0xa2,0x2b,0x33,0x34 }, { 0x03,0x5a,0x68,0x2d,0x4c,0x99,0x5a,0x6a,0x86,0x5b,0x7e,0x3c,0x71,0x53,0xcb,0x02,0x2e,0x2a,0xf9,0x23,0x82,0x4e,0x07,0x25,0x49,0x18,0x60,0xb4,0x9d,0xfb,0xcd,0x96 }, { 0x89,0x5d,0x9e,0xcc,0x2d,0xf6,0xb6,0xce,0x57,0x70,0xfb,0xf4,0x21,0x35,0x60,0x39,0xd4,0x44,0x52,0xfa,0x84,0x3c,0x83,0x9e,0xbf,0xd4,0x21,0xe8,0x9d,0x05,0x45,0x89 }, { 0x49,0x21,0x51,0xda,0x6a,0x3a,0x29,0x68,0x3c,0x10,0x78,0xf9,0xd2,0x8e,0x2d,0xfb,0xee,0x1b,0xaf,0x94,0xf7,0x9c,0x05,0xd1,0x6c,0x51,0x9e,0x51,0xf9,0x4d,0x9e,0x07 }, { 0x17,0x3f,0x7d,0x87,0xe8,0xea,0xcc,0x07,0x1b,0xce,0x10,0x6a,0x3c,0x99,0x2c,0xb7,0x41,0x9a,0xcc,0x39,0xe2,0x00,0xdf,0x6a,0xab,0x75,0x6c,0x39,0x7b,0x42,0x90,0x5b }, { 0x9f,0x58,0xd8,0x38,0xed,0xde,0xee,0x06,0x2d,0xbc,0xc8,0xda,0x9f,0x73,0x15,0x96,0xc0,0x3c,0x24,0x6e,0xf3,0x39,0xb0,0xf4,0x79,0x92,0x63,0x54,0xc1,0x8b,0x64,0xa4 }, { 0x69,0x5f,0xb4,0xd5,0x25,0xe8,0x0d,0xd1,0xfa,0x01,0xf8,0xd0,0xc3,0xce,0x4e,0x95,0xf7,0x90,0x76,0x6a,0x2d,0xa5,0x23,0x9d,0xdc,0xd2,0x2f,0x31,0x63,0x1d,0x68,0x1d }, { 0xb7,0xcf,0x8a,0xe3,0x6b,0xa8,0xe0,0x43,0x2d,0x00,0xc9,0x6f,0x01,0x3c,0x02,0x63,0x77,0x0c,0x87,0x30,0x26,0x51,0xd9,0x8c,0xb3,0xed,0x37,0xfd,0xbd,0x45,0xde,0xe0 }, { 0xb3,0x4b,0x20,0x61,0xf3,0x81,0x5b,0x85,0xd5,0x95,0xb0,0x6b,0x92,0x9e,0x1a,0x29,0x76,0xe5,0x51,0x23,0x29,0x66,0x86,0xd7,0x12,0xac,0x34,0x47,0x3e,0xf5,0xdf,0x84 }, { 0x86,0x0f,0xe8,0x2d,0x5f,0x48,0x31,0xce,0x17,0x86,0x01,0x94,0xd2,0x66,0xac,0x0f,0x88,0xcd,0x18,0x5c,0x68,0x67,0x17,0xb3,0x9d,0x6a,0xe3,0x3f,0x47,0x04,0xfb,0x28 }, { 0x51,0x27,0xb7,0x33,0xec,0xd1,0x7c,0xd2,0x8d,0xe5,0xe2,0xbd,0xbe,0xc2,0x4b,0x3c,0xa1,0x3c,0x75,0xcb,0x1c,0xce,0x5a,0x61,0xa1,0xe2,0x69,0x0e,0x0f,0xb7,0xe4,0x05 }, { 0x1d,0xda,0x6f,0x20,0xb0,0x44,0x93,0xcc,0xe7,0x6f,0x5c,0x01,0x3f,0xc3,0x99,0x02,0x35,0x07,0xbe,0x8c,0x88,0x5a,0xa2,0xd6,0x06,0x2f,0x55,0x35,0x96,0x56,0x06,0xe7 }, { 0x21,0x59,0xcc,0x33,0xcb,0x70,0x3e,0x93,0xd8,0x13,0x1c,0x62,0x76,0x5e,0xc8,0x78,0x0f,0xed,0x0b,0x6a,0xdd,0xe8,0xec,0x0a,0xeb,0xc4,0x00,0x0f,0xd9,0x10,0xd1,0x3a }, { 0x5c,0xb4,0x4a,0x39,0xac,0xf1,0x71,0xa9,0x73,0x28,0xca,0x54,0x69,0xba,0xee,0x55,0x26,0xe3,0x61,0x08,0x69,0x78,0xdd,0x09,0xae,0x5c,0x4c,0x16,0x25,0x76,0x51,0x8c }, { 0x22,0x99,0xa7,0xaf,0x59,0x08,0x3b,0xcd,0x1f,0x85,0x54,0x56,0x65,0xfe,0x69,0x30,0xa7,0x2e,0xe8,0x7d,0xf2,0xdb,0xbc,0x36,0x5a,0xcd,0xe2,0x2e,0x97,0x22,0x31,0xd4 }, { 0x6d,0x71,0x38,0x12,0xf0,0xdd,0x83,0xcf,0xd0,0x4a,0x4a,0x39,0xe8,0x2e,0x29,0xad,0x80,0x5d,0x15,0x61,0x8d,0xdc,0x72,0x34,0xbd,0x73,0xbd,0x5d,0xb6,0x37,0xd4,0x8a }, { 0x44,0x0b,0xab,0x24,0x27,0xc7,0xcf,0xc6,0x88,0xdc,0x7d,0x5b,0x66,0x8f,0x7a,0xbd,0x00,0x4c,0xe5,0xd6,0x79,0x4e,0x85,0x9f,0x4e,0x25,0x8c,0xbe,0x6c,0xa7,0x3b,0xb2 }, { 0x4e,0x3b,0xdf,0x0c,0x20,0xc0,0x50,0x50,0x97,0xf8,0x61,0x9c,0x51,0xb0,0x27,0x8d,0x50,0xe3,0x72,0x17,0x07,0x22,0xa6,0xaf,0x42,0xa7,0x58,0x0f,0xb4,0x0a,0x88,0x7e }, { 0x54,0x9e,0xff,0x66,0xc3,0xa5,0x1e,0xa4,0x2e,0xf0,0x24,0xdf,0x48,0x81,0x11,0x94,0x5d,0x93,0xf3,0x0f,0x3f,0xfc,0x8c,0xeb,0x2d,0x86,0x90,0x8e,0x74,0x8d,0xbe,0x23 }, { 0xc0,0xcb,0x79,0x6a,0xc1,0x96,0x4c,0x33,0x23,0x38,0xcf,0x79,0xf2,0x98,0xf1,0x55,0x68,0xe2,0x61,0x1a,0x0b,0xf2,0xea,0xfe,0x32,0x04,0xb6,0x1c,0x60,0x0b,0x21,0xc1 }, { 0xe2,0x80,0xd8,0x8e,0x81,0x1c,0xe9,0x51,0xc6,0x19,0x83,0x58,0x9a,0x40,0x07,0x5b,0x47,0x76,0xb0,0x22,0x76,0x74,0x0e,0x97,0xba,0xdd,0x90,0xbb,0xe1,0x78,0x46,0x58 }, { 0x6b,0x6d,0xb7,0x01,0xf0,0x56,0x30,0xc6,0xe8,0xa9,0x6c,0xf5,0x4f,0x54,0x5f,0x26,0x1a,0x5f,0xf8,0xa5,0x5a,0x94,0x0c,0x45,0x12,0x58,0x82,0xd8,0x48,0xd6,0x5c,0x23 }, { 0x3c,0xe5,0x54,0x37,0x65,0x84,0x80,0xb8,0x68,0x0d,0x00,0x3c,0x6c,0xc4,0xa0,0xfe,0x3c,0x4f,0xf0,0xab,0x5b,0x2a,0xf9,0x36,0x5b,0x63,0xa7,0x66,0x62,0xa6,0xcb,0xe7 }, { 0x53,0xc1,0x8b,0xbf,0xbe,0xbe,0x65,0x5b,0xb8,0x25,0x5b,0x26,0x48,0xdb,0x2a,0xdc,0x8f,0x25,0x42,0x09,0x31,0xd9,0x46,0x15,0x9a,0x7a,0xe1,0xad,0xe3,0x53,0x13,0x81 }, { 0xfc,0xc5,0x95,0x44,0xff,0x49,0x57,0xbb,0xd6,0x42,0xcf,0x3c,0x2f,0xbc,0x5f,0x48,0x83,0xe9,0x6a,0x21,0x9f,0xce,0x9b,0xa8,0x30,0x43,0x58,0x2f,0x6d,0x4e,0x8b,0x30 }, { 0x5c,0x9f,0x86,0xdd,0x8f,0x1c,0x85,0x49,0xef,0x82,0x51,0x7f,0x75,0x72,0x0b,0xfa,0x41,0xd0,0xcf,0xd3,0x0e,0x92,0x9b,0x67,0xf7,0x38,0xfb,0x9f,0xc2,0x36,0x47,0x62 }, { 0xce,0xc4,0xa4,0xbd,0x4c,0xad,0x9d,0x0c,0x2d,0x3b,0x2c,0xa7,0xaa,0x62,0x69,0x2c,0x39,0x77,0x69,0xdc,0xda,0x92,0x98,0x17,0x68,0x9d,0x0f,0xbb,0xbb,0xca,0xd2,0x4a }, { 0x34,0xc3,0xd3,0x54,0x49,0xd5,0xb7,0xec,0xc8,0xc0,0x3a,0xdb,0x38,0x5f,0x27,0xd1,0xac,0x6e,0xd3,0x46,0x5e,0xb8,0x49,0x0f,0x1c,0x9b,0x2f,0xd9,0x9e,0x8f,0x01,0x9a }, { 0x55,0xb4,0xb0,0x9c,0x4c,0x32,0x34,0xd4,0x50,0xc1,0x08,0x65,0xcf,0xac,0x8b,0x81,0x69,0x5c,0x05,0x97,0xe5,0xb5,0x70,0x30,0x6c,0x3c,0xe8,0xc2,0xe8,0xd2,0xde,0x28 }, { 0x05,0x39,0x9f,0xa0,0xb2,0xd5,0x63,0x0b,0xed,0xe6,0xb3,0x98,0xb8,0xb3,0xb4,0xb7,0x99,0x1a,0x2f,0x62,0x3b,0xb2,0x8c,0xb5,0xf6,0x0b,0x41,0x5f,0xa7,0x09,0x5d,0xf2 }, { 0xab,0x9a,0xc4,0x3b,0xc3,0x0c,0x79,0x0b,0x14,0xbe,0x0a,0xc4,0x5a,0x4d,0x07,0x79,0xac,0x2a,0xe4,0x99,0x69,0xa2,0xf7,0xe1,0x34,0xea,0x90,0x53,0x2b,0x65,0x4b,0x3a }, { 0x68,0x01,0x30,0x45,0x72,0x08,0xf8,0x4a,0xbd,0x8a,0x97,0x5a,0x86,0xbf,0x1c,0x00,0xd2,0x7d,0x1f,0x91,0xb1,0x2a,0x4a,0x5e,0x4c,0xbd,0xeb,0xe6,0xb4,0xdb,0xf6,0xfd }, { 0xb6,0x08,0x41,0x74,0x71,0xe7,0xfa,0x97,0x13,0xf2,0xea,0x40,0x36,0xf1,0x75,0x09,0xd7,0x5f,0x06,0xd9,0x8d,0x75,0x1a,0x3e,0xff,0xe2,0x59,0xec,0xe9,0x90,0xb0,0xbd }, { 0x86,0x84,0xa3,0x07,0xbe,0x35,0x3d,0x16,0xfb,0x4c,0x92,0x22,0x60,0xce,0x9d,0x74,0xf9,0xdc,0x22,0x82,0xe4,0x68,0x60,0x46,0xcc,0xf8,0x1a,0x7d,0x71,0xa9,0x26,0xb7 }, { 0xa7,0x40,0xbc,0xc9,0xbc,0x69,0x1e,0x15,0xed,0x41,0x87,0xe0,0xe6,0x6b,0x1e,0xb6,0x67,0x96,0xac,0x80,0xc3,0x12,0x80,0x22,0x02,0x28,0x9a,0xd5,0xee,0x77,0x60,0x8b }, { 0x6d,0xd5,0xa9,0xd7,0x2f,0x97,0x00,0xa3,0x92,0x1c,0xec,0x56,0x23,0x30,0xf1,0x44,0x8a,0xd1,0x91,0x2a,0x12,0x42,0xc2,0xa2,0xfd,0xc0,0x8c,0x6b,0x9c,0x17,0x84,0xda }, { 0xe0,0x1d,0xe6,0x1d,0x2c,0xbe,0x72,0xa3,0x05,0xb6,0xc0,0x7b,0xf1,0x6b,0x5c,0x5d,0x3c,0x07,0xbe,0x1f,0xb0,0x3e,0xfd,0x70,0x61,0x56,0x2d,0x28,0x06,0x62,0x65,0xbe }, { 0x57,0x0c,0xf7,0x58,0x91,0x93,0xee,0x88,0xa3,0x7d,0x6c,0x16,0x9a,0xb8,0xaa,0xf5,0x09,0xaa,0x87,0x01,0xf8,0x04,0xb8,0x37,0xa9,0xe0,0xe3,0xcd,0x3a,0x74,0xb5,0x57 }, { 0xc4,0x49,0x06,0x33,0xc6,0xc3,0xd7,0x71,0xb4,0x42,0x76,0x3b,0x93,0xf7,0x81,0x19,0x7a,0xd2,0xcb,0x09,0xb7,0xfe,0x07,0x40,0xad,0xc2,0xfb,0xe6,0xc0,0x1e,0x52,0x85 }, { 0x91,0x59,0xbf,0x15,0x87,0xf9,0xc0,0xc1,0x67,0x47,0x2f,0x34,0x57,0x22,0xac,0xf6,0x96,0x16,0x51,0xf7,0x4c,0x20,0x4b,0x7a,0x6e,0x03,0x9a,0x70,0xaa,0x77,0x30,0x5d }, { 0x45,0x19,0x94,0xac,0xad,0x8d,0x00,0x9b,0x40,0x79,0xff,0xc1,0xab,0x6a,0x02,0x5a,0xef,0x29,0xc1,0x30,0x40,0xb9,0x61,0x56,0xe9,0x7b,0x85,0x35,0x25,0xb2,0x72,0xa2 }, { 0xc6,0xb5,0xd5,0xca,0xf2,0x20,0x29,0x37,0xa7,0x79,0x43,0xb8,0xb7,0x31,0xf2,0xfe,0xa2,0x55,0xbf,0x81,0x0b,0x6a,0x89,0x3b,0xaf,0xbb,0x93,0x15,0xb3,0x21,0x87,0x37 }, { 0xda,0xb4,0xdd,0x47,0x25,0x5f,0x12,0xbd,0xb0,0xfa,0xa1,0x9d,0xc5,0x67,0xff,0xb3,0x40,0xa6,0x0e,0x06,0x2e,0xfa,0x46,0xdb,0x5c,0x7d,0x68,0x80,0xc5,0xb4,0xd6,0xcd }, { 0xfa,0x72,0x94,0x14,0xc2,0xc2,0x1d,0xc2,0xd2,0xd3,0x19,0x0f,0x7b,0x53,0x27,0x77,0x5e,0x9c,0xd4,0xd1,0x22,0x91,0xe0,0x21,0xc3,0x8a,0x4d,0xa2,0x5e,0xa3,0xbc,0x70 }, { 0x46,0x43,0x42,0x6f,0x7d,0x7d,0x72,0x95,0x2d,0x93,0xad,0xd2,0xfd,0x2f,0x56,0xdb,0x80,0xf3,0x87,0x9d,0xe7,0xa1,0x8a,0x8f,0x49,0xe5,0x22,0xf0,0xaf,0x16,0xde,0xe9 }, { 0xef,0x58,0xe8,0x98,0x2f,0x49,0x10,0x88,0x14,0xcc,0xb4,0xea,0x9d,0xd1,0x79,0x2b,0x35,0x2f,0x02,0xae,0xe6,0x13,0x22,0x3c,0xa5,0xed,0x02,0xec,0x4b,0xc7,0xba,0x8a }, { 0x5b,0x42,0x17,0xd2,0x1a,0xc1,0x64,0xc8,0xe2,0x8d,0xbd,0xea,0xfa,0x98,0x5b,0x99,0xb7,0x9e,0x57,0x0e,0x3b,0x86,0x1f,0x40,0x92,0x1e,0xcf,0x69,0xb1,0xe8,0xb4,0x4f }, { 0x8b,0x53,0x20,0xaf,0x9f,0x7e,0xa1,0x3a,0x24,0xf6,0x02,0xcb,0xf5,0x35,0x64,0xe1,0xa1,0x1d,0xa5,0x6f,0x03,0xf8,0x74,0xe6,0x18,0x15,0xf3,0x03,0xed,0x72,0xcf,0x38 }, { 0xe5,0x15,0xe6,0xae,0x84,0x85,0xa4,0x4c,0x3a,0x78,0xf0,0xcd,0xb3,0x7e,0x6e,0xe3,0xfa,0xc3,0x07,0x37,0x92,0x64,0x93,0x65,0xb0,0x2c,0xd0,0x7c,0x20,0xa0,0x67,0x3a }, { 0x19,0x53,0x6b,0x93,0x06,0xe9,0x0c,0xe3,0xc3,0xc3,0xc1,0xc5,0x85,0x58,0xad,0x89,0x72,0x84,0x08,0xf6,0x70,0xbd,0xc1,0x68,0xa7,0x1d,0xc9,0x7d,0xc4,0x3f,0x1c,0xae }, { 0x5b,0x37,0xfb,0x76,0x8f,0xa9,0xfb,0xca,0x0b,0xbd,0xd3,0xa7,0x37,0xdc,0xa6,0xbf,0xd5,0x45,0x5d,0x36,0x8e,0xfc,0x05,0x98,0x7f,0x00,0x2f,0x53,0x2a,0x59,0xa2,0x36 }, { 0x28,0xb5,0x56,0xb2,0x65,0xd5,0x25,0xd9,0xd4,0xd9,0x17,0x45,0x73,0x51,0x2c,0xbf,0x0b,0x70,0xdf,0x0b,0x87,0xcb,0x9e,0x0c,0x87,0xb2,0x52,0x6c,0xff,0xdf,0xdb,0x3e }, { 0x57,0xf1,0x6a,0x2f,0x05,0x82,0x37,0x91,0x4f,0x1d,0xb8,0x42,0x10,0x5f,0x13,0x15,0x12,0x99,0x53,0x58,0x57,0x62,0xcc,0xdd,0xc4,0xb2,0x8c,0x25,0x0e,0x63,0x87,0x88 }, { 0x81,0xa8,0x42,0x9b,0x73,0xe4,0x8a,0x31,0xf9,0xae,0x95,0x33,0x61,0x60,0xbf,0x9e,0x6e,0xad,0x9a,0x1e,0x6d,0x0d,0x33,0xc2,0xbf,0x7c,0xdf,0xdd,0xae,0x17,0x6e,0x6a }, { 0x2c,0x56,0xc8,0xc5,0x4f,0xa7,0x16,0x57,0x8e,0x0d,0x03,0xdd,0xa4,0x73,0xa2,0x6d,0xa2,0x37,0x0d,0x37,0x56,0x68,0x35,0x25,0x10,0xd5,0xed,0x30,0xd9,0xee,0xaa,0x23 }, { 0x79,0x08,0xb1,0x0e,0x3f,0x60,0x63,0x1d,0xc9,0x0c,0x3c,0xf9,0x63,0x45,0xaf,0x71,0x0f,0xd4,0xfc,0x3b,0xb0,0x95,0xc9,0x9d,0x7d,0x2e,0xf1,0x56,0x79,0xa1,0x0c,0x4b }, { 0x13,0x97,0x68,0xa9,0xf9,0xec,0x4b,0xf5,0x88,0x64,0xa1,0x20,0xf4,0x06,0x54,0x49,0x0d,0x8b,0x03,0x0f,0x7d,0x44,0x48,0xd9,0xce,0x94,0x80,0x63,0x3c,0x97,0xf8,0xe1 }, { 0xf7,0x36,0x8d,0x2b,0x65,0x8c,0x96,0x4f,0xa5,0xea,0xd5,0x3a,0xb0,0xac,0x85,0xb5,0xbd,0x1a,0xd7,0xa1,0x3f,0x87,0xb9,0xda,0x7d,0x48,0x30,0x5e,0x6a,0xa9,0xf7,0x0f }, { 0x2c,0x15,0x67,0x9c,0x9b,0x6b,0x9b,0x1a,0x20,0x42,0xda,0x42,0x3d,0xfd,0x10,0x51,0x25,0x36,0xa1,0xfb,0xcc,0xcf,0x1d,0xb4,0x26,0x69,0xfd,0x2e,0x0f,0x22,0xb8,0x67 }, { 0x93,0xda,0x4e,0xbe,0x2e,0x3b,0xc4,0x17,0xde,0xb3,0xf9,0x28,0x00,0x70,0xdd,0x7f,0x29,0x2d,0x89,0x9d,0xcc,0x46,0x18,0x3f,0x93,0x79,0x77,0x15,0xfc,0x96,0xc1,0x4d }, { 0x96,0xf5,0xec,0x6a,0x69,0xa0,0x43,0xe9,0xeb,0xff,0x04,0x9b,0xa6,0x96,0x72,0x3f,0x34,0xcf,0x4c,0x81,0x1a,0xe7,0x55,0xa3,0x7d,0x4e,0x63,0xf3,0x13,0xbc,0x67,0xe7 }, { 0x77,0xd9,0x4b,0xa6,0xa5,0x02,0x09,0x06,0xa7,0xe7,0x5f,0x9e,0x3a,0x25,0x6c,0xd7,0x66,0x42,0xc6,0x02,0x0e,0xd1,0x2f,0xf3,0x7c,0xc2,0x02,0xae,0xde,0x97,0x61,0xec }, { 0xfa,0xf7,0x93,0x59,0x56,0xe8,0xc6,0x68,0xc3,0x7e,0xf5,0x1a,0x25,0xe5,0x67,0x2f,0x93,0xe9,0x70,0x5b,0x0e,0xc8,0x66,0x65,0xe1,0x55,0xd5,0x5c,0xc5,0x0e,0x1c,0x93 }, { 0x28,0x9d,0x53,0x5c,0xf5,0x44,0x60,0xd1,0x3d,0xdd,0x52,0x10,0xb7,0xc1,0x8c,0xcb,0x2d,0x73,0x2e,0x8d,0xae,0x71,0xe2,0xdb,0x94,0xac,0xbb,0xfe,0x15,0x04,0x69,0x9e }, { 0xf6,0xea,0xa1,0xc6,0xa8,0x00,0x9b,0x0a,0x6d,0x14,0x3b,0x31,0xc7,0xdf,0x46,0x1d,0x06,0x72,0x54,0xf4,0xb3,0x9f,0xf4,0x21,0xee,0x66,0x09,0x6a,0xcf,0xdb,0x2d,0xcf }, { 0x51,0x05,0x7f,0x2e,0xd9,0x68,0x2c,0x03,0x31,0x8e,0x65,0x19,0xd5,0x66,0xb0,0x3e,0xeb,0x9a,0x82,0x6d,0x0a,0xc5,0xfe,0x56,0x2c,0x5c,0x52,0x42,0xd6,0x9b,0x3f,0x59 }, { 0xfc,0xab,0x28,0x84,0x3b,0x9d,0x8d,0xa4,0xec,0x50,0x48,0x8f,0x91,0xe6,0x37,0x67,0x99,0x1e,0x1d,0x22,0xa1,0x24,0xb7,0x66,0x46,0xf9,0x85,0x96,0xfd,0xd8,0xb9,0xa3 }, { 0x15,0x4b,0xb9,0x3c,0xe3,0x3b,0x38,0xe0,0x71,0x05,0xb8,0xd9,0x08,0xb5,0x43,0xfd,0x56,0xeb,0x63,0x27,0x8c,0x1e,0xf7,0x61,0xb2,0x4a,0x78,0xb3,0x4c,0xd4,0xa9,0xc9 }, { 0xec,0x9d,0x85,0x4c,0xb7,0x98,0x20,0x17,0x49,0x7e,0xae,0x94,0xa8,0x0c,0x44,0x2a,0xb0,0xd3,0x1e,0x59,0x88,0x5d,0x20,0x16,0x5d,0xcd,0x11,0xa9,0xf8,0x70,0x6f,0xea }, { 0x0e,0xdf,0x25,0x7a,0x67,0xef,0x7c,0x87,0xe1,0x9f,0x3b,0x6f,0xc0,0xd6,0x31,0x98,0x12,0xa2,0x44,0xfc,0x13,0xba,0xff,0x5c,0x90,0x67,0x41,0xf8,0x82,0x26,0x4b,0x3b }, { 0x29,0x97,0xa8,0x8c,0x7c,0xbf,0x2b,0xa6,0x23,0x9c,0x50,0xd8,0xb9,0x37,0x17,0xdc,0x50,0x7a,0xdb,0x13,0xb7,0xd7,0x91,0x77,0x64,0x75,0x6e,0x92,0xed,0x11,0x84,0x19 }, { 0x0a,0x24,0x12,0xa6,0x29,0x7d,0xad,0x68,0x61,0xd2,0xca,0x09,0x2d,0x4e,0xc5,0x74,0x4f,0x07,0x24,0x74,0x0b,0xff,0x9c,0x83,0x2c,0x9b,0x6c,0xe2,0xc7,0x29,0xc6,0xfe }, { 0x22,0x98,0x1a,0x1a,0xef,0x07,0x6f,0x12,0x9b,0x65,0x8a,0xcd,0x16,0xdc,0xc2,0x2a,0xaa,0x73,0xe2,0xbd,0xef,0x8b,0x95,0x64,0xf6,0x05,0xb3,0x54,0x5c,0x62,0x33,0x42 }, { 0xa6,0x74,0xd5,0xb1,0xf9,0x68,0x07,0xaa,0xd7,0x67,0xf6,0xac,0x4b,0x8a,0xef,0x15,0x9d,0xe7,0x4c,0x5d,0x4c,0x12,0x99,0x45,0xbd,0xd6,0x1b,0xff,0xd4,0x88,0xb8,0x25 }, { 0x67,0x60,0x02,0x27,0x51,0xf1,0x92,0xba,0xce,0x32,0x7d,0xa9,0xb9,0xc6,0x76,0x86,0xb8,0x74,0x2a,0x5e,0xb8,0xbf,0xd4,0xec,0xaf,0x9c,0x20,0x09,0xa8,0x06,0x5f,0x02 }, { 0x31,0xda,0xf9,0x66,0x42,0x20,0x72,0x49,0x6e,0x57,0xe5,0x43,0xe9,0xb0,0xda,0xd0,0x26,0xa2,0x6e,0xc6,0x96,0xae,0x72,0xf2,0xef,0xe4,0x70,0x90,0xb5,0x19,0xea,0xa1 }, { 0x46,0xce,0xee,0x8e,0xfd,0xe6,0xbd,0x40,0x15,0xd2,0x3e,0x19,0xb8,0x8e,0xc2,0xe0,0x7b,0xe8,0x7a,0x27,0x8a,0x9b,0x84,0x25,0x1f,0x89,0x04,0x7c,0x3b,0x22,0xf3,0xf1 }, { 0x07,0x59,0x82,0xcc,0xca,0x53,0x1b,0x25,0xcd,0x39,0xa4,0x88,0x3c,0x07,0xf1,0x60,0x7a,0x45,0x27,0x65,0x92,0xe5,0x0c,0x0f,0xcc,0xd7,0x62,0xef,0x8b,0xbd,0x94,0x44 }, { 0xf6,0x63,0x85,0xc1,0x2b,0xa9,0x4e,0x1e,0x45,0xf3,0x7e,0xd2,0x40,0x4c,0x5a,0x92,0x36,0x55,0xfd,0xca,0xf7,0x69,0x98,0x24,0x95,0xa4,0xe6,0x64,0x12,0xba,0x02,0x8a }, { 0x58,0xd4,0xd8,0xc1,0x7a,0x70,0x26,0xc7,0x10,0xe8,0x44,0x50,0x01,0xa2,0xcb,0xe6,0xeb,0x6b,0x50,0x40,0x22,0x10,0xbd,0xe4,0xcb,0xfb,0x0d,0x60,0xdc,0x8a,0xa3,0xa0 }, { 0x76,0x5c,0xcc,0x73,0xe5,0x41,0x8b,0xa5,0x74,0xad,0xbb,0x8f,0x17,0x62,0x20,0x59,0xc7,0x16,0x31,0x02,0xc5,0xb3,0x7d,0x65,0x35,0x0f,0x17,0x9c,0xf5,0x83,0xfe,0x91 }, { 0x10,0x01,0x30,0x2b,0xb4,0x6c,0x7d,0xfc,0x7e,0x30,0x66,0x95,0x55,0x9b,0xed,0x50,0x85,0xe0,0x16,0xca,0xdc,0x5a,0x9d,0x3e,0xb0,0xb0,0xb4,0x20,0x51,0x2c,0xc9,0xf4 }, { 0x92,0xae,0xf4,0x50,0xb4,0x2c,0xb1,0x9e,0x0e,0x26,0x41,0x52,0x44,0xfc,0x68,0x0b,0x77,0xab,0x29,0x5d,0xdf,0xa4,0x71,0x49,0xbd,0x61,0x63,0x1a,0xcf,0x50,0x52,0x06 }, { 0x86,0xcf,0x9e,0x56,0xd0,0x58,0xf4,0x56,0x2f,0x71,0xb3,0x6b,0x5f,0x56,0x2e,0x3b,0x8e,0x32,0x86,0x9c,0xb8,0x91,0x5f,0x43,0x40,0x61,0x24,0x94,0xb0,0x33,0xc4,0x48 }, { 0x4b,0x35,0xc1,0x74,0x57,0x55,0xf1,0x4f,0x9a,0x9e,0xe6,0xe9,0x8e,0xb8,0x66,0x66,0x46,0x64,0x5c,0x81,0x87,0xb2,0x56,0xd5,0xb0,0xc9,0x30,0x49,0x38,0xe6,0xd9,0x87 }, { 0xf5,0x8b,0xe6,0xcd,0xb9,0x4f,0x5d,0x48,0x2b,0x38,0xd7,0xdb,0x78,0x61,0x72,0xd7,0xc3,0x22,0x05,0x02,0xf2,0x0d,0x87,0x95,0xd2,0xd2,0x88,0xa2,0xd0,0x12,0x76,0x1c }, { 0x48,0x6d,0x9e,0xeb,0x1d,0xa1,0x3e,0x13,0x6b,0xde,0x05,0xe8,0xc1,0x57,0x0e,0xe2,0x4b,0x91,0x0b,0x60,0x17,0x97,0x06,0x98,0xd4,0x52,0xec,0x6c,0x36,0x92,0xa6,0x6f }, { 0xac,0x24,0x91,0x81,0x71,0x9b,0x1e,0x1f,0x6e,0x08,0xab,0x72,0x0a,0xfa,0x53,0x72,0x7e,0xf4,0xb3,0xa9,0x23,0xcd,0xc3,0x7e,0xce,0xcd,0xb5,0x84,0xf8,0x2a,0xfb,0x90 }, { 0xb0,0x9b,0xf7,0x7d,0xec,0x4c,0xf2,0x29,0x39,0xd9,0x5f,0xa8,0x9f,0xa2,0xb0,0x4d,0xa7,0x8f,0x91,0x7a,0x0d,0x04,0x18,0xb0,0x16,0x11,0xe6,0x8f,0x91,0x25,0x55,0x2b }, { 0x80,0x9f,0xaa,0x71,0x6d,0xdb,0x9e,0x74,0x3d,0xa5,0x8c,0x8c,0xea,0x0a,0xbf,0xa5,0x27,0xe7,0x65,0x91,0xc0,0xa2,0xe5,0x89,0x40,0x69,0x58,0xd5,0xe1,0x4e,0x7e,0xf1 }, { 0x43,0x57,0xa4,0xa9,0xac,0x35,0x49,0xaa,0xab,0x4c,0x82,0xdb,0x27,0x6a,0x6b,0x6f,0xdf,0x23,0x23,0xe2,0x8e,0xa7,0x7a,0x10,0xca,0xa4,0x9f,0x52,0x7b,0x85,0x53,0x13 }, { 0x9a,0xfe,0xd1,0x3f,0xcd,0x22,0x01,0x5e,0x05,0x4a,0x25,0x4a,0x09,0xe2,0x88,0x44,0x45,0xea,0xe1,0xe4,0xe8,0x7b,0xf3,0xb7,0x2b,0x70,0xf7,0x9a,0xe0,0x89,0xb0,0xa3 }, { 0xba,0x5e,0x72,0xa6,0x91,0x49,0xd3,0x5b,0xb5,0x91,0x4e,0x76,0xc6,0xbc,0xdb,0xdd,0x01,0x50,0x2e,0x30,0x65,0x56,0x66,0x5f,0x1c,0xf9,0xac,0xf3,0x0c,0x2c,0x68,0x79 }, { 0xc9,0x66,0xfe,0xd2,0x71,0x30,0x4a,0x2d,0xb8,0x98,0xfa,0xb7,0x14,0x58,0x8c,0x27,0xca,0x8b,0x17,0xa2,0x69,0x3c,0xf3,0x0c,0x8b,0x11,0xb7,0xed,0xdd,0x39,0x09,0x6b }, { 0xea,0xd1,0x23,0xc9,0xd7,0xd6,0xd4,0x91,0x6d,0x22,0x57,0x1b,0x9e,0x71,0xa6,0xad,0xa1,0x68,0x26,0x22,0xd6,0x17,0xb8,0x06,0x4c,0x8e,0x92,0x26,0x67,0x40,0xfd,0x5f }, { 0x3b,0xb4,0x57,0x82,0x8e,0x97,0x79,0x12,0x71,0xac,0x40,0x0d,0x9a,0x0a,0xba,0xeb,0x65,0x8d,0x20,0x7b,0x7b,0x0a,0x65,0xf7,0xb8,0xa9,0x2a,0x0d,0xc0,0xe7,0x50,0xa5 }, { 0x91,0x85,0x96,0xf9,0xb7,0x6d,0x6d,0x7e,0xa6,0xc7,0x8a,0xe5,0xe2,0x28,0x52,0x71,0xfd,0xf7,0x65,0x34,0x69,0xcd,0x9a,0xfc,0xc4,0x86,0x45,0x9a,0x85,0xbb,0x63,0xca }, { 0x97,0x40,0x5f,0x97,0xf5,0x10,0x67,0x02,0xd9,0x19,0x9f,0xd5,0xb8,0xa3,0x14,0xb5,0x77,0x35,0xb2,0xdb,0x93,0xb8,0xa6,0x02,0x55,0x6d,0xdf,0xd4,0x0a,0xe9,0xac,0xd4 }, { 0x0e,0x48,0xa7,0x6c,0x90,0xda,0x9b,0xbb,0x6e,0x71,0xfe,0x7d,0xb2,0x88,0x4b,0xc7,0xd6,0x92,0xcf,0x8b,0x4c,0x41,0xbf,0xf0,0x50,0x0c,0xb0,0x23,0x89,0xa0,0xdf,0x9c }, { 0x5f,0x77,0x19,0xb6,0x63,0x5b,0x44,0x86,0xc4,0x7f,0x0d,0x5b,0xa6,0x89,0x53,0x4b,0x20,0xee,0x56,0x60,0x51,0x40,0xc8,0x81,0x21,0x0b,0xc8,0xd0,0x73,0xdf,0xca,0xf6 }, { 0x01,0x7e,0xd3,0x96,0x15,0x53,0xb7,0xe1,0x4a,0x2b,0xa7,0x8b,0x9d,0x3f,0x5f,0xc4,0x3e,0x2c,0x61,0xbf,0x6c,0x16,0x37,0xb8,0x51,0xdd,0x71,0x20,0xff,0x9e,0xfa,0x76 }, { 0xa3,0x1a,0x30,0x4d,0xc7,0xa8,0xb0,0xd4,0x75,0x51,0x48,0x30,0x91,0xc8,0x3a,0xe0,0x21,0xdb,0xc7,0x9e,0xf3,0x88,0xe8,0xb6,0xcd,0x83,0xd5,0x9f,0x40,0x40,0x86,0xde }, { 0x1e,0x0a,0x9c,0xe5,0x60,0xd5,0x88,0xea,0x3e,0x19,0x20,0x1d,0x6d,0x0a,0xc0,0x49,0x5b,0xf2,0xc3,0x78,0x07,0x94,0xd8,0x26,0x54,0xb7,0xf5,0x53,0x9c,0x87,0xa0,0xc1 }, { 0xd7,0xdd,0x41,0xdc,0xe7,0xdf,0x3b,0x6b,0x73,0x33,0x68,0x16,0xec,0x5a,0x79,0x6c,0x3b,0x2b,0x78,0xd7,0xda,0x61,0x95,0x3e,0x06,0x3b,0xfc,0x4a,0x3d,0xca,0x22,0xf0 }, { 0x06,0x0e,0xac,0x6c,0x49,0x48,0x4f,0x33,0x4f,0x73,0xbc,0xd0,0x45,0x6f,0x5e,0xb5,0x6f,0x5e,0xed,0x88,0x72,0x99,0x66,0xc9,0x9d,0x38,0xf0,0xbf,0x20,0x4a,0xdf,0xf2 }, { 0xb3,0x78,0xf7,0x14,0x6f,0x75,0x66,0xdd,0xdc,0x1c,0x03,0xf1,0x8d,0x2d,0x1c,0x06,0xe3,0xf1,0x7d,0x02,0x35,0x80,0xf8,0x43,0x27,0x13,0xf0,0x3c,0x5a,0x1d,0xbc,0x5c }, { 0x43,0xc0,0x2f,0x2e,0x97,0xd5,0xbb,0x0b,0xc3,0xc1,0x78,0x1e,0xc5,0x8c,0xe8,0x7a,0x98,0xf4,0x56,0x01,0xc1,0x0d,0x13,0x12,0xe7,0x40,0x2f,0x74,0x5d,0x90,0x16,0x52 }, { 0x4c,0x2b,0xe2,0x3d,0x9c,0x16,0x24,0xb1,0xe9,0xa5,0x1a,0xc1,0x97,0x8b,0x10,0x2a,0x82,0x4c,0xcc,0xc3,0x33,0x8f,0x62,0x5e,0x29,0xb0,0x6a,0x8d,0xfb,0x82,0x91,0x1b }, { 0xb2,0x2f,0xd7,0xa3,0x1a,0x0c,0xa7,0xd5,0xe6,0x55,0x7a,0xff,0x42,0x1b,0x2b,0xfc,0x95,0x66,0x72,0x20,0x3b,0xaf,0x14,0x88,0xf7,0xcb,0xba,0x88,0xeb,0x0c,0xf6,0x0c }, { 0xab,0xec,0xa7,0xcf,0x8c,0xc1,0x7b,0x15,0x24,0x20,0xaf,0x47,0x6e,0x76,0x49,0x55,0x07,0x75,0xd1,0x62,0xc3,0x39,0x98,0xdf,0x09,0xef,0x7d,0x3a,0xa8,0x9e,0xda,0x61 }, { 0x8a,0x21,0x27,0x83,0xa5,0xf6,0x6c,0xa0,0xed,0x56,0x1f,0x0c,0x46,0xd7,0x60,0x9c,0x77,0x9e,0xdc,0x3a,0xf1,0xcd,0xd3,0xb9,0x80,0x6e,0x56,0xa5,0x1b,0x02,0x4e,0xe3 }, { 0x71,0x7a,0xda,0xa2,0x2f,0xe0,0x94,0xd7,0x49,0x78,0xdf,0x76,0x0e,0xfc,0x58,0xbe,0x73,0xf3,0xb8,0x11,0x6c,0x5d,0x47,0x19,0x96,0x96,0xb0,0xcc,0x42,0x80,0x73,0x1f }, { 0x22,0xab,0x41,0x34,0x04,0x32,0x8a,0xa1,0x7f,0xdc,0xd5,0x89,0x4e,0xb2,0x6e,0xe2,0xfb,0x8e,0x63,0x1c,0x6c,0xd7,0x4d,0x4c,0xeb,0x79,0xe6,0x88,0x35,0x19,0xea,0x73 }, { 0x5f,0xb7,0xdd,0x47,0xdc,0x71,0x12,0x09,0x09,0x2c,0x30,0x55,0xcc,0x79,0x0c,0x83,0xf3,0xe0,0x9b,0xdb,0x42,0x5e,0xf5,0xfb,0x4c,0xec,0xf6,0x7f,0xd6,0x07,0x82,0xdd }, { 0xe9,0x56,0xee,0x5a,0x95,0x89,0xa5,0x16,0x1f,0xe8,0x9f,0xac,0x04,0xb1,0xf8,0x4f,0x03,0x24,0x03,0xa7,0x3a,0x50,0x42,0x59,0x33,0x26,0x3c,0x81,0x6f,0x86,0x84,0x61 }, { 0x3b,0xdf,0xbe,0x23,0x8b,0xba,0x4c,0xcb,0x7d,0x3c,0xcc,0xfe,0xcf,0x76,0x27,0x07,0x0e,0xdb,0x3b,0x8e,0x74,0x03,0xbf,0x31,0x2b,0x07,0x09,0x08,0x12,0x03,0x34,0xc4 }, { 0x97,0xf4,0x9f,0x96,0x97,0x1a,0x6b,0x64,0x8e,0xd3,0x9e,0xce,0x6a,0xbd,0x7b,0x78,0x48,0x73,0x56,0x9e,0x16,0xd4,0x5d,0xb0,0x55,0x08,0x7e,0xae,0x39,0xc9,0x87,0xcc }, { 0x1b,0x8e,0x9d,0x0e,0xff,0x1b,0x1e,0xa5,0xfb,0x01,0x14,0xff,0x1f,0x53,0xe2,0x62,0x1d,0x9b,0x4e,0x93,0x62,0x52,0x2d,0xcc,0xcd,0x1f,0xe2,0x6c,0x7b,0x8c,0x64,0x88 }, { 0xc4,0xba,0xe6,0x53,0xf2,0x0e,0x78,0x78,0x04,0xee,0xa5,0x5d,0xc9,0xe2,0x54,0x93,0x85,0xb6,0xa9,0x2a,0x2a,0x45,0x10,0x6f,0x98,0x4c,0x4f,0xdc,0x80,0x9f,0x21,0x99 }, { 0x45,0xe0,0x41,0x57,0x40,0x9d,0x50,0xf8,0x26,0x34,0x7f,0x44,0x45,0xc1,0xf9,0x71,0x26,0xe8,0xa3,0x38,0x20,0x8a,0x89,0x81,0xc2,0x15,0x86,0x79,0xee,0x15,0x35,0x24 }, { 0x34,0x91,0x2d,0xe9,0x63,0x60,0x09,0x01,0x66,0x6b,0xdb,0x07,0x84,0x4b,0x8b,0xb8,0xf3,0x41,0xe4,0xad,0x2f,0xe1,0x5f,0xf9,0x7e,0xbf,0x97,0x5b,0x8f,0x65,0x3d,0x71 }, { 0x03,0xe5,0xb5,0x3a,0x13,0x1a,0x52,0x4c,0xe4,0x44,0xda,0x60,0xe0,0xde,0x80,0xfd,0x39,0xce,0x48,0x3e,0x44,0xaa,0xc4,0x12,0x11,0x2b,0x46,0x3e,0xba,0x7d,0xc5,0x4b }, { 0xe0,0xbc,0x28,0x7a,0x5d,0x38,0x47,0xa9,0x04,0x46,0xc5,0x78,0x63,0x35,0xa2,0xea,0xd7,0x22,0x34,0x75,0x7e,0x22,0xba,0x04,0x3c,0x7a,0x35,0x87,0x9b,0xa6,0x4f,0x60 }, { 0x1d,0xa7,0x09,0x34,0x54,0xca,0xcc,0x65,0x0c,0x0e,0xb9,0xe6,0x74,0x0a,0xcb,0x8a,0xfc,0x62,0x62,0x4d,0xbe,0x40,0xf9,0xb3,0x2e,0x81,0x47,0x07,0x57,0x33,0xb1,0x85 }, { 0xac,0x22,0x1f,0xc9,0x12,0xf1,0x7e,0x30,0x11,0xf8,0xdb,0xac,0x55,0xd1,0xec,0xf7,0xc3,0xb0,0xc7,0xd1,0x99,0x19,0x00,0xb6,0x8a,0x12,0x83,0x6b,0x9a,0xdc,0xb8,0x5e }, { 0xa8,0x34,0x0d,0x4c,0x3b,0x78,0xbe,0x63,0x1c,0x76,0x90,0x76,0x15,0x32,0x1a,0x28,0x20,0x72,0x81,0x0d,0x4d,0x0d,0x79,0x06,0xe1,0x37,0x90,0x16,0x19,0x44,0xa2,0xd3 }, { 0x91,0x0b,0x89,0xd3,0x20,0x36,0x27,0x53,0xdc,0x54,0x5a,0x75,0x25,0x8c,0x79,0xc9,0xd4,0x4c,0xe8,0x00,0x31,0xf3,0xe2,0x67,0xb7,0xaa,0xd9,0xf8,0x6b,0xce,0xf1,0x8f }, { 0x94,0xbc,0x12,0xe8,0x7b,0x10,0x82,0xcd,0x1c,0x9a,0x4e,0xe5,0x63,0x50,0xcd,0x47,0xa5,0x17,0x30,0x8b,0x62,0xef,0x93,0xed,0x5e,0x7a,0xe2,0x04,0xa6,0x33,0x40,0xf5 }, { 0x0c,0x8a,0x06,0x05,0x43,0xfc,0x46,0x75,0xf4,0x83,0x84,0x32,0xcc,0x9f,0x69,0x9f,0xc1,0xf3,0xf9,0x35,0xbd,0xb6,0x12,0x73,0xcc,0x1c,0xc9,0xd0,0xf6,0xeb,0x8b,0x40 }, { 0x0d,0xb0,0x58,0x40,0xb8,0x1f,0x54,0xe0,0x2e,0xf4,0xc2,0xca,0x14,0xf7,0x78,0x3a,0xf7,0x26,0x58,0xfe,0xc5,0x9a,0xc7,0x76,0xe4,0x2f,0x9c,0x89,0x34,0xf0,0x2c,0x6b }, { 0xe8,0x63,0x00,0x36,0x4e,0x21,0xde,0x0e,0xef,0x2c,0x10,0x14,0x51,0xc1,0x28,0x43,0x18,0xc4,0x9d,0xaf,0x7f,0xd2,0xf6,0x2d,0x73,0x2e,0x37,0x3e,0x7e,0x71,0xd5,0xa3 }, { 0xfb,0x07,0x1b,0xfb,0xda,0x7b,0x49,0x8d,0x64,0xb0,0xbd,0x37,0xd5,0x63,0x63,0xab,0x2b,0x33,0xdc,0x16,0xc2,0xc2,0x6c,0x65,0xb0,0xf0,0xab,0x91,0x5f,0x2c,0x86,0x1c }, { 0x9a,0xc9,0x68,0x24,0x6f,0xfc,0xac,0x07,0x1e,0xd9,0x57,0xf1,0x17,0x65,0x6e,0x6d,0x12,0x24,0x38,0x6b,0x64,0x40,0x5f,0xf1,0xe1,0xf0,0xf5,0x9a,0xff,0xf4,0x9b,0xfb }, { 0x38,0x53,0x32,0x9e,0xa1,0x12,0x82,0x22,0x55,0x1a,0x77,0xeb,0x5b,0x9d,0x98,0xa0,0xca,0xb2,0xe8,0xf9,0x74,0x3c,0xba,0x24,0x2a,0xbb,0x73,0x16,0x2f,0xf5,0x52,0x08 }, { 0xa9,0x37,0xf2,0x1e,0xb7,0xf9,0x66,0x1b,0x74,0xf9,0x42,0xd8,0x5e,0xb4,0x57,0x71,0x1a,0x56,0xf1,0x05,0x00,0x67,0x0c,0x99,0x44,0x6f,0x91,0x7b,0x0b,0x82,0x7b,0xa1 }, { 0x87,0xdc,0xd9,0xc7,0xa9,0x35,0xad,0xbc,0x10,0x0c,0xf7,0xd1,0x03,0x9b,0x81,0x46,0xd4,0x52,0xf5,0x9e,0xdd,0xe4,0x21,0x0c,0xbd,0xd7,0x52,0x37,0xff,0x36,0x93,0xa1 }, { 0x8d,0x01,0x02,0x1e,0x0b,0x3b,0xb7,0x2b,0xb9,0xe2,0x96,0xfe,0xb7,0x48,0x9d,0xa0,0xa1,0x51,0x3e,0xa9,0xb0,0x7e,0xd9,0xd6,0x57,0x7d,0xb0,0x08,0x20,0xc9,0xa3,0xda }, { 0x7a,0x7c,0x06,0x67,0x53,0x55,0x72,0x05,0x82,0x7d,0x69,0xa5,0x74,0x23,0x9e,0xc3,0x62,0x0a,0x60,0xb7,0x30,0x73,0xd4,0x8e,0x19,0x51,0xff,0xf5,0xdb,0x4c,0xb1,0x0b }, { 0xce,0x80,0xc5,0x54,0xf6,0x3b,0x28,0x6e,0x79,0xa8,0x11,0x88,0x9c,0x68,0x86,0xdb,0x78,0x9a,0x3f,0x24,0x34,0x67,0x00,0x12,0xdb,0x42,0x37,0x4d,0x29,0x44,0xd6,0x7a }, { 0x6b,0x3b,0x03,0x3d,0xa4,0x8e,0x93,0xde,0xda,0xa1,0x6a,0xeb,0x67,0xe5,0xf5,0xa3,0x08,0xef,0x18,0xad,0x79,0x7e,0xe7,0xd0,0x14,0xb0,0xd2,0x6a,0x49,0x56,0x1b,0xad }, { 0xca,0x6e,0x87,0x6b,0x8f,0x22,0x74,0x53,0xb5,0x05,0x2e,0xdd,0xff,0x63,0xe6,0x8b,0xdc,0x1c,0x8c,0x2f,0x34,0x73,0x94,0x68,0xf7,0x24,0x23,0xb3,0xd3,0x8e,0x47,0x7b }, { 0x24,0x16,0x0d,0x5e,0x03,0xd0,0xc8,0xca,0xfe,0x52,0x11,0x11,0xde,0x4e,0xf6,0x58,0xd9,0x90,0xa3,0x8b,0xf1,0x6e,0x83,0xe3,0xa5,0x30,0x88,0x3d,0xf8,0xe4,0xed,0x7b }, { 0x5c,0x28,0xa2,0x32,0x09,0xbf,0x99,0xc6,0x00,0x28,0xe1,0xd7,0x05,0x99,0x47,0x97,0x1d,0xc1,0x56,0xc1,0xb9,0x7a,0x33,0x41,0xbc,0xaa,0x2f,0x3a,0xff,0xe6,0x45,0x61 }, { 0x08,0x20,0x0c,0xa6,0x46,0x69,0xc1,0xf0,0xc5,0xb3,0x61,0x44,0xe5,0xb2,0xac,0x17,0x01,0xad,0x3a,0x4e,0xb7,0x95,0x0b,0x51,0x89,0xea,0x8b,0x32,0xd6,0x74,0x44,0x64 }, { 0x87,0x52,0x82,0xd2,0xbc,0x2f,0x28,0x5f,0xb7,0x5f,0xea,0x2a,0xe3,0x75,0xa5,0x07,0x19,0xb3,0xba,0xa1,0x1c,0x5e,0xab,0x2c,0xdf,0xe6,0x64,0xae,0x2a,0x0b,0x71,0x72 }, { 0x06,0xed,0x87,0x10,0x6e,0x67,0x0b,0xc4,0xe2,0xbe,0x3c,0xcb,0x5d,0x21,0x08,0xb2,0xf7,0x3e,0x36,0x22,0x43,0xc1,0xa2,0x91,0x87,0xae,0xc7,0x5b,0x71,0x3d,0xfa,0xb9 }, { 0x08,0xdd,0x36,0x15,0x47,0xf0,0xae,0x01,0x32,0xa2,0x44,0xbe,0x8c,0xef,0x1c,0x92,0x56,0xbf,0x16,0x48,0x6a,0xc8,0x7c,0x83,0xb0,0x3d,0xf6,0x36,0x8e,0xda,0xb5,0x94 }, { 0xc0,0xe7,0x30,0xe3,0x53,0xdc,0xe3,0xa2,0xde,0xc4,0xeb,0x01,0xe3,0x65,0xdf,0xc9,0x44,0xbc,0x22,0xef,0xab,0xe6,0x11,0xf3,0xbb,0x25,0xfa,0x7a,0x2f,0x41,0x89,0x65 }, { 0xe1,0xdc,0x4f,0x53,0xc8,0xc5,0x09,0x28,0x37,0x90,0x28,0x40,0x11,0xe8,0xe0,0xba,0xbc,0x85,0x37,0x1e,0xd9,0x8b,0xdf,0x92,0x8c,0x0f,0xa2,0xf7,0xef,0x1a,0x2f,0xaa }, { 0xf0,0x47,0x41,0xed,0x58,0xf5,0x67,0x37,0xfa,0xd9,0x5b,0xe6,0x26,0xe4,0x91,0x7c,0x01,0x3f,0x05,0x45,0x77,0x30,0x8e,0x8b,0xf9,0xe5,0xd6,0xa0,0x51,0xf6,0xa5,0xf8 }, { 0x23,0x5a,0x90,0x9f,0xec,0x31,0x22,0x2e,0x76,0x20,0x23,0x8c,0x52,0x06,0xce,0x74,0x03,0xa3,0x39,0xd3,0x51,0x64,0x9e,0xd2,0x18,0x3e,0xac,0x48,0x5e,0x83,0xd4,0x7c }, { 0x98,0x92,0xc8,0x1b,0xdb,0xc5,0xc9,0x3f,0x03,0x8b,0x0c,0xaf,0xa4,0x21,0x8d,0x2f,0x39,0x64,0xbb,0x82,0xb1,0xc8,0x3b,0x5d,0xd0,0xce,0x97,0xb3,0x7f,0xdf,0x64,0x86 }, { 0x73,0xe9,0x2a,0x38,0x09,0xf0,0x45,0x1b,0x0b,0x77,0x66,0xae,0x23,0xee,0x4c,0x45,0x42,0x40,0x2f,0x79,0xab,0xb0,0x26,0xb7,0xb1,0x7f,0x9e,0x9e,0xa5,0x4f,0x9c,0x95 }, { 0xb9,0xac,0x21,0xe9,0x87,0xd5,0x90,0x9a,0xbc,0xcf,0x3c,0xe7,0x2e,0xd9,0xcf,0x71,0x15,0x66,0x6f,0x64,0x73,0x98,0x79,0x6d,0x12,0x15,0xd0,0x7a,0x2b,0x03,0x17,0xf0 }, { 0xf6,0xae,0x0f,0xa1,0x02,0x56,0xcb,0xa5,0x95,0xe9,0x78,0xd2,0x53,0xab,0xdd,0xd9,0x18,0x22,0x91,0x27,0x65,0x91,0x43,0x82,0xb8,0x46,0x75,0xb9,0x62,0x0b,0x23,0x3c }, { 0x5b,0xd6,0xb6,0x85,0xe9,0xd5,0xfa,0x95,0x16,0x07,0xac,0xf5,0xab,0x1f,0xc0,0x66,0x7d,0x76,0xdf,0xb0,0xd3,0xa1,0xba,0xe7,0x94,0x24,0x19,0x84,0x7a,0x9f,0x58,0x1d }, { 0xe5,0xb6,0x20,0x9d,0x30,0xf8,0xad,0x93,0x77,0x64,0xa5,0xac,0xc9,0x97,0x74,0x1a,0x1d,0x71,0x70,0x5a,0x60,0x20,0x63,0xf9,0xaf,0xd3,0xed,0xbf,0x92,0x5f,0xe6,0x59 }, { 0x20,0x3a,0xec,0x83,0x7c,0x23,0x52,0x71,0xa8,0x12,0x73,0xf2,0x1b,0xd6,0x6d,0x53,0xe0,0x73,0x37,0x27,0xcf,0x50,0x59,0x7d,0xbc,0xfc,0xb6,0x00,0x5a,0xa2,0xc3,0xf3 }, { 0x05,0xe8,0x89,0x47,0xf8,0x6b,0x39,0x42,0xbb,0xbb,0xb2,0x5b,0xb5,0x45,0xe0,0xdd,0x1f,0x24,0xfb,0xe7,0x88,0x54,0x9c,0xe5,0xa5,0xf1,0x70,0xb9,0xdd,0x27,0x9f,0x49 }, { 0xa6,0x25,0x9e,0xbe,0xdc,0x69,0xf4,0x8a,0xad,0xf9,0x31,0xfb,0x28,0x36,0xe2,0x96,0x4a,0x28,0x96,0x45,0xdc,0x78,0x3b,0x33,0x45,0x94,0x64,0xde,0x7d,0xe6,0xfd,0x2b }, { 0xc7,0xd8,0x30,0xd4,0xd4,0xc4,0x52,0x44,0xa7,0xf5,0x63,0x99,0x42,0xd8,0x81,0x0d,0x94,0xc9,0x57,0xb3,0x0a,0x35,0x79,0xc8,0xfa,0x7c,0xb8,0xb5,0x07,0xf7,0xbf,0x68 }, { 0x52,0x90,0xba,0x5b,0x4b,0xad,0xc6,0xab,0x7f,0x41,0xe3,0x65,0xaf,0x82,0x72,0x51,0xc7,0xad,0x10,0x9a,0xd2,0x4f,0x80,0x43,0x69,0xe0,0x30,0xbd,0xf1,0x4d,0xcc,0x34 }, { 0x42,0x3a,0x0f,0x0e,0xff,0xfd,0xd5,0x3e,0x84,0x53,0x45,0x99,0xf1,0xf2,0x6f,0x44,0xd0,0x70,0xdb,0x33,0xfd,0xc7,0xbf,0x7e,0x6e,0x86,0x1f,0x3d,0xf2,0x34,0x40,0x41 }, { 0xff,0x57,0x57,0xc6,0x39,0xe5,0x2d,0x66,0x0c,0x66,0x90,0x6e,0xfc,0x73,0x98,0x5b,0xe3,0x1a,0x19,0x17,0xd5,0x58,0x09,0x14,0xc0,0x60,0x43,0x50,0xee,0x7a,0xdb,0x97 }, { 0x82,0xd5,0x88,0xd1,0x23,0xff,0x6c,0xad,0x75,0xc2,0xf8,0xbc,0x4d,0xed,0x4c,0xd3,0x48,0x1c,0x82,0x16,0x48,0x24,0xbb,0xf4,0x82,0x9f,0x0b,0x65,0xd0,0xb8,0xcf,0x56 }, { 0x7b,0x55,0xdf,0xb8,0x04,0x43,0x73,0x58,0x54,0xb2,0x7b,0xce,0x3a,0xf9,0x43,0x57,0x8f,0xba,0x6b,0xa2,0x92,0xc0,0x5a,0x9d,0xb8,0x16,0x64,0x0e,0x40,0x4d,0x2e,0xba }, { 0x8a,0x70,0x27,0x4d,0x43,0x5f,0xef,0x0d,0x69,0xaa,0xa8,0x5d,0xad,0x23,0x25,0x22,0x6c,0x53,0x11,0x5b,0x16,0xf5,0xa3,0xf2,0xd2,0xf9,0x8d,0x95,0x16,0xc9,0x1c,0x8b }, { 0x19,0xbc,0x23,0xc5,0x20,0x4b,0x1c,0x59,0x43,0xcb,0xd1,0xe2,0x1a,0x8e,0x7e,0x17,0xc2,0xe9,0x32,0x7e,0x3f,0x04,0x71,0xf9,0xc6,0xc7,0x99,0x7e,0x5a,0x57,0x58,0x31 }, { 0xda,0xcc,0xf0,0xba,0x45,0x39,0x80,0xdd,0x02,0xcc,0xda,0x0f,0x20,0x52,0x1c,0xae,0xc9,0xe9,0xc6,0x6c,0xd0,0x2b,0x64,0x9e,0x84,0x4c,0xb3,0x9d,0x13,0xd3,0xcf,0x3e }, { 0xf6,0x19,0x6b,0x7b,0x15,0x8b,0x47,0xfa,0x2d,0xa7,0x69,0x5a,0x07,0x99,0xa3,0xbd,0x62,0xcb,0x53,0x79,0x4d,0x63,0xcc,0xb3,0xad,0xd1,0x04,0xaa,0x14,0x5b,0xf5,0xfa }, { 0x50,0xa8,0xa2,0x1f,0xb1,0x3d,0x4d,0x2e,0x03,0x03,0x7e,0x39,0x3e,0x5c,0x60,0xdd,0xb9,0xf9,0x2d,0x97,0xb5,0x5c,0x8a,0xa7,0x7e,0x95,0xa0,0x62,0x42,0x15,0xd7,0xa1 }, { 0x59,0x7e,0x1c,0xc8,0xdc,0x74,0xd7,0x0b,0x53,0xa1,0x5b,0x07,0xac,0xf7,0x8d,0x75,0x63,0x1a,0x1d,0x05,0xa7,0x33,0x63,0x12,0xb9,0x97,0x93,0x11,0x67,0xd2,0x2d,0x85 }, { 0x3a,0xe8,0x8a,0xad,0x0c,0x4a,0xeb,0xef,0xfa,0x02,0x91,0xdc,0x9c,0x33,0x79,0x84,0xb1,0xb9,0x0b,0x3d,0xae,0x51,0x6e,0x2b,0x43,0xc8,0xa1,0x9d,0x39,0x7e,0xa5,0xeb }, { 0x4f,0xae,0x25,0xb7,0x42,0xf7,0xad,0x66,0xed,0x7b,0x03,0x6a,0x89,0x84,0x93,0x95,0xa1,0x13,0x21,0x34,0xb0,0x3e,0xf4,0xa0,0x20,0xdb,0x4b,0x4f,0xf5,0xf7,0xa7,0xa3 }, { 0x2c,0x4b,0x89,0xf5,0xd0,0xf6,0xaf,0xb4,0x6d,0xb0,0x47,0xe5,0x7e,0x2b,0xf9,0x44,0x89,0x7a,0x9f,0x1d,0x1a,0xbc,0x76,0x44,0xf9,0x25,0x79,0x0b,0xaa,0x7b,0x5e,0x1f }, { 0xe4,0xa7,0x5c,0xc1,0x17,0xca,0xe0,0xb4,0x48,0x13,0x25,0x7e,0x1c,0xb7,0x1e,0x6b,0x22,0xb4,0x24,0x13,0xd4,0x68,0xc0,0xb9,0x3a,0xb1,0x1a,0x0b,0x32,0x4c,0xf4,0x4b }, { 0xcc,0x8a,0xab,0xdf,0xaf,0xf1,0xaa,0xc6,0x91,0x27,0xc8,0x25,0x23,0x29,0x7b,0x57,0x58,0x90,0xf6,0xe7,0xc8,0xeb,0xb5,0x9c,0x2f,0xfd,0x73,0x64,0xec,0xbe,0x92,0x06 }, { 0x8f,0x21,0xaf,0x7f,0xe8,0xa5,0x68,0x3e,0x4e,0xf6,0x10,0xff,0x0e,0x2f,0xed,0x21,0x79,0xac,0xf6,0xb7,0x4c,0x58,0x2a,0x36,0x3a,0x35,0x8a,0xa6,0xcb,0x02,0x6a,0x25 }, { 0xc8,0xef,0x6b,0x28,0xc8,0x84,0xf7,0x76,0xa5,0xb0,0x9a,0xf7,0x2c,0x08,0xf2,0xfd,0x23,0x93,0x56,0x67,0xf3,0xb9,0xa3,0xc7,0xdb,0x68,0x23,0x93,0x1e,0xb3,0x21,0x3c }, { 0xa7,0x14,0x84,0x5b,0xdb,0xb4,0x14,0x24,0x96,0x1d,0xba,0xc8,0xc6,0x1d,0xc6,0x34,0xc3,0x8e,0x1d,0xfd,0x0f,0x99,0xe4,0xc2,0x0e,0x4f,0xa7,0xa0,0xa8,0x6f,0xec,0xea }, { 0xd0,0xf9,0x8d,0x32,0x74,0xab,0x4d,0x20,0xba,0x8c,0xe4,0x6c,0x75,0xf9,0x98,0xdd,0xf3,0x4a,0xa5,0x2d,0x08,0x9d,0xba,0xde,0x34,0xea,0x9f,0x8e,0x1a,0xad,0x37,0x15 }, { 0x98,0x65,0xcc,0xe3,0xdb,0x40,0xb4,0x54,0xe5,0xd0,0xe9,0xbf,0x7c,0xb4,0x33,0x5f,0xfc,0x1b,0x1e,0xd3,0x46,0xa1,0x4f,0x11,0x64,0x92,0x62,0x8f,0xef,0x02,0xc9,0x9b }, { 0x02,0x64,0x07,0x29,0x66,0x47,0x17,0x94,0x35,0x2a,0x8e,0x4f,0xbb,0xda,0xdd,0xd1,0x42,0x5e,0x00,0x44,0xfe,0x1d,0xc6,0xde,0xf6,0x27,0xf9,0x9e,0x2a,0x6d,0xdc,0xbc }, { 0x25,0x6b,0xbd,0x2d,0x83,0x14,0xa6,0x12,0x87,0xc1,0x07,0x98,0xbd,0xff,0x34,0xe2,0x67,0x1c,0xce,0x8c,0x65,0x62,0x6e,0x03,0x2b,0xc6,0xce,0xe6,0x00,0xff,0x76,0xee }, { 0xc1,0x0d,0x1d,0x96,0x54,0x31,0x9a,0x51,0x0f,0xe9,0x07,0xd0,0xed,0xeb,0xcf,0x09,0x1e,0xa4,0x86,0xb3,0x94,0x1b,0xdc,0x8d,0xcc,0xe4,0xb2,0xad,0x14,0x8d,0x81,0xf4 }, { 0xb4,0xeb,0xa6,0xb5,0x7d,0x7f,0x27,0xd8,0x81,0x46,0x7f,0x81,0x8e,0x2c,0x7e,0x4a,0x16,0xc0,0x28,0xd7,0xda,0xbe,0x5a,0x1a,0x91,0xb3,0xdb,0x73,0x10,0x62,0xdc,0xd6 }, { 0xc7,0x2f,0xff,0xba,0x08,0x2e,0x44,0xae,0x12,0xa9,0x5a,0xb7,0xd0,0x4a,0x8d,0x49,0x39,0x43,0x67,0xa7,0xfe,0xa4,0xc3,0xce,0x7e,0xb5,0xef,0x42,0x63,0x4f,0x14,0x07 }, { 0x75,0x85,0xd7,0x29,0xa1,0x8c,0x61,0x1b,0xa0,0x7e,0x68,0x6f,0xd6,0x4d,0xe4,0x1f,0xd3,0xfa,0x29,0x88,0x56,0x28,0x5b,0x7d,0xee,0x33,0xaf,0xa2,0x2a,0x4b,0xb0,0x6e }, { 0x9b,0x68,0x69,0xd5,0x20,0xba,0xa2,0xcd,0xb0,0xfe,0xca,0xbb,0x99,0x55,0x04,0xce,0xf7,0x37,0x7f,0x2c,0xe4,0x8c,0x82,0x1d,0x00,0xdb,0x08,0x69,0x8f,0x99,0x30,0xc2 }, { 0x6a,0x99,0x17,0x61,0x1a,0x20,0x23,0x80,0xe8,0xe2,0x2f,0xf1,0x8b,0x06,0x80,0x78,0xd9,0x5e,0x2c,0x39,0x15,0x52,0xb5,0xaa,0x98,0x0d,0x90,0xdc,0xe6,0x95,0x66,0xb0 }, { 0x8b,0xc3,0x1e,0xae,0xbb,0x8d,0xb9,0x4a,0x60,0xf1,0xac,0x2a,0xf4,0xca,0xc5,0x64,0x9d,0x5f,0x69,0xaf,0x45,0xf0,0x92,0xb0,0x97,0xc2,0x41,0xb4,0x2d,0xa3,0x05,0x75 }, { 0xc8,0x20,0xa2,0xd5,0x1d,0xd4,0xac,0x0f,0x66,0xcb,0x88,0x9d,0xeb,0xf8,0x76,0x9a,0xee,0x66,0xa5,0xbe,0x5a,0x5a,0x07,0xa6,0xf1,0xcf,0xbb,0xac,0x94,0x50,0x3c,0x10 }, { 0x21,0x7a,0x92,0xbf,0xd6,0x45,0x89,0x1a,0xa5,0x93,0x8d,0x8a,0xd4,0x6f,0xb6,0x2f,0x0f,0x7b,0x73,0x4d,0x7a,0x8b,0x3e,0xf4,0x53,0x03,0x61,0x69,0x6f,0xc9,0xd5,0xca }, { 0xd7,0x21,0xaa,0x22,0xbb,0x1e,0xdd,0x1e,0xbf,0x08,0xf6,0x1e,0x0a,0x3c,0x15,0x70,0xf0,0xf3,0x05,0xc1,0xb2,0xbd,0xcd,0xc2,0x70,0xaa,0x66,0x79,0xa5,0xcd,0xbb,0xab }, { 0x27,0x54,0xfc,0x50,0x47,0x2d,0xa9,0x0e,0x57,0x44,0x11,0xb3,0x3f,0xb7,0x56,0x39,0x89,0x7b,0xf5,0x20,0x28,0xd0,0xa8,0xfe,0xdf,0xcd,0xe2,0x7a,0x4e,0x5c,0x77,0x12 }, { 0x76,0xf4,0xbb,0x49,0x11,0x09,0xae,0x56,0x69,0xab,0xe8,0x6c,0xcc,0x67,0x70,0xa3,0x77,0x52,0x20,0xc6,0x72,0x2b,0xc8,0x22,0x61,0xad,0x59,0x0c,0xc7,0x40,0x1f,0x35 }, { 0xcd,0xfe,0x36,0xd8,0x03,0xfb,0x56,0xae,0x35,0xeb,0xc5,0xe3,0xdc,0x59,0xba,0x4c,0xc8,0x51,0x6b,0xd8,0x04,0x99,0x1c,0xaa,0xfa,0xf6,0x9b,0xbb,0xc3,0xda,0xb4,0xe6 }, { 0x74,0x06,0x5b,0x35,0xe6,0x7b,0x88,0xbc,0xd7,0x0e,0x3c,0xf9,0xc8,0x93,0x4d,0x67,0xeb,0x11,0x43,0x63,0xf9,0xa8,0x91,0x61,0xbc,0xb7,0xee,0xec,0x8f,0x99,0x15,0x38 }, { 0xe7,0x45,0x91,0x3b,0x11,0x20,0xd2,0x09,0xf5,0x30,0x80,0x17,0x8c,0x59,0x69,0x39,0xe1,0xc2,0xbc,0x81,0xf4,0x8d,0x45,0xc5,0x4c,0x5b,0x01,0xbc,0x91,0x12,0x13,0x03 }, { 0xb2,0xc9,0x10,0xf8,0x0d,0x69,0x58,0xe1,0xfd,0x80,0x6a,0x01,0x7c,0xe0,0xd3,0x83,0xbb,0xb3,0x1b,0xf5,0xfb,0x7e,0x8a,0x77,0xf9,0x27,0xfc,0x70,0xa3,0x41,0xcb,0x5f }, { 0x18,0xd9,0xd0,0x9e,0x57,0xdd,0x10,0xbe,0x5f,0xe6,0x99,0x79,0x2a,0x83,0x0e,0x4f,0x3c,0x6e,0x7c,0x72,0x33,0x69,0xc3,0x1c,0x5a,0x9d,0xbc,0x52,0x5c,0x1d,0x63,0x07 }, { 0x73,0xee,0x29,0x40,0x03,0x01,0x94,0x0b,0xdc,0x29,0xc1,0xb4,0x93,0x40,0x85,0x8a,0x8d,0x4d,0x70,0xd2,0xae,0xf5,0xc1,0xa2,0xcd,0x87,0x04,0x63,0x42,0xd0,0xd3,0xe5 }, { 0x5e,0xdf,0x53,0x2f,0xcd,0x1e,0x56,0x0b,0xd1,0x21,0x76,0xc0,0x58,0x51,0x7e,0x41,0x62,0x9a,0xda,0x89,0x36,0x39,0x7e,0xaa,0xd9,0x19,0x36,0x72,0x59,0xee,0xe2,0xe8 }, { 0x90,0x4a,0x77,0xa3,0x4a,0xd9,0x3c,0xe0,0x8e,0x43,0x3d,0x8c,0x78,0x4a,0x25,0x66,0x3d,0x5a,0x06,0x17,0x54,0xae,0x77,0x56,0xc7,0xd9,0x9f,0x6f,0x7a,0xd3,0x21,0x9e }, { 0x82,0xbe,0xd1,0xe7,0x49,0x41,0x97,0xdd,0x39,0xdc,0x6f,0x3a,0x0c,0x94,0x16,0x5f,0x60,0xad,0xe7,0x8e,0xd0,0x1a,0xd4,0xeb,0x6b,0xbb,0xae,0xe5,0x20,0xba,0xad,0x9c }, { 0xa9,0x60,0xc0,0xbe,0x3a,0x13,0x3f,0x9a,0xc4,0x99,0xcd,0xb0,0x8a,0xe8,0x9d,0x67,0xfa,0xb4,0xff,0x66,0x2e,0x85,0x15,0xf8,0x2d,0x7d,0x48,0x23,0xd8,0x16,0x82,0xab }, { 0x11,0x8f,0xe0,0xa4,0xaa,0x70,0x64,0xea,0x30,0xcc,0xed,0xf3,0x68,0x16,0xe6,0xd7,0x32,0x34,0xe2,0x41,0xe5,0x7a,0x2d,0x32,0x38,0xb1,0x7e,0xd0,0xdb,0xef,0x66,0x04 }, { 0xae,0x65,0x58,0xd4,0xc0,0xf8,0xa0,0x4f,0x7e,0x03,0x6b,0x16,0x02,0x5f,0x73,0xa8,0x47,0x61,0x12,0xc3,0xdc,0x54,0x7b,0x09,0x8a,0x44,0xa3,0x06,0x2e,0x8d,0x98,0x23 }, { 0xc9,0x38,0xf6,0x82,0xc4,0x92,0x4d,0x04,0xf7,0xc2,0x29,0xf4,0x98,0x17,0x3e,0x07,0x86,0xca,0x91,0x64,0x4a,0xf4,0x16,0x0b,0x5a,0x92,0x2b,0x96,0x44,0xfe,0xe3,0xb8 }, { 0xb9,0x5c,0x33,0x29,0x4f,0xcd,0x70,0x7f,0x48,0x87,0xfb,0x70,0x74,0x36,0x15,0xad,0x9d,0xf6,0x58,0x42,0x2a,0xdb,0x81,0xcd,0xf7,0x4c,0x54,0x71,0x0d,0xab,0x98,0x90 }, { 0xd6,0x45,0x5e,0xe6,0x07,0xfe,0x73,0x5c,0x57,0x6e,0x1a,0x84,0x31,0xb7,0x13,0xeb,0x70,0x5e,0x01,0xa5,0x57,0xc1,0xcb,0x10,0xa0,0x27,0xbb,0x3e,0xba,0x4f,0x86,0x01 }, { 0xa1,0x32,0xbe,0x64,0x7b,0x0a,0x38,0xd8,0xa8,0xf0,0x8e,0x24,0x1f,0x5f,0xb0,0x37,0xa9,0x96,0x0f,0x87,0xd1,0x5e,0xce,0x5e,0xcc,0xfe,0x55,0x93,0x1b,0x65,0xaa,0x5a }, { 0x17,0xca,0x80,0x90,0x38,0x66,0x76,0x04,0xef,0x98,0x76,0xfd,0x44,0xdf,0xd3,0x86,0x59,0x48,0x2a,0x1a,0x59,0x05,0x91,0x16,0xd2,0xf6,0xdd,0x60,0xbb,0x9f,0x59,0xf8 }, { 0x36,0x7f,0xb0,0x04,0x73,0x08,0x69,0x95,0x9b,0x45,0x38,0x1a,0xd5,0x31,0x86,0xd5,0x4b,0x93,0x8a,0x67,0xad,0x40,0x0d,0xc9,0x33,0x22,0x9e,0xc1,0x32,0x0e,0x2e,0xaf }, { 0xb0,0x58,0x35,0xcf,0x75,0x66,0x95,0xad,0x42,0xb9,0x8c,0x04,0x2a,0x68,0x9d,0xae,0x7b,0xbe,0xd9,0x75,0x49,0xb8,0x9a,0x9d,0x4e,0xa1,0xdf,0x11,0x02,0xc3,0x23,0x5a }, { 0xb0,0xf4,0x69,0x8f,0x78,0x10,0xc9,0x13,0x93,0x7b,0x95,0x23,0x64,0x54,0x92,0x3c,0x68,0xfe,0x4e,0xe5,0xe5,0x08,0x64,0xe0,0x22,0x88,0x91,0x69,0x1a,0xa6,0x1e,0x88 }, { 0xf2,0xfb,0x61,0xf0,0x97,0x66,0x19,0x52,0x9d,0x81,0xfb,0x58,0xa1,0x1f,0xb7,0x3f,0x85,0x52,0xe7,0x64,0xa8,0x61,0xb9,0x11,0x5c,0xdd,0x86,0xda,0x5c,0x27,0xef,0x6a }, { 0xa9,0x8f,0x2b,0x81,0x1e,0x63,0x09,0x76,0xb0,0x26,0x14,0x81,0xaa,0x06,0x24,0x2b,0x01,0x35,0xaa,0x5f,0x01,0x36,0xa7,0x77,0xa7,0x57,0x8c,0x0f,0x41,0xe5,0xc2,0x95 }, { 0xeb,0xde,0x18,0x01,0x0c,0xc7,0xfa,0x1e,0xc8,0x4d,0x10,0x9c,0xa4,0xfb,0x62,0x7f,0xbe,0x65,0xfc,0x46,0x45,0xe9,0x94,0x59,0x51,0xc4,0x3b,0x19,0xf5,0xe5,0xca,0xab }, { 0x78,0xb3,0x50,0x54,0x3c,0xe9,0xc8,0xe1,0xd7,0x76,0x76,0xc9,0xb2,0x76,0xc7,0x15,0xaf,0x88,0x28,0x03,0x5d,0x5f,0x88,0x24,0xfc,0xf9,0xe6,0x94,0x05,0xfd,0xbd,0x42 }, { 0xf1,0x6d,0xff,0x85,0x6a,0x22,0xe8,0x2f,0xeb,0xf5,0xbb,0x83,0x65,0x8d,0x58,0xb4,0xc1,0x56,0xcc,0x3c,0x6c,0xcc,0x89,0x63,0x84,0xc7,0x28,0x39,0x91,0xb1,0x9e,0x98 }, { 0x1e,0xe3,0xa5,0x54,0xc3,0x4e,0xb4,0xc2,0x62,0x88,0x07,0xc4,0xd5,0x00,0xe3,0x77,0xae,0x47,0x01,0x76,0x4b,0xb4,0x53,0x92,0xe9,0x6f,0xac,0x3a,0x55,0x1c,0x35,0x71 }, { 0xa2,0x07,0x82,0x56,0x9b,0x87,0xcd,0x2e,0xb9,0x0c,0x31,0xfe,0xde,0xcb,0x75,0xd7,0x22,0x8b,0xb5,0x05,0x56,0x6c,0xfb,0x50,0x2b,0x05,0x76,0x4a,0xcc,0x3f,0xd6,0x58 }, { 0x42,0xad,0x03,0x93,0xb5,0xda,0x22,0xb1,0x78,0xae,0xb9,0x50,0x8c,0xf6,0xa4,0x7d,0x99,0xbe,0xa8,0x23,0xc4,0x8a,0x33,0x93,0xfd,0xda,0x06,0x84,0xd4,0x21,0x97,0x7f }, { 0xc2,0xae,0x4f,0x23,0x94,0xd5,0x01,0x9b,0x09,0x42,0x52,0x73,0x25,0x20,0xeb,0x60,0x48,0x9e,0x31,0x2b,0x5d,0xad,0xa1,0xdc,0xcb,0xc6,0x7d,0x98,0x26,0x1d,0xe2,0xa0 }, { 0xd5,0xb2,0x51,0x61,0x01,0xbf,0xe9,0xe8,0x9d,0x91,0x15,0xc7,0x7c,0x80,0x3b,0x81,0x10,0x7e,0xef,0xe4,0x4e,0x99,0x3d,0x18,0x4c,0xfd,0xaf,0x85,0xa5,0xea,0x6b,0x71 }, { 0x74,0xa7,0x13,0x89,0x08,0xb2,0xa8,0xd5,0x58,0x0f,0xd3,0xf4,0xad,0x8e,0xd7,0x09,0xf1,0x2c,0x50,0xec,0x08,0x79,0x2b,0x29,0x82,0xd2,0x27,0x04,0x52,0xdf,0x51,0xf7 }, { 0x71,0x51,0xf0,0x74,0xdf,0x59,0x1f,0xeb,0xec,0x49,0x85,0x0b,0x31,0x16,0xa8,0x52,0x49,0x16,0x99,0x02,0x7c,0x5e,0x31,0xeb,0xc4,0x85,0xdb,0xe2,0x44,0x81,0xe6,0x05 }, { 0x37,0x80,0x6c,0x56,0xd8,0x27,0x68,0x3e,0x4c,0xed,0x40,0x92,0x06,0x0d,0x28,0x01,0x68,0xe8,0xed,0x61,0x22,0xa1,0xf2,0xc1,0xa3,0xcb,0x43,0x0e,0xbc,0xa7,0x0f,0x64 }, { 0x6a,0x96,0x2e,0x83,0xb0,0x3e,0x80,0x60,0xbb,0xb4,0xc4,0x57,0x58,0xdf,0xbb,0x1c,0x1d,0x91,0xd2,0xbc,0x01,0xa3,0xc9,0xd7,0xcf,0x89,0xbd,0x3d,0x9d,0x94,0x63,0xf7 }, { 0xb5,0x75,0xbf,0x77,0x58,0x7c,0xca,0x41,0x84,0x0a,0x38,0x14,0x84,0x88,0x03,0x9e,0xed,0xa8,0x01,0x5a,0xc6,0x6a,0xff,0x45,0x46,0x2b,0x72,0x64,0xd0,0x9c,0x44,0xc7 }, { 0x73,0x99,0x7b,0xcf,0x65,0x8a,0x01,0x85,0xf3,0xc3,0x9f,0x59,0xc4,0xb4,0xe2,0x05,0x0f,0xcd,0xe0,0x16,0x05,0xf3,0x2b,0xf9,0x5a,0xf8,0xb5,0xbe,0xed,0xe4,0x89,0xb4 }, { 0x5c,0x6d,0xfc,0x0e,0x59,0xa7,0xa8,0x29,0x7b,0x27,0xfd,0x5e,0x34,0xa9,0x9a,0x81,0xfb,0x9a,0x95,0x11,0x4b,0xa0,0xdf,0x61,0x45,0xa6,0xb2,0x45,0xf9,0x49,0x79,0xb9 }, { 0x2b,0x89,0x90,0x7d,0xa1,0xd5,0x9a,0x25,0xe7,0xd4,0xe9,0xa3,0xd3,0xbb,0x51,0x17,0x8d,0x9d,0x58,0xf0,0xe1,0x02,0xfc,0x7d,0x5b,0x08,0x2d,0xe9,0x85,0xcc,0x22,0xd4 }, { 0xf6,0x7c,0x99,0x9e,0x6f,0x90,0x1a,0x66,0x0e,0xb8,0x4a,0x9d,0x19,0x5f,0x94,0xae,0x4c,0x4f,0xa1,0x15,0x3a,0x7e,0x42,0x31,0x00,0x60,0xee,0xca,0x82,0x91,0x07,0x9d }, { 0x95,0x58,0x02,0x74,0xaa,0x2b,0xc5,0xec,0x0c,0x4c,0xf3,0x1b,0x06,0xf1,0x16,0x7d,0xe3,0x14,0xae,0x2f,0x2d,0x28,0xe2,0x79,0xea,0x91,0xfc,0x99,0xeb,0x49,0x21,0x22 }, { 0x95,0x8e,0x98,0x85,0xea,0xae,0xc9,0xd9,0x75,0x82,0xda,0x5a,0xfe,0x67,0x05,0xef,0x71,0x2b,0xa5,0x26,0xf0,0x80,0x8a,0xa0,0xcb,0x50,0x35,0xb7,0x14,0x7d,0x0f,0x2c }, { 0x4a,0xcd,0xcd,0x00,0x9b,0x44,0x69,0x84,0x93,0x91,0xa6,0xa2,0xda,0x0a,0x60,0xf2,0x48,0xf3,0xd8,0xb5,0x34,0xab,0xfe,0x15,0x87,0x71,0x51,0xcc,0x8e,0x49,0xda,0x03 }, { 0x14,0xc4,0x8a,0xc1,0xa5,0x56,0x53,0xd1,0xb8,0x44,0x9a,0xf2,0xd2,0x92,0x4b,0x36,0x4c,0xbf,0x99,0xb7,0x97,0xae,0xa4,0x06,0x8c,0x2a,0xda,0x59,0xf4,0x7e,0xba,0x3d }, { 0x42,0x99,0x37,0x20,0x4a,0xbd,0xd8,0x99,0xfe,0x66,0x07,0x41,0x81,0x50,0x82,0x1f,0x90,0x49,0x06,0x86,0x7c,0x65,0xa5,0xd3,0xed,0x74,0xe4,0xdf,0x87,0xf1,0x08,0xff }, { 0x5c,0x7a,0x52,0x28,0xd7,0x48,0xa5,0x2b,0xf9,0x83,0x7c,0xea,0x9e,0xe2,0x97,0x3c,0x7b,0x43,0x0a,0xc7,0x71,0x4b,0x0d,0x5c,0x7a,0x1a,0x75,0xbf,0x69,0x02,0x4d,0xe0 }, { 0xb9,0xa7,0x42,0x1a,0x14,0xfb,0x4c,0x3c,0x4c,0xc1,0x38,0x4e,0xce,0x37,0xec,0x25,0x82,0xcf,0x5a,0x69,0x39,0x75,0x5b,0x24,0xbe,0x1a,0xb5,0x72,0x5a,0x97,0xa5,0x3b }, { 0x25,0xf3,0xdc,0x5a,0x51,0x2d,0xce,0x8f,0x85,0xf4,0xe7,0xba,0x2b,0x5e,0x5b,0x0c,0x0f,0x97,0xd8,0x43,0xaa,0xd6,0x26,0x7b,0xdb,0xae,0xde,0xcf,0xf7,0x9a,0x28,0xe1 }, { 0x91,0xab,0x59,0x75,0x35,0xcc,0x44,0x74,0x2d,0x20,0x20,0x73,0xa0,0xe2,0xe1,0xc9,0x9b,0x29,0x98,0x15,0x35,0x0e,0xc7,0xa0,0x16,0x85,0x6f,0x29,0xed,0xbf,0x60,0x19 }, { 0xea,0xdb,0x53,0x3f,0x6e,0xd4,0xec,0x84,0x96,0xe4,0x21,0xe5,0x0f,0x79,0x0b,0x23,0x5c,0x1b,0x31,0xc5,0x24,0x6f,0x7a,0x08,0x2d,0xc3,0x0c,0xc0,0x67,0x63,0x9d,0x77 }, { 0xa6,0xb2,0xc4,0x46,0x42,0xc9,0xef,0x9f,0x9c,0x3d,0x65,0x62,0x65,0xba,0xb3,0x48,0xc0,0x47,0xe9,0x72,0xe7,0x26,0xb8,0xce,0x31,0xe3,0x22,0xe3,0x1d,0xb0,0xf0,0x95 }, { 0x5a,0x62,0x5f,0xff,0xc2,0xf4,0x14,0xf7,0xc0,0xc3,0xa4,0xe3,0xb8,0xae,0x9f,0xb3,0x8d,0x93,0xfd,0xcf,0x2d,0x31,0xd8,0x72,0xe6,0x86,0x38,0xfa,0x96,0x12,0xc6,0xe2 }, { 0x66,0x9e,0xc8,0x1d,0x99,0xb4,0x75,0x1e,0x83,0x30,0xe3,0x83,0x6e,0x24,0x5e,0x5e,0x0d,0xff,0x91,0x9a,0x54,0xd8,0xca,0x73,0x14,0x22,0x30,0x89,0x3b,0x67,0x72,0x9a }, { 0xca,0xb0,0x18,0x19,0xe9,0xf9,0x03,0xfa,0xa4,0xe9,0xf6,0x05,0xbc,0xf6,0xd2,0xd9,0x0b,0xb3,0x22,0x4d,0xe5,0x79,0x20,0x92,0x5a,0x18,0xdb,0x2f,0xd2,0xfc,0x1d,0xc3 }, { 0xe8,0x52,0x4f,0x4f,0x3f,0xd3,0x97,0xb6,0x31,0xc1,0xbf,0xfb,0x06,0xd5,0x2a,0xba,0x84,0x27,0xb1,0x3c,0x5d,0xdc,0x80,0x26,0x6f,0x37,0x56,0x45,0x3b,0xa7,0x07,0x32 }, { 0x4b,0x6c,0x43,0xd1,0x3d,0x7e,0xa0,0x37,0xef,0xd6,0x54,0xfa,0xb6,0x92,0x3f,0x20,0x1b,0x1a,0x9c,0x92,0xc4,0x7e,0x13,0x21,0xb6,0x17,0xda,0xa7,0x1a,0x55,0x94,0xa5 }, { 0xe6,0xeb,0xd1,0x66,0xfd,0x21,0x47,0x1b,0x8b,0x90,0x4f,0xa1,0x9b,0xfb,0x4a,0xab,0x30,0xe1,0xba,0x63,0xc0,0x2a,0xde,0xc5,0xb0,0x96,0x61,0x89,0x4e,0x9c,0x42,0x7d }, { 0x5b,0x94,0xd4,0x90,0xd9,0x6f,0x85,0x73,0x22,0xd8,0x1c,0x55,0xbd,0x31,0xe1,0x76,0xb3,0x3d,0x1a,0xc8,0x26,0xa1,0xf1,0xf1,0x4e,0x65,0x2f,0xdb,0x6a,0xc3,0xd0,0x99 }, { 0xee,0x07,0x3e,0x91,0xdb,0x93,0x0e,0x55,0x05,0x9f,0xe9,0xb5,0x39,0x94,0x82,0x55,0xa0,0xc2,0xd8,0x89,0x4b,0xe5,0x95,0xd4,0xee,0xcb,0x57,0xa5,0xca,0xa5,0xd9,0x34 }, { 0x19,0xf3,0xe7,0x36,0xed,0xc8,0x88,0x12,0x1c,0x0e,0xf4,0x84,0xd0,0x77,0x84,0x50,0x5c,0x95,0x35,0x9a,0xcb,0x24,0xa4,0x1a,0xea,0x54,0xd3,0xcf,0x46,0x38,0x5a,0xc8 }, { 0x17,0x27,0xba,0xae,0xca,0x0d,0xc3,0x60,0xbd,0x14,0x0c,0x61,0x83,0xc7,0x8b,0x03,0x5b,0xe7,0x19,0x91,0x39,0x25,0x4b,0x3e,0x38,0x83,0xf7,0x9d,0xc3,0xe6,0x73,0x74 }, { 0x68,0x8a,0x1e,0x32,0x49,0x73,0xe7,0xa5,0xeb,0xe9,0xbb,0x41,0x53,0x74,0x11,0xcf,0x1c,0x4a,0x24,0xa7,0xcf,0x1c,0x47,0x3d,0xec,0xac,0x1a,0x8d,0x4a,0x7d,0x2f,0x18 }, { 0x5d,0x77,0x2e,0x7a,0xb5,0xd2,0xc2,0x31,0x0b,0xd6,0xa7,0xc9,0x78,0x4a,0xc1,0xff,0x67,0xda,0x44,0x61,0x63,0xa0,0xa9,0x7e,0x67,0x0f,0x80,0x00,0xa0,0xa8,0x3e,0xa3 }, { 0x0f,0x85,0xd7,0x91,0x3e,0x9d,0x58,0xf0,0xcd,0x29,0xba,0x4e,0xd5,0x9e,0xbd,0x65,0xbe,0x7f,0x09,0x54,0x22,0xf4,0x93,0x65,0x05,0x06,0x90,0xa2,0xb2,0x8d,0x3a,0x46 }, { 0x99,0xb2,0xb0,0x99,0xe2,0x64,0x7c,0x96,0x2f,0xae,0x11,0xe9,0x8a,0x8b,0x4e,0x43,0x96,0x30,0xd4,0xcc,0xc4,0x20,0x75,0xa6,0x3a,0x05,0x5c,0xde,0x91,0x4d,0x0e,0xe5 }, { 0x53,0x86,0xf9,0xbc,0xa1,0xd1,0x30,0xeb,0x7d,0x40,0x8d,0x79,0x28,0xd5,0xe2,0xe9,0x58,0x30,0xe5,0x47,0xa3,0x45,0xe2,0x43,0x90,0x75,0x5a,0xd5,0x67,0x3f,0x9e,0x89 }, { 0x38,0xe5,0x8f,0x84,0x6f,0x03,0x10,0x1b,0x12,0x02,0x38,0x92,0x30,0xfc,0x9e,0x17,0xc7,0xf3,0xb8,0x14,0xd0,0xa6,0x88,0x03,0x02,0xf8,0x4a,0x73,0xdf,0xa9,0x0b,0xec }, { 0xb7,0x75,0xb9,0x8e,0x0a,0x0e,0xf8,0x4e,0x09,0xd1,0xac,0x5d,0xf3,0x1f,0x95,0x39,0x02,0xdb,0x56,0x50,0xb2,0xef,0x68,0x39,0x04,0x02,0xc7,0xe0,0x24,0x55,0x55,0x91 }, { 0xda,0x8e,0x10,0x24,0x67,0x0c,0xe0,0xcf,0x31,0x62,0x79,0xcc,0x88,0xe4,0x7e,0x70,0x46,0x67,0x1a,0xc4,0x73,0xfa,0x0a,0xeb,0xd9,0x38,0x1e,0xd9,0xb1,0xdd,0x6e,0x96 }, { 0xf0,0x3c,0x97,0x8a,0x21,0x86,0xc6,0xb8,0x64,0xb4,0x94,0x2e,0x5a,0x82,0x4c,0x90,0xa4,0xc8,0x40,0x82,0x01,0xa2,0x09,0x44,0x7d,0x75,0x08,0x77,0x84,0x76,0x3f,0x4a }, { 0x1f,0x55,0xbf,0x6a,0x0b,0x48,0x7b,0xee,0xde,0xc6,0x25,0x0f,0xc1,0x89,0xa8,0x08,0x56,0x0e,0xf1,0x1c,0x9a,0xfd,0x12,0xe9,0x19,0xd0,0x80,0xcb,0xc0,0x37,0xf5,0x4b }, { 0x9f,0xa7,0x07,0xc4,0x3c,0x4c,0x65,0x1a,0x74,0x1a,0xde,0x42,0xc1,0x93,0xb4,0x4a,0x8c,0xbd,0x6c,0xe0,0x7e,0xd6,0x03,0x1f,0x3f,0xb1,0x19,0xdb,0xc6,0xc8,0x44,0x4a }, { 0x98,0x15,0xf7,0x34,0x7c,0xb6,0x11,0xf1,0x2c,0xf4,0xcb,0xa4,0xbf,0xf7,0xf0,0x56,0xf8,0x7b,0x7d,0x25,0x53,0x91,0x8a,0x0e,0x8c,0x2a,0x32,0xb3,0x44,0x97,0x7f,0x64 }, { 0x84,0xf3,0x0d,0x7a,0x9e,0x10,0x67,0xbc,0x34,0xb0,0x24,0x56,0x0d,0x2d,0x71,0xf6,0xb3,0x91,0xec,0x3d,0xce,0x76,0x29,0x7d,0x68,0x6b,0x6c,0xc5,0xc0,0x70,0x61,0xd0 }, { 0xd3,0x84,0xbc,0xcb,0x4d,0x12,0xa0,0x35,0xf8,0xf5,0x99,0xca,0x26,0xb3,0x0c,0x15,0xa6,0x95,0x50,0x41,0x58,0x33,0x65,0x71,0x4e,0x11,0x4b,0x92,0xce,0x24,0x79,0x9a }, { 0xce,0x51,0x78,0x8b,0x24,0x74,0x71,0xd7,0xa0,0xdd,0x98,0x8a,0x5d,0xdd,0xcb,0x5c,0x91,0xf7,0x29,0x86,0x73,0xe8,0x11,0xb6,0x49,0xe0,0x1e,0x33,0x32,0xf7,0x0d,0x98 }, { 0xf0,0x76,0xa8,0x51,0x49,0xd9,0x21,0x58,0x6f,0x39,0xad,0x7b,0x4c,0x6f,0x9d,0x8a,0x55,0x4f,0xc4,0x19,0x33,0xe3,0xbf,0x2d,0x6e,0xb0,0x5a,0x53,0x4f,0x83,0x89,0x79 }, { 0x96,0xbc,0xbd,0x78,0x73,0x80,0x9e,0xe8,0x2f,0x33,0xea,0x0a,0xe4,0xb5,0xf7,0x99,0x5c,0xe0,0x5c,0x15,0x7a,0x5f,0xca,0xb1,0xe0,0x73,0xe3,0x2e,0x42,0x07,0x89,0x55 }, { 0x1e,0x7e,0x37,0x18,0x89,0xda,0x22,0xb1,0x2d,0x1e,0x0b,0xad,0x04,0xcb,0xf1,0x6d,0xdb,0xd1,0xbe,0xa8,0x55,0x6a,0x11,0x35,0xb3,0x95,0x9e,0xf6,0x9c,0xd7,0x11,0xb7 }, { 0xf7,0xa7,0x17,0x74,0x4a,0xca,0xdc,0x16,0x15,0xe4,0x05,0x75,0xc3,0xd2,0xb4,0xc6,0x66,0x60,0xa2,0xb3,0x14,0x87,0x06,0x7f,0x51,0x5d,0x2c,0x18,0x25,0x50,0xb9,0x2d }, { 0xa4,0xb7,0xbd,0xb9,0xf3,0x4e,0x62,0x6e,0x81,0x7a,0x94,0xf5,0x7d,0x8a,0xad,0x13,0xf1,0x47,0x1a,0xf1,0x77,0xfa,0xff,0x80,0xf7,0x43,0x02,0x3b,0x90,0xec,0x65,0x5b }, { 0x6c,0xfe,0x85,0x20,0xed,0x21,0x34,0xb4,0xc1,0xd0,0x4b,0x34,0x7f,0xe2,0x29,0x07,0xa0,0x40,0xfa,0xf5,0x33,0x4f,0xa4,0xba,0x10,0x0f,0xaa,0x27,0x81,0xfd,0x47,0xc2 }, { 0x92,0x6e,0xf0,0x70,0x94,0x84,0x76,0x9d,0xef,0x1a,0x8e,0x00,0x8c,0xbd,0x6d,0xea,0xd2,0x12,0x9f,0xba,0xeb,0xf2,0x6c,0x44,0x04,0x45,0x7b,0xaf,0x5c,0xc9,0x52,0x44 }, { 0xc2,0xd4,0xbc,0xa8,0x7c,0x14,0xec,0x11,0x30,0xe0,0x33,0xf0,0xf2,0xef,0x9c,0x64,0xbf,0x13,0xd7,0xf8,0x11,0x23,0xd4,0x0c,0xf6,0x52,0x45,0x15,0xf6,0x62,0x7b,0x18 }, { 0xcf,0xef,0x87,0xc2,0xf1,0x47,0x2d,0xc9,0x6e,0x5e,0x5e,0x91,0xad,0x6e,0xb6,0xe5,0x53,0xd9,0x60,0x08,0xa0,0x11,0x45,0xc9,0xce,0x2e,0xd3,0xef,0x77,0xa3,0x54,0xed }, { 0x88,0x06,0x94,0xbc,0xcb,0x14,0xaa,0x44,0x7d,0x83,0xe6,0x5b,0xa1,0xc8,0x44,0x5d,0x11,0x4c,0x86,0xe6,0x08,0x55,0x4e,0x5e,0xf7,0x6c,0xd8,0xc4,0x0d,0xa2,0xd4,0x51 }, { 0x04,0x81,0xdd,0xce,0xcc,0x70,0xe5,0x99,0x77,0xdd,0xec,0x44,0xa2,0x9c,0x9c,0x06,0x13,0x6e,0x09,0x38,0x88,0x64,0xae,0x7a,0xb7,0xb0,0x2d,0xa5,0x0a,0x6b,0xed,0xc7 }, { 0x97,0x9a,0xd4,0x8e,0x89,0x25,0xb8,0xfe,0xc4,0xf1,0xa7,0x69,0x2d,0xdf,0x81,0x3d,0x61,0xed,0x83,0x2a,0x93,0x37,0x82,0x61,0xfd,0xb1,0x1c,0xfa,0x57,0x5e,0x50,0x85 }, { 0x7b,0xdc,0xf0,0x0f,0x7f,0xea,0x39,0xc8,0xd2,0xfa,0xf4,0x93,0x8e,0x43,0xab,0xd8,0xbc,0x23,0x99,0xc0,0x56,0x1b,0xd0,0x7a,0x1d,0xd1,0x54,0x9f,0x32,0xa7,0x24,0x52 }, { 0xe4,0xa8,0x2a,0xf6,0xf2,0xfe,0xfa,0xd7,0x0a,0xd0,0x98,0xa1,0x87,0x13,0x10,0x9f,0xb8,0x28,0x52,0x45,0x0e,0x6d,0x2a,0x2f,0x80,0x25,0x67,0xa6,0xe7,0xeb,0x2b,0xed }, { 0xe7,0x02,0x16,0xac,0xfd,0xbb,0x4a,0xf5,0xab,0x79,0x0c,0xf0,0x90,0x3b,0x9c,0x11,0x23,0xd0,0x19,0x1b,0xc7,0x1a,0x3d,0x95,0xfc,0xea,0xc5,0x79,0xcc,0xad,0xff,0x98 }, { 0x53,0xeb,0xc3,0x32,0x43,0x99,0x60,0x8f,0x84,0xa1,0x1a,0x45,0x49,0x75,0x9b,0x85,0x60,0x7c,0x9c,0x98,0x74,0x3b,0xe9,0x3a,0x2e,0x5e,0x60,0xf3,0x20,0xfd,0x39,0xbf }, { 0x5b,0xd6,0x9c,0xfa,0x9f,0xb1,0xa3,0x61,0x03,0x16,0xa3,0x98,0x43,0xd7,0x57,0xda,0xca,0x5a,0xa0,0x27,0xaa,0x82,0xf9,0xf7,0x91,0xb0,0x27,0x05,0xab,0x11,0x28,0x60 }, { 0x40,0xc5,0x73,0xb2,0xf2,0x1a,0xef,0xf6,0x30,0x87,0x91,0xb2,0x85,0x78,0x90,0xf5,0x12,0x39,0x16,0x39,0xea,0xea,0x5e,0x6f,0x7f,0xed,0x1e,0x34,0xcb,0x3d,0x70,0xdd }, { 0x0b,0x45,0xd7,0xf7,0x66,0x37,0xee,0x67,0xd2,0xcf,0x56,0xd1,0xb8,0x86,0x34,0x01,0x3b,0x83,0xeb,0x3a,0x37,0xb0,0xc9,0x7e,0x07,0x21,0xcc,0x73,0xd2,0x2b,0x11,0x58 }, { 0xa8,0xa9,0xae,0x42,0x2c,0x2c,0x28,0xd3,0x76,0xd4,0xae,0x15,0xe1,0x45,0x47,0x22,0x15,0x6e,0x13,0x68,0xbc,0xfe,0xa1,0xf4,0xd2,0xbf,0xa5,0x23,0x17,0xb9,0xcf,0x2b }, { 0xe7,0x64,0x3a,0xcc,0x8a,0xa8,0x19,0x98,0x0b,0xda,0x04,0x5c,0x7c,0xdc,0x8e,0x7a,0x61,0x69,0xb3,0xc5,0x5c,0xc9,0x30,0xd4,0x32,0xaa,0x50,0xd6,0xae,0x41,0x31,0x96 }, { 0xae,0xeb,0x3f,0x45,0xda,0x52,0x74,0xe0,0x62,0x03,0xc4,0xed,0x88,0xbb,0xdc,0x6e,0x68,0x7a,0xb1,0x2a,0x02,0x41,0x22,0x72,0x63,0x3f,0xe3,0x6b,0x91,0x0b,0xc7,0x32 }, { 0x6f,0xd0,0x4f,0xe9,0xb7,0x88,0x20,0xd7,0x5a,0x08,0x72,0x20,0x94,0xd8,0x0e,0x0a,0x52,0x57,0x48,0x38,0x7a,0xf5,0x26,0x2f,0x3c,0xcf,0x4f,0x61,0x27,0xcc,0x42,0xd0 }, { 0xf8,0x35,0x4d,0xf2,0x7f,0xda,0xf3,0xd6,0x7c,0x9d,0xf3,0xf6,0x9a,0x3a,0x9f,0x27,0x58,0xf2,0x8f,0xad,0x77,0x1e,0x4b,0xf3,0xb9,0xce,0x58,0x4f,0x92,0x7f,0x19,0x3a }, { 0x22,0x98,0x50,0x54,0x56,0x0d,0x1c,0xba,0xf9,0x5e,0xd9,0x7d,0x05,0xb6,0xe4,0x47,0xa8,0x5d,0x4a,0x90,0x85,0x5c,0x63,0x24,0xb8,0x4c,0x47,0xe0,0x72,0x45,0xd5,0x40 }, { 0xeb,0x0e,0xfb,0x73,0xd0,0xb4,0x44,0x4f,0xec,0x6d,0x97,0x60,0x5d,0x98,0xa9,0xa9,0x45,0xbf,0xcd,0x99,0xf0,0x06,0x37,0x72,0xd3,0x27,0xb2,0x45,0x2b,0x19,0x2e,0xbf }, { 0x3c,0x2b,0x34,0x4b,0x38,0x49,0xb1,0x21,0x11,0x09,0x7b,0xdf,0x86,0x52,0x00,0xfe,0x45,0x39,0x1f,0x9d,0x42,0x54,0xe5,0xca,0x65,0xde,0x9d,0xd6,0x92,0xe2,0x71,0x32 }, { 0x29,0x71,0xb2,0xfd,0xb6,0x4b,0xb2,0xa5,0x01,0xf7,0x34,0x6a,0x91,0xa9,0x72,0x54,0x0a,0x59,0x09,0xa4,0x13,0x5b,0x18,0x4a,0x50,0x3d,0x21,0x9e,0xb4,0x07,0xe6,0xac }, { 0x9f,0x7d,0x41,0x12,0xf4,0x8b,0xfe,0x0b,0xbd,0xd0,0xd2,0xfd,0x8f,0x6c,0xaa,0x7e,0xee,0xb8,0xc3,0xba,0x14,0x39,0x81,0x30,0x13,0x20,0x57,0xac,0xe4,0x29,0x88,0x38 }, { 0xc1,0xc7,0xdb,0xec,0x7e,0xc0,0xa5,0xcf,0xe1,0x02,0x11,0x29,0x9d,0x8c,0x10,0xde,0xd7,0x9c,0x18,0xf7,0xc1,0xd0,0x4c,0xbe,0xab,0x06,0x92,0x4d,0x61,0x7c,0xb7,0x77 }, { 0x36,0x18,0x77,0x8d,0x0d,0xa7,0xdc,0x1d,0xc8,0xb0,0x24,0xca,0x05,0xc1,0xa1,0xd1,0x27,0xd3,0x56,0x3b,0x80,0xb1,0x88,0xa2,0x80,0x22,0xc1,0x9c,0xcc,0xb4,0x87,0x89 }, { 0xa3,0xfd,0x15,0xcf,0xfa,0x65,0x0f,0x79,0x61,0xac,0x96,0x21,0x08,0xd7,0x05,0x20,0xaa,0x40,0xe5,0xfd,0x90,0x8c,0xba,0x74,0x2d,0x8b,0x39,0x26,0x03,0x27,0xf2,0xcc }, { 0xfe,0x32,0x56,0x3a,0xd4,0x80,0xbc,0x47,0x14,0xf7,0x98,0xdc,0x3b,0x4b,0x44,0x82,0x47,0x1c,0xad,0xac,0xd1,0xc4,0xe0,0x51,0xea,0x2b,0xff,0x6f,0xc7,0x63,0xfc,0xea }, { 0x1d,0x06,0xee,0x3b,0x90,0xb4,0xd1,0xf4,0xe7,0x84,0xd9,0xe5,0xd3,0xd1,0x72,0x04,0x09,0xbe,0xa0,0x2f,0x9c,0x95,0x4a,0x1f,0x8f,0xbe,0xc6,0xeb,0xf0,0xa1,0x56,0x8d }, { 0xa9,0x7d,0xa3,0x1c,0x31,0x5c,0x1f,0x9e,0xcc,0x90,0x0a,0xe5,0x7d,0xa7,0x21,0x1f,0x55,0x71,0xc2,0xee,0x13,0x88,0x77,0x42,0x83,0xda,0x51,0x5d,0x12,0xa4,0xa6,0x7a }, { 0xb5,0x5c,0xee,0x2f,0x8c,0x1b,0xd9,0x75,0x7b,0x91,0xa4,0x6e,0xe0,0x62,0x97,0x72,0x3a,0x12,0x6c,0xea,0x82,0x2c,0x71,0xef,0xb8,0x00,0xf3,0xd4,0xce,0xc3,0x16,0xf2 }, { 0xb1,0xcc,0x9f,0xc5,0xc5,0x6a,0x1d,0x1f,0x13,0xa8,0x9c,0x49,0x5a,0x2c,0x24,0x62,0x56,0x25,0xe6,0x76,0x35,0x15,0x7b,0xf1,0xc2,0x04,0xbf,0xaa,0xa7,0x24,0x2c,0xa1 }, { 0x9e,0x75,0x93,0x01,0x38,0x1f,0x44,0x14,0xcd,0xec,0x40,0x06,0xae,0x0c,0x78,0x6a,0x83,0xea,0x92,0x2e,0x95,0x51,0x2f,0x3d,0x97,0x5c,0x00,0x75,0x96,0x84,0x65,0x3e }, { 0x55,0xc8,0x41,0xb7,0x13,0x62,0xb8,0xbe,0x5f,0x8f,0x1c,0xb1,0x78,0x0e,0xfd,0xf3,0x59,0xed,0x35,0xc1,0xd4,0x4a,0x21,0x0b,0xf0,0xf5,0xad,0xae,0x75,0x70,0x72,0x8d }, { 0x93,0xc4,0x0c,0xdf,0xd4,0x07,0x09,0xda,0x3e,0x4c,0x05,0x57,0xa8,0xc7,0x66,0x22,0x7a,0xf9,0xec,0xa3,0x4c,0xce,0xd7,0xd1,0x7a,0x4b,0xb0,0xe2,0x0e,0x09,0xdd,0xf9 }, { 0xee,0xe7,0x06,0x4b,0xfa,0x70,0xab,0xdd,0x7c,0x66,0xb4,0x4b,0xf4,0xbc,0x5e,0x6b,0x9c,0x62,0xa2,0xcb,0xa1,0x25,0xaf,0x0c,0x41,0x3d,0xcc,0xf5,0xab,0x81,0xab,0x83 }, { 0xfb,0xfc,0x15,0xcf,0x61,0x1b,0xe9,0xe4,0xa5,0x8b,0x83,0x60,0xf7,0x66,0xfc,0xd0,0x8f,0xe7,0xea,0xf1,0x20,0x3e,0x25,0x8f,0xa1,0xf3,0xb4,0xa8,0xcf,0x0a,0xd3,0x8e }, { 0x9a,0x02,0xd1,0x18,0xa3,0x4e,0xd3,0x60,0x86,0x3e,0xd4,0x12,0x21,0x9f,0x66,0xe4,0x53,0x36,0xd9,0xd5,0xf3,0x72,0xff,0x51,0x7a,0x2f,0x06,0x2c,0x5f,0x8d,0x09,0xd9 }, { 0x65,0xe1,0xc8,0x38,0xa7,0x49,0xb4,0x9c,0x76,0x08,0x76,0x70,0x25,0x3e,0x3f,0x8e,0xa4,0xe0,0x2e,0x45,0x85,0x7d,0x43,0xd5,0xbb,0x7a,0xb6,0x8e,0x9d,0x1d,0x0b,0xce }, { 0xe6,0x58,0x44,0x6d,0x17,0x8a,0x23,0x11,0x01,0xef,0x2a,0xf7,0x42,0xb2,0x78,0xc7,0xef,0xd5,0x8b,0x7a,0x50,0x0c,0xf5,0x10,0xf7,0xd4,0x93,0xa2,0x5e,0xeb,0x53,0xf5 }, { 0x3f,0x4c,0x56,0x1d,0xdf,0x4a,0x80,0xf0,0x6d,0xeb,0x9a,0xbd,0x62,0xab,0xcc,0xe6,0xf7,0x30,0x78,0x4e,0x5a,0x8d,0xe8,0xc4,0xa2,0xef,0x2f,0xf4,0x16,0x00,0x4f,0x83 }, { 0x16,0x8f,0x76,0x89,0x2c,0x7d,0xe3,0x99,0x52,0x8e,0x84,0x62,0x9d,0xf1,0x97,0x3d,0xd5,0x1b,0x91,0x20,0x93,0x31,0x4a,0x22,0x35,0x83,0xa1,0xda,0x4c,0x94,0xcd,0xd9 }, { 0xc1,0x8a,0xea,0xe8,0xfa,0xc9,0x96,0x79,0x97,0x82,0xd2,0x9f,0xf7,0x98,0x7a,0x4e,0xae,0x8d,0xd1,0x0c,0xd4,0xad,0x37,0xbc,0xe4,0x8b,0xdc,0x2e,0x1d,0x0c,0xcf,0x84 }, { 0x0d,0x68,0x6c,0xd7,0xfe,0x21,0x80,0xb0,0xf6,0x64,0x9a,0xc6,0x1f,0xc2,0x75,0x2f,0xb6,0x43,0x25,0x28,0x0b,0x49,0x86,0xa6,0xba,0x84,0x8e,0x18,0x31,0x0d,0x25,0xfc }, { 0x42,0x1f,0xfe,0xab,0x04,0x33,0xe3,0x9e,0x85,0x7c,0xf6,0x9f,0xa7,0xbd,0xf4,0xbe,0x80,0x0c,0xf7,0x98,0xa0,0xf5,0x60,0x28,0x04,0xd8,0x6e,0x89,0x20,0xb7,0x77,0x32 }, { 0xbd,0x48,0xef,0x70,0xe8,0x6a,0xba,0xd8,0x22,0xa1,0xfa,0x75,0xc6,0x55,0xf7,0x16,0xad,0xd0,0xee,0xa9,0xb3,0x73,0x7f,0x0f,0x62,0xc5,0x11,0x7d,0xf9,0xb9,0x1b,0x03 }, { 0x25,0x47,0x9a,0x84,0x95,0x5e,0x2e,0x74,0x62,0xac,0x89,0x22,0x0b,0x3f,0xfa,0x0b,0x67,0xa4,0x5c,0x24,0xbe,0x03,0xc0,0xbb,0x37,0x91,0xe1,0x82,0xb0,0x73,0xe6,0x52 }, { 0xa8,0x5a,0x28,0x7b,0xaa,0x73,0xf1,0x97,0x65,0x1c,0xe3,0x63,0x95,0x45,0xa4,0x31,0x3f,0x29,0xd7,0x40,0x12,0x5a,0xce,0xc5,0x87,0xe3,0xfd,0x7b,0x7c,0xba,0x8e,0xa8 }, { 0xe2,0x7b,0x0e,0xb8,0xcb,0x10,0x7c,0x84,0x3d,0x7d,0x35,0x90,0x8b,0x76,0x2b,0x56,0x8b,0x64,0x12,0xbb,0x99,0x80,0xaf,0xe1,0xac,0x7e,0xe8,0xfc,0x0b,0x4c,0x85,0x8b }, { 0x82,0x71,0x1c,0x1f,0x5a,0x94,0xab,0xb1,0xde,0xa2,0xfc,0xae,0xbc,0xf8,0x28,0xe4,0x79,0xc6,0xe2,0xb4,0xc7,0x40,0x5d,0x98,0xee,0xf6,0x7f,0x2c,0x55,0x86,0xd0,0xd1 }, { 0x36,0x2f,0x7e,0x46,0x61,0x70,0x2c,0x8c,0xa6,0x99,0xba,0x90,0xc9,0x3e,0x8f,0xa7,0xe9,0xa7,0xdf,0xa0,0x1f,0xb3,0xe2,0x8c,0xc1,0x09,0x96,0xb0,0x46,0xf9,0x33,0xeb }, { 0x75,0x05,0x92,0x46,0x79,0x45,0xa9,0x44,0x32,0x19,0x5d,0x31,0xa0,0x6a,0x54,0x27,0xb8,0x6d,0x1e,0x72,0xd4,0x43,0xa3,0xb9,0xf1,0xb6,0x0b,0xa7,0x68,0xc8,0x1c,0xc2 }, { 0xd4,0x41,0xa2,0x7a,0xcb,0xa1,0x7b,0xa5,0xf6,0x26,0xdc,0xb1,0xba,0x90,0x02,0x72,0x0a,0xc4,0xc4,0x31,0xd5,0x97,0xcc,0x64,0x7e,0xdf,0x5f,0xb1,0xd8,0x72,0x2b,0x64 }, { 0x2a,0xe1,0xb5,0x7b,0x36,0x74,0x59,0xc6,0xcb,0x95,0x90,0x2e,0xd3,0x0d,0xc3,0x9c,0x28,0xed,0x26,0x35,0x61,0x3b,0x6b,0x39,0x84,0x03,0x61,0x2b,0x57,0xb7,0x78,0x70 }, { 0x36,0x0b,0x62,0x08,0x74,0xee,0xec,0x6a,0x2f,0xfc,0xce,0xe2,0xbf,0x4d,0x41,0x79,0x82,0xa0,0xc6,0xf8,0xd3,0xc0,0xd4,0x17,0x48,0x5a,0xc2,0x30,0x64,0xb7,0x93,0xf9 }, { 0x19,0xdc,0xae,0xee,0xe9,0xe9,0x5f,0xad,0x0f,0x44,0xff,0xcd,0xc3,0x96,0x49,0x9c,0xaf,0x22,0xf6,0xc3,0x5a,0x94,0x5e,0x2f,0x9c,0xd2,0xcb,0xef,0x3a,0xcc,0x98,0x20 }, { 0x71,0x75,0xed,0xc3,0xee,0xe6,0x9d,0x36,0x5f,0x2a,0x96,0xa4,0x05,0xf7,0x35,0xa4,0xfc,0x4c,0x54,0xe5,0x0e,0xcc,0xc9,0x0a,0x45,0x34,0x8d,0x8b,0xb8,0xee,0x80,0xdc }, { 0x27,0x8d,0xab,0x78,0xd2,0xfc,0x8b,0x6f,0xe7,0x46,0x7d,0xe2,0xbe,0x08,0xd5,0x5d,0xea,0x03,0xfb,0xe9,0xc3,0x07,0xd5,0x32,0x62,0xcd,0x02,0xc0,0xc4,0x68,0x5d,0x8b }, { 0xc1,0x63,0xa1,0x79,0x05,0x0b,0x94,0x4c,0xaa,0xdf,0x61,0xaa,0x7a,0x43,0x57,0x15,0x16,0x2e,0xd4,0x93,0xef,0x72,0xbb,0x63,0x32,0x4e,0x8d,0x16,0xb2,0x40,0xc4,0x8a }, { 0xe8,0x91,0x7d,0xde,0xb2,0x18,0xb4,0x8f,0x75,0xd8,0x14,0x00,0xc6,0xfd,0xa5,0x99,0x71,0x4f,0xa6,0xd5,0x62,0x37,0x10,0xd9,0x92,0x47,0x9c,0xb5,0x41,0x38,0xe1,0x88 }, { 0xdb,0x4d,0x67,0xee,0xbe,0xc4,0x37,0xa1,0xb1,0xc8,0xfa,0x2f,0xee,0xea,0xf3,0x63,0xec,0x7c,0x7c,0x83,0x09,0x3a,0x3d,0xfb,0xa9,0x79,0x31,0x24,0xe7,0x33,0xcf,0xdb }, { 0x0c,0x09,0x95,0xd3,0xd5,0x20,0xa3,0xb5,0x65,0x15,0xfc,0x53,0x58,0x92,0x59,0x87,0x87,0x43,0xce,0x67,0x8c,0x1f,0xb2,0xc5,0x5f,0x2a,0xb6,0x92,0x07,0x85,0xa5,0x00 }, { 0x0e,0xc4,0x67,0x33,0x19,0x47,0xd3,0x6f,0x03,0x23,0x59,0x0d,0x04,0x7f,0xb0,0x8b,0x4d,0x32,0x8a,0xe2,0x63,0xaa,0xa1,0x58,0x72,0x2e,0xde,0x50,0x18,0x6a,0x61,0x82 }, { 0xb1,0xb8,0x71,0x68,0xbe,0xb3,0x97,0x51,0xf6,0x26,0x01,0xd1,0xbb,0x1c,0x97,0x7f,0xe8,0x45,0xfb,0xe1,0xd4,0x71,0x29,0x36,0x88,0xa2,0xb4,0xc2,0xfb,0x56,0x2b,0xc9 }, { 0x02,0x63,0xbe,0x38,0xdf,0x59,0x13,0x3b,0xc8,0xe4,0xfc,0x59,0x9f,0x51,0x9a,0xfb,0x51,0xd0,0x61,0xf9,0xb1,0x2e,0x05,0xb1,0xe1,0x9e,0x49,0x12,0xaa,0xad,0xca,0xc4 }, { 0xe4,0xad,0x83,0xc7,0x2d,0x3c,0x9c,0x01,0xda,0x92,0xf2,0x8f,0x90,0x6b,0x8c,0x75,0x46,0xda,0x41,0xc4,0xb2,0x3f,0x55,0x0c,0x7b,0x62,0x6a,0xd4,0x78,0x55,0xaf,0xdc }, { 0x7c,0x1b,0xd5,0x14,0x73,0x88,0x77,0x27,0xbf,0x82,0xad,0x52,0x65,0x0f,0x41,0xbd,0x5c,0x11,0x75,0xd7,0x1a,0x91,0x15,0x43,0xd2,0x17,0xbe,0xb8,0x1e,0x9c,0x3a,0x3c }, { 0x95,0xa6,0xcd,0x97,0x93,0x6f,0x8e,0x4e,0x05,0xc5,0x77,0x23,0x7b,0x97,0x41,0xaf,0x6d,0x7c,0xaa,0xd5,0xe4,0x49,0xb3,0x35,0xad,0xfb,0xc0,0xaf,0x01,0xbb,0x4a,0x1c }, { 0x47,0xa0,0x3e,0x0a,0x93,0x95,0xc2,0x4e,0x03,0x10,0xbb,0x0a,0x44,0x3f,0x00,0x08,0x4f,0xdb,0x11,0xc9,0x45,0x0f,0x12,0xc7,0xa3,0xcd,0xe8,0x35,0x22,0x80,0x63,0x0d }, { 0x4a,0x92,0x0e,0xc5,0xa4,0xa3,0x66,0xf8,0x51,0xa9,0x6d,0x53,0x67,0x52,0xab,0x6e,0xdc,0xac,0xd6,0x37,0x4d,0x41,0x97,0x92,0xec,0xae,0xe2,0x1d,0x6c,0xcc,0x7c,0x7f }, { 0x58,0x27,0xbd,0x30,0xdd,0xa0,0x24,0xbc,0x7d,0x74,0xa7,0x5f,0x2c,0xa2,0x33,0x57,0x80,0xa3,0xe9,0x3a,0xcd,0x2c,0x74,0xca,0x97,0x2c,0x6a,0xf2,0x94,0x95,0x87,0x69 }, { 0xe7,0x02,0x54,0x46,0xa4,0x75,0xe0,0x9c,0x22,0x2c,0xe1,0x62,0x33,0xf0,0x0e,0x22,0x51,0x5c,0x69,0xa3,0xae,0xd8,0x14,0xb9,0xbb,0x2f,0xb2,0xc4,0xb5,0x75,0xfb,0x46 }, { 0x9a,0x82,0x90,0x59,0x1f,0x61,0x30,0x49,0x5b,0x3a,0xec,0x50,0xce,0x9c,0xbe,0x1b,0x40,0x4f,0xae,0xb4,0xf4,0xfd,0x06,0x84,0xcd,0x53,0x99,0x5e,0x53,0xb4,0xb1,0xb7 }, { 0x87,0x50,0xb4,0x5f,0xb7,0x62,0xba,0xab,0x0b,0x72,0x06,0xce,0xb4,0x77,0x57,0x6f,0x9c,0xdf,0x66,0xda,0x0a,0x26,0xf2,0xf2,0x66,0xc6,0xf2,0x2e,0x40,0x0d,0xbe,0xd3 }, { 0xfc,0x15,0xb7,0xf1,0xfd,0xcf,0xd0,0xe9,0x2b,0xbb,0xb0,0xd7,0x94,0xf6,0xb9,0x05,0x5e,0x67,0x5b,0xaf,0x68,0x3c,0xae,0x24,0xb9,0xfc,0x30,0x76,0x0c,0x5e,0x43,0x3d }, { 0x5d,0x0a,0x65,0x5b,0xbd,0x37,0x45,0x65,0x76,0x0a,0xf8,0x4c,0xae,0x44,0x8d,0x25,0x1e,0x94,0xe6,0xd7,0x18,0x90,0xf2,0x1e,0x44,0xec,0x6e,0x52,0x6c,0x40,0x25,0x95 }, { 0x6c,0x00,0x52,0x76,0xe6,0xbc,0x7a,0x12,0xc3,0x55,0xe5,0x3d,0x7f,0x30,0xb7,0x69,0x98,0xd6,0xf2,0xf6,0x47,0xa7,0xf8,0x19,0xa5,0x5e,0xa3,0xbc,0xce,0x40,0xac,0x16 }, { 0x6a,0xc6,0x85,0x90,0x9a,0x22,0x8d,0x77,0x95,0xef,0x2f,0x7e,0xb9,0x96,0x11,0x69,0x00,0xa7,0xef,0x86,0x42,0xf2,0x2f,0x70,0x99,0xa0,0x37,0xa0,0xd0,0x96,0xe3,0x5a }, { 0x68,0x13,0xc8,0x9e,0x4c,0x9f,0x4b,0xa7,0x24,0x0c,0x8a,0xd4,0x56,0x0b,0xe7,0xa7,0xf3,0xbc,0x00,0x19,0xcc,0x97,0x5a,0x20,0xe4,0x92,0x28,0x0a,0x90,0xb5,0x3c,0xb2 }, { 0x98,0xbc,0x90,0x56,0x38,0x4c,0x17,0x59,0x31,0xc4,0x96,0xac,0xa7,0x40,0xb4,0xbe,0xc3,0xfe,0x46,0x9d,0xcf,0x02,0xf1,0x11,0x0c,0xf0,0x72,0x47,0xef,0xd0,0xa7,0xc9 }, { 0x0d,0xae,0xab,0x9d,0x22,0x74,0x1a,0xb5,0x83,0xcd,0xc7,0x23,0xf9,0x22,0xbf,0x38,0x37,0x76,0x4b,0x27,0x88,0xcd,0xe2,0xae,0x17,0x6a,0xb3,0xbe,0xdd,0x60,0x53,0x4d }, { 0xe9,0x41,0x73,0xdd,0xc4,0xe9,0xa1,0x46,0xb7,0xd3,0x05,0x4e,0xe7,0xba,0xd1,0xf2,0x86,0x53,0x23,0x71,0xd8,0xf2,0xa6,0xd8,0x8e,0xcb,0x09,0xa7,0xe8,0xe7,0xa4,0xcb }, { 0xb5,0xda,0x9b,0x1a,0xb3,0x8b,0x0c,0xae,0x72,0xe3,0x11,0x02,0x2f,0x26,0x45,0xdf,0xa0,0x68,0xba,0x9e,0x24,0x70,0x86,0x5d,0xf3,0xa2,0x75,0xdb,0x78,0x13,0x6f,0x2d }, { 0x23,0x3b,0xd1,0x92,0xd4,0x10,0x1f,0xdc,0x01,0x65,0x2d,0x40,0x7a,0x6f,0x34,0x96,0x14,0x0a,0xb3,0xf7,0x30,0xfa,0xe0,0x20,0xbf,0x37,0xf4,0x86,0x5e,0xd6,0xc6,0x30 }, { 0xf6,0x96,0xe2,0x2e,0xe4,0x58,0xce,0xbc,0xff,0xdf,0xc6,0xc1,0x48,0xc4,0xc5,0x2a,0x75,0xed,0xf4,0x13,0x86,0x94,0xcd,0x95,0x42,0x4f,0x3d,0x81,0x5c,0xcb,0xe6,0xa6 }, { 0xaf,0x33,0xc1,0x5e,0x3b,0xc2,0x16,0x0a,0x0f,0x1a,0xd1,0x41,0xd9,0xa9,0xec,0x76,0xb4,0x2f,0x34,0xfb,0x47,0xbc,0x95,0xff,0x8c,0x63,0x68,0x24,0x26,0x04,0x55,0xbc }, { 0x9e,0xd3,0xc0,0x08,0x9b,0x5f,0x79,0x0c,0x7b,0x82,0xe9,0x8a,0xb6,0xe5,0xe4,0x5b,0x8e,0x26,0xe1,0x61,0xff,0x4c,0x83,0x8d,0x66,0x59,0x0b,0x6c,0x65,0x64,0xeb,0xb9 }, { 0x55,0x10,0x53,0x30,0xa3,0x5f,0x9f,0x3d,0x5f,0x6a,0x28,0x36,0x2d,0x9d,0xa1,0x07,0x07,0xf8,0x19,0x28,0x3f,0x38,0xfd,0xe8,0x05,0x7b,0x34,0x38,0xd6,0x46,0xf1,0x02 }, { 0x1d,0x80,0xf8,0xcd,0xf9,0x18,0xce,0x43,0x8a,0xf3,0xc6,0x37,0xac,0x84,0xa1,0x94,0x5d,0x09,0x3b,0xbf,0x92,0x41,0xa1,0xdd,0x17,0x70,0x75,0x90,0x90,0xb1,0x05,0x9f }, { 0x61,0xc7,0x63,0xfc,0x93,0x3d,0x3f,0xe2,0xd5,0x39,0x84,0x2d,0x1a,0x94,0x62,0xae,0x41,0x86,0x38,0x53,0x23,0x6e,0xa7,0xee,0x73,0xb5,0x69,0xd7,0xd6,0xc0,0x3d,0xc9 }, { 0xf3,0x4d,0x45,0xe0,0x73,0x2e,0x61,0x8c,0xda,0x25,0xc1,0x5f,0x8e,0xc2,0x33,0xd9,0x63,0x51,0x41,0xc1,0x92,0x06,0xa7,0x80,0xda,0x70,0xcb,0x1c,0xa0,0x7f,0x32,0x63 }, { 0xa6,0xb5,0xca,0xfb,0xd3,0xad,0xf4,0x74,0xde,0x77,0x0f,0x73,0xd4,0xca,0x11,0x5c,0x56,0xd6,0x08,0x4d,0x1e,0x1c,0xcd,0xde,0xe4,0x15,0x8f,0x41,0x75,0xc9,0xd0,0x5e }, { 0x62,0x78,0x89,0x30,0x37,0x8e,0x7c,0x83,0x7a,0x28,0x7b,0xfb,0x72,0xd3,0x9e,0xc4,0x5c,0xe2,0x58,0xa8,0x05,0x52,0x16,0x37,0xaa,0x5f,0x34,0x54,0xd0,0x5b,0x62,0x68 }, { 0x15,0xc0,0x4e,0xa8,0xbd,0x77,0x1a,0x4a,0x58,0x98,0x96,0xdb,0x9d,0x95,0x97,0x0d,0xb9,0xab,0x00,0xf1,0x95,0xfb,0x73,0x64,0xd1,0x96,0xf9,0x3f,0x67,0xb3,0xf5,0x27 }, { 0x03,0x6f,0xf6,0x41,0xde,0x85,0xdc,0x13,0xda,0xd3,0x92,0x66,0xba,0xbb,0x74,0x7d,0xf7,0x59,0xe6,0x8a,0xab,0x1a,0xe9,0xce,0x3c,0xdb,0xb6,0xd5,0x51,0x5e,0x16,0x26 }, { 0x23,0xec,0x63,0x9a,0xba,0x39,0x6e,0x4c,0x51,0x78,0x35,0xdf,0xe3,0xab,0x7b,0x4f,0xdc,0xaa,0xe0,0x94,0xaa,0x51,0xe7,0x83,0xc6,0x1a,0x2c,0xf2,0xf1,0x4f,0x21,0x5f }, { 0x70,0xe0,0x4b,0x93,0xb5,0x3e,0x79,0x9a,0xe4,0x9b,0x85,0x72,0x82,0x0a,0xb7,0x93,0x3d,0xb2,0x56,0x3d,0x14,0xd6,0x8e,0x35,0xaa,0xe8,0x11,0x18,0x16,0xf1,0x34,0x91 }, { 0x3e,0xf5,0xdc,0x8b,0x66,0x60,0xdb,0x12,0x8e,0xa0,0x76,0xb0,0xa8,0x29,0x48,0x41,0xde,0x69,0x1a,0x80,0xbe,0x30,0xf9,0x3b,0xd9,0xca,0x0d,0x8d,0x26,0xf9,0x60,0x6e }, { 0xf2,0xfb,0x28,0xd1,0xf9,0xc6,0x60,0x1c,0xbc,0x47,0xbe,0xb1,0xfa,0x7d,0x0b,0xfc,0x84,0x05,0xc6,0x46,0x07,0xfc,0x58,0xd1,0x20,0x7d,0x2c,0xac,0xb2,0xae,0x9c,0xa1 }, { 0x0e,0x13,0x94,0xb0,0x0b,0x46,0x47,0x2b,0x0a,0xb3,0x92,0xd5,0x88,0xf5,0xb6,0x53,0x5c,0x48,0x6d,0xfb,0x2c,0xcd,0x26,0x94,0x83,0xe0,0x53,0x68,0x0a,0xe5,0x49,0x28 }, { 0x6e,0xa5,0xae,0xf9,0xb1,0xe7,0xff,0xa6,0xaa,0xdd,0xb6,0x6f,0x76,0x2a,0xbc,0x93,0x14,0xbf,0x9b,0x1c,0xf8,0x0d,0xa0,0x67,0x25,0x44,0x1e,0xa8,0x87,0xd0,0x94,0x4d }, { 0xed,0xf1,0x02,0xad,0x38,0x38,0xe8,0x3f,0xc6,0x45,0x57,0xc4,0x64,0x58,0xc9,0x75,0x93,0x9b,0x43,0x63,0xa2,0xb0,0x94,0x2e,0x9f,0x1b,0xab,0xad,0x63,0xa5,0xca,0x43 }, { 0xa0,0x8a,0x93,0xab,0x17,0x23,0xed,0x85,0x99,0x0d,0x01,0x88,0x48,0x36,0xaf,0x21,0xec,0xba,0xd6,0xa1,0xdb,0x71,0xb0,0xc0,0xcd,0xd8,0xbe,0xc6,0x18,0x74,0x6e,0x6a }, { 0x44,0x2b,0xd7,0x60,0x4d,0x9b,0xad,0xeb,0x58,0x15,0x7d,0x77,0xa7,0x4b,0xf9,0x65,0xcf,0xe7,0x3d,0xf9,0x9c,0xb8,0x5b,0x11,0x05,0x56,0x35,0xc8,0x17,0xd2,0xbe,0xc3 }, { 0xcf,0x27,0x0d,0x69,0x2c,0x5a,0x35,0x87,0xc0,0xa0,0x52,0x57,0x79,0x43,0xfb,0xb9,0x6f,0x77,0x40,0x02,0x3b,0x7b,0xd9,0x0c,0x11,0x88,0x4f,0x16,0x33,0x4d,0x4b,0xdd }, { 0xdb,0x3e,0x11,0xa6,0x27,0x73,0x43,0x37,0xff,0xe0,0x2b,0x85,0x39,0x05,0x66,0x23,0x49,0x49,0xc0,0x61,0x50,0x8e,0xc2,0x64,0xf1,0x1d,0x8e,0x91,0xf6,0xf2,0x44,0x35 }, { 0x7c,0x20,0x0a,0x17,0x89,0x87,0x24,0x82,0xa6,0x2b,0x21,0x96,0x41,0xb0,0x69,0xbb,0xf8,0xf8,0x91,0x0e,0x62,0x7d,0x43,0xdd,0xf3,0x63,0x35,0x5b,0xb2,0xb9,0x67,0x5e }, { 0x41,0xee,0x04,0xbe,0x99,0xb4,0xd5,0x37,0x8c,0x71,0xad,0x42,0x46,0x2b,0xce,0xea,0x9e,0xff,0x94,0xca,0xb6,0xfa,0x68,0xe0,0x74,0xdd,0x84,0xb0,0x5b,0x2c,0xaf,0xe7 }, { 0xfd,0x5e,0xd3,0x17,0xaf,0x6b,0x68,0xd2,0x19,0x38,0x2d,0x0c,0x26,0x27,0x50,0x34,0x28,0x78,0x2c,0x57,0xeb,0x8f,0x70,0x7b,0x7e,0xac,0xa1,0x87,0x65,0x0e,0xd8,0x7d }, { 0x6e,0x00,0x29,0xff,0x00,0x80,0x9e,0xd4,0xdd,0x21,0x4a,0x95,0x03,0xa3,0x63,0x72,0xa8,0x6b,0x4f,0xbf,0x80,0x8e,0x2f,0x78,0xbb,0x5e,0x12,0xee,0x8e,0x58,0xa1,0x5a }, { 0xb4,0x12,0xa5,0x31,0xf3,0xb4,0x22,0x44,0xf9,0x34,0x3f,0xec,0x3a,0x4e,0x81,0x48,0xb4,0xcd,0x9e,0x4e,0x4b,0x47,0x94,0x37,0x4d,0x2e,0x7e,0x98,0xea,0x2c,0xeb,0x2e }, { 0x3b,0x15,0x52,0x54,0x9c,0xb4,0xbb,0x6d,0x5b,0xea,0xd0,0x81,0x54,0xd8,0x4f,0x02,0xb4,0xe9,0xf6,0x8f,0x6a,0xd8,0x2b,0x78,0x59,0xec,0x65,0xdb,0xbe,0x7a,0x08,0xed }, { 0xe3,0x59,0xae,0x58,0x75,0x40,0xa4,0x88,0x2e,0x74,0xb2,0x74,0xa3,0xc3,0x0c,0xd0,0xaf,0x27,0xa0,0x7d,0x2c,0xaa,0x78,0x38,0x4b,0x85,0x4f,0x5b,0xf5,0x9c,0x23,0x69 }, { 0xb2,0x42,0x35,0x11,0xb2,0x27,0xad,0x34,0xdb,0xfe,0x53,0x18,0xc8,0x34,0x8d,0x7e,0x8b,0xba,0x32,0x19,0xc6,0xca,0x7b,0xa3,0xe2,0xf8,0x67,0xa1,0x6e,0x6f,0xc7,0x3a }, { 0xb6,0x1b,0x89,0x3c,0xa7,0x2d,0xfa,0xc2,0xff,0x37,0x9a,0xc9,0xc4,0xb6,0x4e,0x9e,0x0d,0x02,0x26,0xf0,0x9c,0xdb,0xa4,0xf5,0xae,0x29,0x38,0x16,0x3d,0x7f,0xbf,0xf8 }, { 0x89,0xac,0xd4,0x45,0x75,0xa3,0x75,0xcf,0xe1,0x7e,0xc9,0x18,0x37,0xa2,0x03,0x22,0xb9,0x39,0x9b,0xa0,0x9d,0x42,0xae,0x70,0x85,0x9b,0xdc,0xb0,0x87,0x2f,0xdb,0xc0 }, { 0x61,0x58,0x27,0x98,0xcb,0xed,0x7e,0x00,0x17,0x7b,0x00,0xdf,0x96,0xc0,0xd3,0x97,0xce,0x16,0xd8,0x7b,0x1b,0x95,0xa9,0x6e,0x74,0xe2,0xcb,0x0c,0xf9,0x13,0x1a,0xf1 }, { 0x31,0xe6,0x58,0x2c,0x7f,0x2a,0x5f,0xb8,0x74,0xc7,0x41,0xf0,0xf8,0x18,0xe4,0x4b,0xad,0x95,0x34,0xba,0x33,0x37,0xac,0x95,0x92,0x70,0x31,0x00,0xeb,0xa1,0xdd,0x7e }, { 0x34,0x58,0x0f,0x00,0x14,0x69,0x40,0x93,0xc9,0x0d,0x2e,0x64,0xe1,0xfa,0x92,0xc1,0x42,0xb5,0x3e,0xe5,0x31,0xd7,0x2a,0xfe,0x2a,0xa0,0x44,0x2f,0xa5,0xd3,0x26,0x6d }, { 0x7c,0x75,0x2d,0x94,0x33,0x5a,0xe0,0xe4,0x83,0x89,0x6f,0xdb,0x8d,0xb0,0xb1,0xc7,0xc5,0x45,0xee,0xb4,0x31,0x13,0xec,0x3d,0x9c,0xbc,0x91,0x6d,0xf7,0x52,0x97,0x4f }, { 0x55,0xe6,0x82,0xd2,0xb6,0x8c,0xb0,0x42,0xfd,0xe6,0x03,0xda,0x2a,0x19,0x78,0x21,0x9a,0x8b,0xfe,0xb2,0x71,0xc2,0xf7,0xdb,0xad,0xaa,0x37,0x9d,0x02,0x07,0x74,0xfd }, { 0x34,0x43,0x13,0xcc,0xc3,0xa7,0xdf,0x62,0x81,0x0d,0x32,0xfd,0x80,0xc6,0x51,0x5f,0x49,0x42,0x7b,0x01,0x2d,0xe5,0x52,0x89,0x0b,0x0b,0xc7,0xe5,0xcc,0xa1,0xf1,0x7f }, { 0xa9,0x90,0x75,0xec,0x7e,0xec,0x17,0x7d,0x95,0x8c,0x4f,0xd8,0xd2,0x4c,0x59,0xdf,0xa4,0xfb,0xa7,0x2a,0xd6,0xa0,0x7d,0xcd,0x59,0x23,0xf7,0x0f,0xe1,0x82,0x1c,0x1d }, { 0xb5,0x6a,0x66,0x66,0xcf,0x45,0x70,0x54,0xce,0xfd,0xa4,0x89,0x4e,0x9b,0x51,0x6d,0x30,0x3a,0x7d,0xd3,0x28,0x89,0x25,0x7f,0x63,0xea,0xbe,0x0a,0xa6,0x6e,0x9e,0xf0 }, { 0xae,0x8c,0x49,0x9b,0x08,0x2d,0x1e,0x78,0x50,0xff,0x94,0xf5,0xe5,0xda,0x62,0x88,0x7c,0x73,0x93,0x5a,0x11,0x67,0x78,0x32,0x7a,0x79,0x93,0x25,0x54,0xd7,0xf2,0x27 }, { 0xe2,0x79,0xe7,0x8a,0x6a,0x0f,0xa7,0x75,0x90,0x9e,0xa3,0x15,0x53,0x66,0xb7,0x0d,0xdc,0x8b,0xc7,0xa0,0x9a,0xe0,0x46,0x44,0xf7,0x11,0xde,0x6e,0x58,0x00,0x0a,0x9b }, { 0xf8,0x27,0x75,0x9b,0xca,0x19,0x1d,0x45,0x7f,0x9f,0x4a,0x3e,0x9d,0xef,0x50,0x1f,0x9f,0x38,0x9d,0xcd,0x0a,0xd2,0x97,0x75,0x73,0xc3,0x14,0x59,0x52,0xd4,0x6b,0xb6 }, { 0xcf,0x46,0xc5,0xf1,0xf8,0x04,0xe9,0x74,0x3b,0x3a,0xc0,0x7e,0xcb,0x31,0xfb,0x17,0x8e,0x4f,0x02,0xc2,0x81,0x5b,0x03,0xa3,0x38,0xfa,0x10,0x67,0x50,0xc7,0x1c,0x6a }, { 0x54,0x5b,0x86,0x4a,0x9c,0xb1,0x7b,0xf9,0xa9,0x7f,0xa4,0x55,0x5b,0xdf,0x70,0x03,0xbe,0x8c,0x7d,0x0b,0xb0,0x22,0x57,0x29,0x59,0x85,0x03,0xfd,0x68,0x29,0x32,0x74 }, { 0xbb,0xbf,0x65,0x31,0xf3,0x1b,0x16,0x8f,0x52,0xc6,0x16,0xa2,0x77,0x4d,0xed,0x1c,0x4e,0x6d,0xcb,0xbe,0xe0,0xee,0xbf,0xb6,0xe0,0x3b,0xe2,0x09,0xf4,0xb1,0x75,0x03 }, { 0x6b,0x56,0x2a,0x39,0x57,0x4b,0xff,0x25,0x1e,0x1f,0x48,0x61,0x0d,0xee,0xb0,0x24,0x77,0x48,0xb9,0xc8,0x0e,0xeb,0xe2,0xf1,0xd6,0x2f,0xf7,0x7d,0xbf,0x2f,0xaf,0x30 }, { 0xfe,0xee,0x9c,0x8e,0x15,0x20,0xfa,0xc8,0x1b,0xc0,0x7f,0x11,0xd2,0x35,0x59,0x31,0xc4,0xca,0x94,0xb9,0xa5,0x74,0xf2,0xa4,0x2b,0xa2,0x9a,0x1e,0xe4,0x97,0xfd,0x05 }, { 0xa2,0x9e,0x34,0x2d,0x94,0xb0,0xfe,0x29,0xde,0x82,0x73,0xd1,0xfd,0x90,0x0f,0xb8,0x99,0x29,0x50,0x7f,0xc5,0xb4,0xad,0xcf,0x18,0x88,0x45,0x10,0x80,0x2e,0x03,0x7f }, { 0x7a,0xb9,0x6a,0xf1,0x0b,0x2a,0xe7,0x72,0x61,0x13,0x3d,0xc2,0x9d,0x15,0x52,0x4e,0x55,0xb9,0xda,0x30,0xcf,0xa3,0x58,0xb4,0x55,0x07,0xe9,0x4f,0x38,0x41,0x69,0x08 }, { 0xb5,0x42,0xde,0xd8,0x16,0xfc,0x67,0x27,0x20,0xeb,0xe2,0x58,0x6a,0x87,0xa8,0x39,0x6f,0x63,0x68,0x9f,0x9d,0x02,0x6f,0xb2,0xbe,0x85,0xe9,0xf3,0x3b,0x93,0xde,0x64 }, { 0xc5,0x7a,0x95,0x97,0x30,0x2f,0xc2,0x0f,0x5c,0x76,0x72,0xdd,0xfb,0xbf,0x46,0x70,0x32,0x35,0x2d,0xf0,0x9c,0xce,0xa2,0x49,0xc4,0x18,0x87,0x1c,0x00,0x0d,0xa0,0x21 }, { 0x9d,0xaf,0xc3,0x00,0x62,0xe3,0xdd,0x45,0xf2,0xa1,0x85,0x28,0x80,0x0d,0x31,0xcf,0xf7,0x7f,0xc4,0x6e,0xea,0x72,0x44,0xa9,0x9b,0x06,0xf9,0xa4,0x86,0xef,0xc8,0xbc }, { 0x1e,0x88,0x97,0xda,0x03,0xf5,0x06,0x44,0xd7,0x13,0x41,0x14,0x49,0xbc,0xbe,0xe2,0x7e,0x93,0x37,0xee,0xf1,0x46,0x0b,0xbb,0x21,0x2a,0xc8,0xc7,0xb7,0x18,0xbb,0xfa }, { 0xeb,0x70,0x6e,0xf5,0x2e,0xc7,0x2e,0x6b,0xad,0x45,0x6b,0x75,0x59,0xba,0xa0,0x38,0x41,0x05,0x4a,0xd7,0xe1,0x5d,0xa9,0x54,0x0e,0xd7,0xce,0x69,0x76,0x83,0x7a,0x67 }, { 0xd1,0xb7,0xff,0x78,0x3f,0xa0,0x25,0xa3,0xaf,0x67,0xba,0xf4,0x37,0xdd,0x5d,0x15,0x49,0x43,0x26,0x1f,0xff,0x50,0x05,0xcb,0x01,0xb2,0x91,0x04,0xde,0xb0,0xaf,0xad }, { 0xef,0xbe,0x6a,0xe7,0xec,0x46,0xb1,0x95,0x71,0xdf,0xfb,0x42,0x75,0x77,0xf2,0xe0,0x50,0x0b,0x2a,0x23,0x45,0x3c,0x1a,0x5d,0xec,0xcd,0xef,0x80,0xe7,0x1b,0x7d,0x26 }, { 0x73,0x1b,0x62,0xa7,0xbe,0x73,0xec,0xd8,0xb8,0xd6,0x20,0x17,0xdb,0x39,0x7f,0x58,0x86,0x89,0x16,0x6f,0x50,0xea,0x96,0xb7,0x64,0x32,0x4c,0xe9,0x42,0xd5,0x3a,0xd5 }, { 0xa4,0xb7,0x1d,0x68,0x15,0x6e,0xb4,0x50,0x1b,0xbe,0x3e,0xd0,0x40,0x94,0xf3,0x3c,0xdc,0xef,0xb6,0x15,0x66,0xc2,0x09,0x94,0x26,0xa8,0x2d,0xb1,0x8b,0xf6,0xd9,0x18 }, { 0xff,0x86,0xcf,0x9b,0x4c,0x4c,0x79,0x88,0x4a,0x80,0xc4,0xc2,0xd7,0xdd,0x05,0x49,0xe0,0x10,0xe3,0xc0,0x71,0x4d,0xd8,0x3b,0x28,0xeb,0xf1,0xcf,0xa6,0x92,0x44,0x87 }, { 0xa3,0xe1,0x91,0xe1,0xd2,0x91,0x13,0xc0,0xa6,0x88,0xc4,0xd4,0x6c,0x6e,0xc3,0x35,0xce,0x28,0x93,0x61,0x8e,0xbd,0x99,0xc7,0x49,0xea,0x4f,0xe0,0x35,0xf2,0x55,0x44 }, { 0xd4,0x0e,0x12,0x99,0x42,0x66,0x9d,0x10,0x0c,0xc0,0xf3,0x2e,0xd5,0xd1,0xfa,0xdb,0x4b,0x20,0xf8,0xbc,0xeb,0x79,0xa4,0x3f,0xe3,0xd1,0x9e,0x60,0x79,0x5b,0x21,0x5c }, { 0xc3,0xee,0x8e,0x5e,0x03,0x0e,0x73,0x46,0x69,0xf8,0xa1,0x72,0xc7,0x11,0x84,0xe1,0xc8,0x3a,0xa3,0x26,0x41,0x74,0x6c,0x65,0x93,0x78,0x5a,0x5c,0xf7,0x9b,0x26,0x98 }, { 0x1f,0x3f,0xac,0x31,0xf9,0x43,0x17,0x33,0x6d,0x96,0xfa,0x76,0xc8,0x77,0xa6,0x18,0x96,0xac,0x9b,0x04,0x22,0x1b,0x16,0xd1,0xc5,0x95,0xff,0x7f,0x25,0x90,0xc8,0xd3 }, { 0xd3,0x10,0x7c,0x86,0x8b,0xf4,0xd0,0x23,0x29,0x85,0x3f,0xbd,0xb4,0x2f,0x23,0x45,0x5f,0xd1,0xb2,0xbb,0xa7,0x88,0xdb,0x7b,0xbb,0x30,0x6f,0xa5,0xdd,0x4c,0x00,0xbd }, { 0x1c,0x6f,0xa3,0x86,0x36,0xfa,0xac,0xae,0xc5,0x5b,0xa7,0x12,0x02,0x3e,0x3d,0xa4,0x29,0xfd,0x9b,0x81,0xbe,0xac,0x0b,0x94,0x92,0xd1,0x01,0xdb,0x9e,0xdf,0xd1,0xef }, { 0xb0,0xf0,0xd5,0xeb,0x9c,0xc2,0x51,0xfb,0xa4,0x65,0x46,0xe1,0x17,0xac,0x4e,0xed,0xd6,0x51,0xca,0x4f,0x98,0xed,0x6b,0x13,0xb9,0x8e,0xcc,0x00,0xb8,0xb9,0x26,0xde }, { 0x71,0x4c,0xf9,0xff,0x26,0xb1,0x1e,0xa1,0xd6,0x96,0xbb,0x2f,0x34,0x82,0x1b,0x65,0xf5,0xec,0x30,0xf5,0x40,0x92,0x8f,0x11,0xd5,0x81,0xe6,0x1f,0x84,0x63,0xfe,0x3e }, { 0xe4,0x70,0xa0,0x3e,0x37,0xed,0xbe,0xd8,0x88,0x45,0x13,0x09,0xb3,0x4a,0x17,0x1f,0x6b,0x1d,0x1a,0x9d,0xba,0x9e,0xbf,0xf6,0xf9,0xe9,0x6a,0x91,0x67,0x64,0x6f,0xe4 }, { 0x0b,0x52,0x4b,0x57,0x08,0x69,0x56,0xd4,0xcb,0x57,0x14,0x6f,0xbd,0x31,0x1b,0x07,0xfd,0x4b,0x70,0x26,0x90,0xeb,0x70,0x3c,0x37,0xe0,0x67,0x7f,0x20,0xff,0x01,0x8b }, { 0xef,0x52,0x69,0x60,0x5c,0x29,0x00,0x2f,0x21,0xa8,0x92,0x0e,0x05,0x50,0x5d,0x5c,0x19,0x12,0x01,0xd2,0x6d,0x73,0x43,0x6c,0xb2,0xcb,0xac,0xdc,0xe3,0x65,0xf6,0x12 }, { 0xdc,0x06,0x03,0x8e,0xaa,0x8b,0x46,0xab,0x25,0x93,0x8b,0x57,0x2d,0xc3,0x8e,0x29,0xae,0x79,0x3e,0xcc,0xda,0xd1,0x35,0x77,0x68,0xa8,0x5f,0x10,0xce,0x36,0x91,0xfb }, { 0x51,0xa2,0x59,0xbd,0x43,0xc6,0xaa,0xd4,0x9a,0xdd,0x16,0x9f,0xc9,0x8a,0x4a,0x1e,0xec,0x82,0xae,0xe7,0xe9,0x3d,0x5a,0x3c,0x38,0x93,0x97,0x04,0xfe,0x10,0x89,0x38 }, { 0x12,0x4c,0x62,0x07,0x88,0x7d,0xdc,0x3b,0xe4,0x31,0x29,0x40,0x3b,0xfb,0x3a,0x5a,0x6b,0xb6,0xbb,0x23,0xa2,0x08,0x0c,0xb5,0x6e,0xdf,0xf0,0xa2,0x73,0xb3,0xef,0xa2 }, { 0x98,0x7b,0x6f,0x5d,0x83,0xe5,0x8b,0xd5,0xc9,0x97,0xbb,0x99,0x38,0xfb,0x4a,0x60,0x1f,0x2f,0x70,0x77,0x6c,0x16,0x50,0xdf,0xea,0x81,0x55,0x33,0xac,0x29,0x20,0x8d }, { 0x4c,0x43,0x72,0x68,0x4a,0xde,0x24,0x40,0xe0,0xd1,0x0f,0x4c,0x80,0x64,0x11,0x0a,0x0f,0xdb,0xaf,0x68,0x9e,0xa4,0x21,0xde,0x98,0x81,0xae,0xa1,0x86,0x16,0xbc,0x90 }, { 0x02,0x6f,0xe1,0xb0,0x46,0xa1,0xf8,0xff,0x32,0x55,0x1f,0xe8,0xe5,0x7a,0x65,0xf3,0xce,0xdf,0x39,0x63,0xdf,0xa2,0x81,0xa0,0x33,0x5d,0x89,0xa1,0xba,0x27,0xb4,0xfd }, { 0x73,0x56,0xfc,0x22,0xe2,0x2a,0x31,0x0d,0x1d,0xef,0x39,0x0a,0x9c,0x2b,0xe0,0x69,0x3b,0x9b,0x2c,0xad,0x18,0x5f,0xc2,0x66,0x75,0x80,0x0c,0x97,0xe3,0x81,0xd2,0xc0 }, { 0x4d,0xf6,0x1c,0xeb,0x35,0x5b,0x39,0x23,0x7d,0x33,0xa8,0xe1,0x34,0x48,0x73,0xc3,0x0c,0x1f,0x79,0xd4,0x21,0x56,0x82,0x66,0x39,0x26,0x54,0x9c,0x9e,0x79,0xa6,0x84 }, { 0xbf,0xab,0x5a,0x5a,0x6a,0xe3,0xcb,0xcb,0xb7,0xf1,0xf6,0x79,0x8c,0x95,0x19,0x1c,0x43,0x32,0x4f,0x40,0x2e,0xd5,0xe7,0x49,0xc3,0x9c,0x73,0xcd,0x4a,0xda,0x43,0x3d }, { 0x76,0xa1,0x59,0x20,0x44,0xa6,0xe4,0xf5,0x11,0x26,0x5b,0xca,0x73,0xa6,0x04,0xd9,0x0b,0x05,0x29,0xd1,0xdf,0x60,0x2b,0xe3,0x0a,0x19,0xa9,0x25,0x76,0x60,0xd1,0xf5 }, tinyssh-20250501/old/crypto-tests/precomp_ed25519.data.py000066400000000000000000000056461500472222400227270ustar00rootroot00000000000000import hashlib, binascii b = 256 q = 2**255 - 19 l = 2**252 + 27742317777372353535851937790883648493 def H(m): return hashlib.sha512(m).digest() def expmod(b,e,m): if e == 0: return 1 t = expmod(b,e/2,m)**2 % m if e & 1: t = (t*b) % m return t def inv(x): return expmod(x,q-2,q) d = -121665 * inv(121666) I = expmod(2,(q-1)/4,q) def xrecover(y): xx = (y*y-1) * inv(d*y*y+1) x = expmod(xx,(q+3)/8,q) if (x*x - xx) % q != 0: x = (x*I) % q if x % 2 != 0: x = q-x return x By = 4 * inv(5) Bx = xrecover(By) B = [Bx % q,By % q] def edwards(P,Q): x1 = P[0] y1 = P[1] x2 = Q[0] y2 = Q[1] x3 = (x1*y2+x2*y1) * inv(1+d*x1*x2*y1*y2) y3 = (y1*y2+x1*x2) * inv(1-d*x1*x2*y1*y2) return [x3 % q,y3 % q] def scalarmult(P,e): if e == 0: return [0,1] Q = scalarmult(P,e/2) Q = edwards(Q,Q) if e & 1: Q = edwards(Q,P) return Q def encodeint(y): bits = [(y >> i) & 1 for i in range(b)] return ''.join([chr(sum([bits[i * 8 + j] << j for j in range(8)])) for i in range(b/8)]) def encodepoint(P): x = P[0] y = P[1] bits = [(y >> i) & 1 for i in range(b - 1)] + [x & 1] return ''.join([chr(sum([bits[i * 8 + j] << j for j in range(8)])) for i in range(b/8)]) def bit(h,i): return (ord(h[i/8]) >> (i%8)) & 1 def publickey(sk): h = H(sk) a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2)) A = scalarmult(B,a) return encodepoint(A) def Hint(m): h = H(m) return sum(2**i * bit(h,i) for i in range(2*b)) def signature(m,sk,pk): h = H(sk) a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2)) r = Hint(''.join([h[i] for i in range(b/8,b/4)]) + m) R = scalarmult(B,r) S = (r + Hint(encodepoint(R) + pk + m) * a) % l return encodepoint(R) + encodeint(S) def isoncurve(P): x = P[0] y = P[1] return (-x*x + y*y - 1 - d*x*x*y*y) % q == 0 def decodeint(s): return sum(2**i * bit(s,i) for i in range(0,b)) def decodepoint(s): y = sum(2**i * bit(s,i) for i in range(0,b-1)) x = xrecover(y) if x & 1 != bit(s,b-1): x = q-x P = [x,y] if not isoncurve(P): raise Exception("decoding point that is not on curve") return P def checkvalid(s,m,pk): if len(s) != b/4: raise Exception("signature length is wrong") if len(pk) != b/8: raise Exception("public-key length is wrong") R = decodepoint(s[0:b/8]) A = decodepoint(pk) S = decodeint(s[b/8:b/4]) h = Hint(encodepoint(R) + pk + m) if scalarmult(B,S) != edwards(R,scalarmult(A,h)): raise Exception("signature does not pass verification") f = open("precomp.txt") def l(line): l = "" for i in range(32): if i == 31: l += "0x%s%s" % (line[2*i], line[2*i+1]) else: l += "0x%s%s," % (line[2*i], line[2*i+1]) return l while True: line=f.readline() if len(line) == 0: f.close() break print "{", l(binascii.hexlify(publickey(binascii.unhexlify(line[0:-1])))), "}," tinyssh-20250501/old/crypto-tests/randombytestest.c000066400000000000000000000037731500472222400223140ustar00rootroot00000000000000/* 20140318 Jan Mojzis Public domain. */ #include #include #include #include #include "misc.h" #include "randombytes.h" static int verify(const unsigned char *x, const unsigned char *y) { unsigned int i, d = 0; for(i = 0; i < 16; ++i) d |= x[i] ^ y[i]; return (1 & ((d - 1) >> 8)) - 1; } static int readall(int fd, unsigned char *x, long long xlen) { long long r; while (xlen > 0) { r = read(fd, x, xlen); if (r <= 0) return -1; x += r; xlen -= r; } return 0; } static int writeall(int fd, unsigned char *x, long long xlen) { long long r; while (xlen > 0) { r = write(fd, x, xlen); if (r <= 0) return -1; x += r; xlen -= r; } return 0; } static void run(unsigned char *x, long long xlen) { pid_t pid; int status, fromchild[2]; unsigned char buf[16]; if (pipe(fromchild) == -1) fail("pipe() failure"); pid = fork(); if (pid == -1) fail("fork() failure"); if (pid == 0) { close(fromchild[0]); randombytes(buf, sizeof buf); if (writeall(fromchild[1], buf, sizeof buf) == -1) _exit(111); _exit(0); } close(fromchild[1]); if (readall(fromchild[0], x, xlen) == -1) fail("read() failure"); while (waitpid(pid, &status, 0) != pid) {}; if (!WIFEXITED(status)) fail("process killed"); if (WEXITSTATUS(status)) fail("process exited with status != 0"); } int main(void) { unsigned char buf1[16]; unsigned char buf2[16]; run(buf1, sizeof buf1); run(buf2, sizeof buf2); if (verify(buf1, buf2) == 0) fail("randombytes() cryptographically dangerous"); randombytes(buf1, sizeof buf1); randombytes(buf2, sizeof buf2); if (verify(buf1, buf2) == 0) fail("randombytes() cryptographically dangerous"); run(buf1, sizeof buf1); run(buf2, sizeof buf2); if (verify(buf1, buf2) == 0) fail("randombytes() cryptographically dangerous across fork()"); _exit(0); } tinyssh-20250501/old/crypto/000077500000000000000000000000001500472222400155475ustar00rootroot00000000000000tinyssh-20250501/old/crypto/CRYPTOLIBS000066400000000000000000000006421500472222400171660ustar00rootroot00000000000000crypto_onetimeauth_poly1305.o randombytes.o crypto_stream_chacha20.o crypto_verify_16.o crypto_verify_32.o crypto_hash_sha512.o crypto_hash_sha256.o fe.o fe25519.o ge25519.o sc25519.o crypto_scalarmult_curve25519.o crypto_dh_x25519.o crypto_sign_ed25519.o cleanup.o crypto_sort_uint32.o crypto_kem_sntrup761.o crypto_kem_sntrup761x25519.o uint8_optblocker.o uint16_optblocker.o uint32_optblocker.o uint64_optblocker.o tinyssh-20250501/old/crypto/CRYPTOPRIMITIVES000066400000000000000000000006151500472222400201300ustar00rootroot00000000000000crypto_int16 0 crypto_int64 0 crypto_uint16 0 crypto_uint32 0 crypto_uint64 0 crypto_uint8 0 crypto_stream_chacha20 1 crypto_onetimeauth_poly1305 1 crypto_hash_sha512 1 crypto_hash_sha256 1 crypto_verify_16 1 crypto_verify_32 1 crypto_scalarmult_curve25519 1 crypto_dh_x25519 1 crypto_sign_ed25519 1 randombytes 1 cleanup 0 crypto_sort_uint32 1 crypto_kem_sntrup761 1 crypto_kem_sntrup761x25519 1 tinyssh-20250501/old/crypto/CRYPTOSOURCES000066400000000000000000000005661500472222400175650ustar00rootroot00000000000000crypto_onetimeauth_poly1305 randombytes crypto_stream_chacha20 crypto_verify_16 crypto_verify_32 crypto_hash_sha256 crypto_hash_sha512 fe fe25519 ge25519 sc25519 crypto_scalarmult_curve25519 crypto_dh_x25519 crypto_sign_ed25519 cleanup crypto_sort_uint32 crypto_kem_sntrup761 crypto_kem_sntrup761x25519 uint8_optblocker uint16_optblocker uint32_optblocker uint64_optblocker tinyssh-20250501/old/crypto/cleanup.c000077700000000000000000000000001500472222400215562../../cleanup.custar00rootroot00000000000000tinyssh-20250501/old/crypto/cleanup.h000077700000000000000000000000001500472222400215702../../cleanup.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_declassify.h000077700000000000000000000000001500472222400257662../../crypto_declassify.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_dh_x25519.c000077700000000000000000000000001500472222400243602../../crypto_dh_x25519.custar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_dh_x25519.h000077700000000000000000000000001500472222400243722../../crypto_dh_x25519.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_hash_sha256.c000077700000000000000000000000001500472222400255262../../crypto_hash_sha256.custar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_hash_sha256.h000077700000000000000000000000001500472222400255402../../crypto_hash_sha256.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_hash_sha512.c000077700000000000000000000000001500472222400272752../../crypto_hash_sha512_tinyssh.custar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_hash_sha512.h000077700000000000000000000000001500472222400255262../../crypto_hash_sha512.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_int16.h000077700000000000000000000000001500472222400254472../../cryptoint/crypto_int16.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_int32.h000077700000000000000000000000001500472222400254432../../cryptoint/crypto_int32.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_int64.h000077700000000000000000000000001500472222400254552../../cryptoint/crypto_int64.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_int8.h000077700000000000000000000000001500472222400253112../../cryptoint/crypto_int8.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_kem_sntrup761.c000077700000000000000000000000001500472222400303332../../crypto_kem_sntrup761_tinyssh.custar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_kem_sntrup761.h000077700000000000000000000000001500472222400265642../../crypto_kem_sntrup761.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_kem_sntrup761x25519.c000077700000000000000000000000001500472222400301462../../crypto_kem_sntrup761x25519.custar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_kem_sntrup761x25519.h000077700000000000000000000000001500472222400301602../../crypto_kem_sntrup761x25519.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_onetimeauth_poly1305.c000077700000000000000000000000001500472222400330552../../crypto_onetimeauth_poly1305_tinyssh.custar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_onetimeauth_poly1305.h000077700000000000000000000000001500472222400313062../../crypto_onetimeauth_poly1305.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_scalarmult_curve25519.c000077700000000000000000000000001500472222400314422../../crypto_scalarmult_curve25519.custar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_scalarmult_curve25519.h000077700000000000000000000000001500472222400314542../../crypto_scalarmult_curve25519.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_sign_ed25519.c000077700000000000000000000000001500472222400273152../../crypto_sign_ed25519_tinyssh.custar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_sign_ed25519.h000077700000000000000000000000001500472222400255462../../crypto_sign_ed25519.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_sort_uint32.c000077700000000000000000000000001500472222400260662../../crypto_sort_uint32.custar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_sort_uint32.h000077700000000000000000000000001500472222400261002../../crypto_sort_uint32.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_stream_chacha20.c000077700000000000000000000000001500472222400273502../../crypto_stream_chacha20.custar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_stream_chacha20.h000077700000000000000000000000001500472222400273622../../crypto_stream_chacha20.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_uint16.h000077700000000000000000000000001500472222400260212../../cryptoint/crypto_uint16.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_uint32.h000077700000000000000000000000001500472222400260152../../cryptoint/crypto_uint32.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_uint64.h000077700000000000000000000000001500472222400260272../../cryptoint/crypto_uint64.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_uint8.h000077700000000000000000000000001500472222400256632../../cryptoint/crypto_uint8.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_verify_16.c000077700000000000000000000000001500472222400251242../../crypto_verify_16.custar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_verify_16.h000077700000000000000000000000001500472222400251362../../crypto_verify_16.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_verify_32.c000077700000000000000000000000001500472222400251202../../crypto_verify_32.custar00rootroot00000000000000tinyssh-20250501/old/crypto/crypto_verify_32.h000077700000000000000000000000001500472222400251322../../crypto_verify_32.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/fe.c000077700000000000000000000000001500472222400174642../../fe.custar00rootroot00000000000000tinyssh-20250501/old/crypto/fe.h000077700000000000000000000000001500472222400174762../../fe.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/fe25519.c000077700000000000000000000000001500472222400205002../../fe25519.custar00rootroot00000000000000tinyssh-20250501/old/crypto/fe25519.h000077700000000000000000000000001500472222400205122../../fe25519.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/ge25519.c000077700000000000000000000000001500472222400205022../../ge25519.custar00rootroot00000000000000tinyssh-20250501/old/crypto/ge25519.h000077700000000000000000000000001500472222400205142../../ge25519.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/randombytes.c000077700000000000000000000000001500472222400233562../../randombytes.custar00rootroot00000000000000tinyssh-20250501/old/crypto/randombytes.h000077700000000000000000000000001500472222400233702../../randombytes.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/sc25519.c000077700000000000000000000000001500472222400205262../../sc25519.custar00rootroot00000000000000tinyssh-20250501/old/crypto/sc25519.h000077700000000000000000000000001500472222400205402../../sc25519.hustar00rootroot00000000000000tinyssh-20250501/old/crypto/uint16_optblocker.c000077700000000000000000000000001500472222400274572../../cryptoint/uint16_optblocker.custar00rootroot00000000000000tinyssh-20250501/old/crypto/uint32_optblocker.c000077700000000000000000000000001500472222400274532../../cryptoint/uint32_optblocker.custar00rootroot00000000000000tinyssh-20250501/old/crypto/uint64_optblocker.c000077700000000000000000000000001500472222400274652../../cryptoint/uint64_optblocker.custar00rootroot00000000000000tinyssh-20250501/old/crypto/uint8_optblocker.c000077700000000000000000000000001500472222400273212../../cryptoint/uint8_optblocker.custar00rootroot00000000000000tinyssh-20250501/old/make-install.sh000077500000000000000000000026731500472222400171570ustar00rootroot00000000000000#!/bin/sh set -e build="`pwd`/build" source="`pwd`" bin="${build}/bin" man="${build}/man" cat "${source}/tinyssh/TARGETS" |\ while read x do [ -x "${bin}/${x}" ] || \ ( echo "=== `date` === $x not compiled, compile first!" exit 111; ) || exit 111 done || exit 111 #bin confbin="`head -1 conf-bin`" bindir=`echo "$1/${confbin}" | sed 's,//,/,g'` echo "=== `date` === installing bin directory ${bindir}" mkdir -p "${bindir}" || exit 111 cat "${source}/tinyssh/LINKS" |\ while read x y do rm -f "${x}.tmp" if [ "_${y}" = "_" ]; then cp "${bin}/${x}" "${bindir}/${x}.tmp" ( cd "${bindir}" chmod 755 "${x}.tmp" mv -f "${x}.tmp" "${x}" ) else ( cd "${bindir}" ln -s "${y}" "${x}.tmp" mv -f "${x}.tmp" "${x}" ) fi echo "=== `date` === installing ${bin}/${x} -> ${bindir}/${x}" done || exit 111 echo "=== `date` === finishing" #man confman="`head -1 conf-man`" mandir=`echo "$1/${confman}" | sed 's,//,/,g'` echo "=== `date` === installing man directory ${mandir}" mkdir -p "${mandir}" || exit 111 ls "${man}" | sort |\ while read x do n=`echo "${x}" | cut -d'.' -f2` mkdir -p "${mandir}/man${n}" || exit 111 cp "${man}/${x}" "${mandir}/man${n}/${x}.tmp" ( cd "${mandir}/man${n}" chmod 644 "${x}.tmp" mv -f "${x}.tmp" "${x}" ) echo "=== `date` === installing ${man}/${x} -> ${mandir}/man${n}/${x}" done || exit 111 echo "=== `date` === finishing" exit 0 tinyssh-20250501/old/make-tinyssh.sh000077500000000000000000000222451500472222400172070ustar00rootroot00000000000000#!/bin/sh -e top="`pwd`" build="`pwd`/build" bin="${build}/bin" man="${build}/man" lib="${build}/lib" include="${build}/include" log="${build}/log" work="${build}/work" contribdir="`pwd`/build-contrib" rm -rf "${build}" mkdir -p "${build}" mkdir -p "${bin}" mkdir -p "${man}" mkdir -p "${lib}" mkdir -p "${include}" exec 5>"${log}" exec 2>&5 exec &5 } log1() { echo "=== `date` === $@" echo "=== `date` === $@" >&5 } log2() { echo "=== `date` === $@" echo "=== `date` === $@" >&5 } version=`head -1 "${top}/debian/changelog" | cut -d '(' -f2 | cut -d ')' -f1` #XXX if [ x"${version}" = x ]; then version=noversion fi LANG=C export LANG log0 "uname -a: `uname -a || :`" log0 "uname -F: `uname -F || :`" log0 "uname -M: `uname -M || :`" log0 "ulimit -a: `echo; ulimit -a || :`" log1 "obtaining compiler" rm -rf "${work}" mkdir -p "${work}" ( cd "${work}" ( if [ x"${CC}" != x ]; then echo "${CC} " fi cat "${top}/conf-cc" ) | while read compiler do echo 'int main(void) { return 0; }' > try.c ${compiler} -o try try.c || { log2 "${compiler} failed"; continue; } log2 "${compiler} ok" echo "${compiler}" > compiler break done ) compiler=`head -1 "${work}/compiler"` log1 "finishing" log1 "checking compiler options" rm -rf "${work}" mkdir -p "${work}" ( cd "${work}" cflags=`cat "${top}/conf-cflags" || :` cflags="${CPPFLAGS} ${CFLAGS} ${LDFLAGS} ${cflags}" for i in ${cflags}; do echo 'int main(void) { return 0; }' > try.c ${compiler} ${options} "${i}" -o try try.c || { log2 "${i} failed"; continue; } options="${options} ${i}" log2 "${i} ok" done echo ${options} > options ) compilerorig=${compiler} compiler="${compiler} `cat ${work}/options`" log2 "${compiler}" log1 "finishing" log1 "checking libs" rm -rf "${work}" mkdir -p "${work}" ( cd "${work}" ( cat "${top}/conf-libs" || : ) | ( exec 9>syslibs while read i; do echo 'int main(void) { return 0; }' > try.c ${compiler} ${i} -o try try.c || { log2 "${i} failed"; continue; } echo "${i}" >&9 log2 "${i} ok" done ) ) libs=`cat "${work}/syslibs"` log1 "finishing" log1 "checking \$LIBS" if [ x"${LIBS}" != x ]; then rm -rf "${work}" mkdir -p "${work}" ( cd "${work}" for i in ${LIBS}; do echo 'int main(void) { return 0; }' > try.c ${compiler} ${i} -o try try.c || { log2 "${i} failed"; continue; } syslibs="${syslibs} ${i}" log2 "${i} ok" done echo ${syslibs} > syslibs ) fi libsorig=${libs} libs="${libs} `cat ${work}/syslibs`" log1 "finishing" log1 "building sysdep headers" rm -rf "${work}" mkdir -p "${work}" cp -prL sysdep/* "${work}" ( cd "${work}" sh list | ( while read target source do [ -f "${include}/${target}" ] && continue rm -f "${source}" "${target}.tmp" ${compiler} -O0 -o "${source}" "${source}.c" ${libs} || continue "./${source}" > "${target}.tmp" 2>/dev/null || continue if [ -f "${source}.out" ]; then cp "${source}.out" "${include}/${target}" else #runtime cp "${target}.tmp" "${include}/${target}" fi log2 "${target} ${source}" done ) ) log1 "finishing" log1 "starting crypto lib" rm -rf "${work}" mkdir -p "${work}" cp -prL crypto/* "${work}" ( cd "${work}" cat CRYPTOSOURCES\ | while read x do ${compiler} -I"${include}" -c "${x}.c" || { log2 "libtinysshcrypto.a failed ... see the log ${log}"; exit 111; } done || exit 111 ar cr "${lib}/libtinysshcrypto.a" `cat CRYPTOLIBS` || exit 0 ) log2 "libtinysshcrypto.a ok" log1 "finishing" origlibs="${lib}/libtinysshcrypto.a ${origlibs}" libs="${lib}/libtinysshcrypto.a ${libs}" log1 "starting crypto headers" rm -rf "${work}" mkdir -p "${work}" cp -p crypto/CRYPTOPRIMITIVES "${work}" cp -prL crypto-tests/*test.c "${work}" cp -prL crypto-tests/*.h "${work}" cp -prL crypto-tests/*.data "${work}" 2>/dev/null || : ( cd "${work}" cat CRYPTOPRIMITIVES\ | while read primitive checkflag do if [ "x${checkflag}" = x0 ]; then cp -p "${top}/crypto/${primitive}.h" "${include}" continue; fi testf=`echo "${primitive}" | sed 's/$/test/'` ( echo '#include ' echo "#include <${primitive}.h>" echo 'int main(void) {' echo "#ifdef ${primitive}_PRIMITIVE" echo "printf(\"%s\\\\n\", ${primitive}_PRIMITIVE);" echo '#else' echo "#ifdef ${primitive}_IMPLEMENTATION" echo "printf(\"%s\\\\n\", ${primitive}_IMPLEMENTATION);" echo '#endif' echo "#ifdef ${primitive}_implementation" echo "printf(\"%s\\\\n\", ${primitive}_implementation);" echo '#endif' echo '#endif' echo 'return 0; }' ) > try.c #try ext. crypto library log0 "trying: ext. ${primitive}:" if ${compiler} -c "${testf}.c" ${libs}; then if ${compiler} -o "${testf}" "${testf}.o" ${libs}; then if ${compiler} -o try try.c; then if /bin/sh -ec "./${testf}"; then log2 "${primitive}.h (`./try`) ok" echo "#include <${primitive}.h>" >> crypto.h continue else log2 "${primitive}.h (`./try`) failed" fi fi fi fi #try int. crypto library log0 "trying: int. ${primitive}:" if cp -p "${top}/crypto/${primitive}.h" . ; then if ${compilerorig} -I. -I"$include" -o "${testf}" "${testf}.c" ${origlibs}; then if ${compilerorig} -I. -I"$include" -o try try.c; then if /bin/sh -ec "./${testf}"; then log2 "${primitive}.h (`./try`) ok" echo "#include \"${primitive}.h\"" >> crypto.h cp -p "${primitive}.h" "${include}" continue fi fi fi fi log2 "${primitive}.h failed ... see the log ${log}" exit 111 done || exit 111 cp crypto.h "${include}/crypto.h" ) log1 "finishing" rm -rf "${work}" mkdir -p "${work}" cp -prL tinyssh/* "${work}" cp -prL tinyssh-tests/*test.c "${work}" cp -prL tinyssh-tests/*.h "${work}" cp -prL _tinyssh/* "${work}" 2>/dev/null || : ( cd "${work}" log1 "starting tinyssh objects" touch SOURCES TARGETS _TARGETS cat SOURCES TARGETS _TARGETS\ | while read x do ${compiler} "-DCOMPILER=\"${compilerorig}\"" "-DVERSION=\"${version}\"" -I"${include}" -c "${x}.c" || { log2 "${x}.o failed ... see the log ${log}"; exit 111; } log2 "${x}.o ok" done || exit 111 ar cr libtinyssh.a `cat LIBS` || exit 111 log1 "finishing" #tests log1 "starting tinyssh-tests" cat LIBS \ | while read x do t=`echo ${x} | sed 's/.o$/test/'` if [ ! -h "${t}.c" ]; then ${compiler} -I"${include}" -c "${t}.c" || { log2 "${t} failed ... see the log ${log}"; exit 111; } ${compiler} -I"${include}" -o "${t}" "${t}.o" libtinyssh.a ${libs} || { log2 "${t} failed ... see the log ${log}"; exit 111; } "./${t}" || { log2 "${t} failed ... see the log ${log}"; exit 111; } log2 "${t} ok" fi done || exit 111 log1 "finishing" log1 "starting _tinyssh" cat _TARGETS \ | while read x do ${compiler} -I"${include}" -o "${x}" "${x}.o" libtinyssh.a ${libs} || { log2 "${x} failed ... see the log ${log}"; exit 111; } log2 "${x} ok" cp -p "${x}" "${bin}/${x}"; done || exit 111 log1 "finishing" log1 "starting tinyssh" cat TARGETS \ | while read x do ${compiler} -I"${include}" -o "${x}" "${x}.o" libtinyssh.a ${libs} || { log2 "${x} failed ... see the log ${log}"; exit 111; } log2 "${x} ok" done || exit 111 log1 "finishing" log1 "starting tinyssh regression tests" cat TARGETS \ | while read x do sh ${x}.rts > ${x}.out cmp "${x}.out" "${x}.exp" || { log2 "${x} regression test failed ... see the difference `pwd`/${x}.out `pwd`/${x}.exp"; exit 111; } log2 "${x} ok" cp -p "${x}" "${bin}/${x}"; done || exit 111 log1 "finishing" ) || exit 111 log1 "starting manpages" cp -prL man/* "${man}" log1 "finishing" log1 "counting words of code - tests" rm -rf "${work}" mkdir -p "${work}" for dir in tinyssh-tests crypto-tests _tinyssh; do ( touch "${work}/${dir}" [ -d "${dir}" ] || exit 0 cd "${dir}" cat *.c *.h > "${work}/${dir}" || : ) ( cd "${work}" cat "${dir}" \ | ( cpp -fpreprocessed || gcpp -fpreprocessed ) | ( x=`sed 's/[_a-zA-Z0-9][_a-zA-Z0-9]*/x/g' | tr -d ' \012' | wc -c | tr -d ' '` log2 "${dir} ${x}" ) ) done ( cd "${work}" cat * \ | ( cpp -fpreprocessed || gcpp -fpreprocessed ) | ( x=`sed 's/[_a-zA-Z0-9][_a-zA-Z0-9]*/x/g' | tr -d ' \012' | wc -c | tr -d ' '` log2 "$x words of code" ) ) log1 "finishing" echo "=== `date` === counting words of code" rm -rf "${work}" mkdir -p "${work}" for dir in sysdep tinyssh crypto; do ( cd "${dir}" cat *.c *.h > "${work}/${dir}" || : ) ( cd "${work}" cat "${dir}" \ | ( cpp -fpreprocessed || gcpp -fpreprocessed ) | ( x=`sed 's/[_a-zA-Z0-9][_a-zA-Z0-9]*/x/g' | tr -d ' \012' | wc -c | tr -d ' '` log2 "${dir} ${x}" ) ) done ( cd "${work}" cat * \ | ( cpp -fpreprocessed || gcpp -fpreprocessed ) | ( x=`sed 's/[_a-zA-Z0-9][_a-zA-Z0-9]*/x/g' | tr -d ' \012' | wc -c | tr -d ' '` log2 "${x} words of code" ) ) log1 "finishing" exit 0 tinyssh-20250501/old/make-tinysshcc.sh000077500000000000000000000121111500472222400175040ustar00rootroot00000000000000#!/bin/sh -e top="`pwd`" build="`pwd`/build" bin="${build}/bin" man="${build}/man" lib="${build}/lib" include="${build}/include" log="${build}/log" work="${build}/work" contribdir="`pwd`/build-contrib" rm -rf "${build}" mkdir -p "${build}" mkdir -p "${bin}" mkdir -p "${man}" mkdir -p "${lib}" mkdir -p "${include}" exec 5>"${log}" exec 2>&5 exec &5 } log1() { echo "=== `date` === $@" echo "=== `date` === $@" >&5 } log2() { echo "=== `date` === $@" echo "=== `date` === $@" >&5 } version=`head -1 "${top}/debian/changelog" | cut -d '(' -f2 | cut -d ')' -f1` #XXX if [ x"${version}" = x ]; then version=noversion fi LANG=C export LANG log0 "uname -a: `uname -a || :`" log0 "uname -F: `uname -F || :`" log0 "uname -M: `uname -M || :`" log1 "obtaining compiler" rm -rf "${work}" mkdir -p "${work}" ( cd "${work}" ( if [ x"${CC}" != x ]; then echo "${CC} " fi cat "${top}/conf-cc" ) | while read compiler do echo 'int main(void) { return 0; }' > try.c ${compiler} -o try try.c || { log2 "${compiler} failed"; continue; } log2 "${compiler} ok" echo "${compiler}" > compiler break done ) compiler=`head -1 "${work}/compiler"` log1 "finishing" log1 "obtaining ar" rm -rf "${work}" mkdir -p "${work}" ( cd "${work}" ( if [ x"${AR}" != x ]; then echo "${AR} " fi cat "${top}/conf-ar" ) | while read ar do touch test.o ${ar} cr test.a test.o || { log2 "${ar} failed"; continue; } log2 "${ar} ok" echo "${ar}" > ar break done ) ar=`head -1 "${work}/ar"` log1 "finishing" log1 "checking compiler options" rm -rf "${work}" mkdir -p "${work}" ( cd "${work}" cflags=`cat "${top}/conf-cflags" || :` cflags="${CPPFLAGS} ${CFLAGS} ${LDFLAGS} ${cflags}" for i in ${cflags}; do echo 'int main(void) { return 0; }' > try.c ${compiler} ${options} "${i}" -o try try.c || { log2 "${i} failed"; continue; } options="${options} ${i}" log2 "${i} ok" done echo ${options} > options ) compilerorig=${compiler} compiler="${compiler} `cat ${work}/options`" log2 "${compiler}" log1 "finishing" log1 "checking libs" rm -rf "${work}" mkdir -p "${work}" ( cd "${work}" ( cat "${top}/conf-libs" || : ) | ( exec 9>syslibs while read i; do echo 'int main(void) { return 0; }' > try.c ${compiler} ${i} -o try try.c || { log2 "${i} failed"; continue; } echo "${i}" >&9 log2 "${i} ok" done ) ) libs=`cat "${work}/syslibs"` log1 "finishing" log1 "checking \$LIBS" if [ x"${LIBS}" != x ]; then rm -rf "${work}" mkdir -p "${work}" ( cd "${work}" for i in ${LIBS}; do echo 'int main(void) { return 0; }' > try.c ${compiler} ${i} -o try try.c || { log2 "${i} failed"; continue; } syslibs="${i} ${syslibs}" log2 "${i} ok" done echo ${syslibs} > syslibs ) fi libsorig=${libs} libs="${libs} `cat ${work}/syslibs`" log1 "finishing" log1 "building sysdep headers" rm -rf "${work}" mkdir -p "${work}" cp -prL sysdep/* "${work}" ( cd "${work}" sh list | ( while read target source do [ -f "${include}/${target}" ] && continue rm -f "${source}" "${target}.tmp" [ -f "${source}.out" ] || continue ${compiler} -O0 -o "${source}" "${source}.c" ${libs} || continue cp "${source}.out" "${include}/${target}" log2 "${target} ${source}" done ) ) log1 "finishing" log1 "starting crypto lib" rm -rf "${work}" mkdir -p "${work}" cp -prL crypto/* "${work}" ( cd "${work}" cat CRYPTOSOURCES\ | while read x do ${compiler} -I"${include}" -c "${x}.c" || { log2 "libtinysshcrypto.a failed ... see the log ${log}"; exit 111; } done || exit 111 ${ar} cr "${lib}/libtinysshcrypto.a" `cat CRYPTOLIBS` || exit 0 ) log2 "libtinysshcrypto.a ok" log1 "finishing" origlibs="${lib}/libtinysshcrypto.a ${origlibs}" libs="${lib}/libtinysshcrypto.a ${libs}" log1 "starting crypto headers" rm -rf "${work}" mkdir -p "${work}" cp -p crypto/CRYPTOPRIMITIVES "${work}" ( cd "${work}" cat CRYPTOPRIMITIVES\ | while read primitive checkflag do if [ "x${checkflag}" != x0 ]; then echo "#include \"${primitive}.h\"" >> crypto.h fi cp -p "${top}/crypto/${primitive}.h" "${include}" done || exit 111 cp crypto.h "${include}/crypto.h" ) log1 "finishing" rm -rf "${work}" mkdir -p "${work}" cp -prL tinyssh/* "${work}" ( cd "${work}" log1 "starting tinyssh objects" touch SOURCES TARGETS cat SOURCES TARGETS\ | while read x do ${compiler} "-DCOMPILER=\"${compilerorig}\"" "-DVERSION=\"${version}\"" -I"${include}" -c "${x}.c" || { log2 "${x}.o failed ... see the log ${log}"; exit 111; } log2 "${x}.o ok" done || exit 111 ${ar} cr libtinyssh.a `cat LIBS` || exit 111 log1 "finishing" log1 "starting tinyssh" cat TARGETS \ | while read x do ${compiler} -I"${include}" -o "${x}" "${x}.o" libtinyssh.a ${libs} || { log2 "${x} failed ... see the log ${log}"; exit 111; } cp -p "${x}" "${bin}/${x}" log2 "${x} ok" done || exit 111 log1 "finishing" ) || exit 111 log1 "starting manpages" cp -prL man/* "${man}" log1 "finishing" exit 0 tinyssh-20250501/old/man000077700000000000000000000000001500472222400156312../manustar00rootroot00000000000000tinyssh-20250501/old/sysdep/000077500000000000000000000000001500472222400155365ustar00rootroot00000000000000tinyssh-20250501/old/sysdep/default.h-no.c000066400000000000000000000000661500472222400201700ustar00rootroot00000000000000/* Public domain. */ int main(void) { return 0; } tinyssh-20250501/old/sysdep/default.h-no.out000066400000000000000000000000001500472222400205410ustar00rootroot00000000000000tinyssh-20250501/old/sysdep/haslibutilh.h-yes.c000077700000000000000000000000001500472222400243332../../haslibutilh.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/haslibutilh.h-yes.out000066400000000000000000000000261500472222400216210ustar00rootroot00000000000000#define HASLIBUTILH 1 tinyssh-20250501/old/sysdep/haslimits.h-yes.c000077700000000000000000000000001500472222400235052../../haslimits.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/haslimits.h-yes.out000066400000000000000000000000241500472222400213040ustar00rootroot00000000000000#define HASLIMITS 1 tinyssh-20250501/old/sysdep/haslogintty.h-yes.c000077700000000000000000000000001500472222400244252../../haslogintty.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/haslogintty.h-yes.out000066400000000000000000000000261500472222400216560ustar00rootroot00000000000000#define HASLOGINTTY 1 tinyssh-20250501/old/sysdep/hasmlock.h-yes.c000077700000000000000000000000001500472222400231152../../hasmlock.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasmlock.h-yes.out000066400000000000000000000000231500472222400211070ustar00rootroot00000000000000#define HASMLOCK 1 tinyssh-20250501/old/sysdep/hasopenpty.h-yes.c000077700000000000000000000000001500472222400240772../../hasopenpty.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasopenpty.h-yes.out000066400000000000000000000000251500472222400215020ustar00rootroot00000000000000#define HASOPENPTY 1 tinyssh-20250501/old/sysdep/hasutilh.h-yes.c000077700000000000000000000000001500472222400231552../../hasutilh.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutilh.h-yes.out000066400000000000000000000000231500472222400211270ustar00rootroot00000000000000#define HASUTILH 1 tinyssh-20250501/old/sysdep/hasutmp.h-yes.c000077700000000000000000000000001500472222400226552../../hasutmp.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmp.h-yes.out000066400000000000000000000000221500472222400207660ustar00rootroot00000000000000#define HASUTMP 1 tinyssh-20250501/old/sysdep/hasutmpaddrv6.h-yes.c000077700000000000000000000000001500472222400250732../../hasutmpaddrv6.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmpaddrv6.h-yes.out000066400000000000000000000000301500472222400220740ustar00rootroot00000000000000#define HASUTMPADDRV6 1 tinyssh-20250501/old/sysdep/hasutmphost.h-yes.c000077700000000000000000000000001500472222400244512../../hasutmphost.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmphost.h-yes.out000066400000000000000000000000261500472222400216700ustar00rootroot00000000000000#define HASUTMPHOST 1 tinyssh-20250501/old/sysdep/hasutmploginlogout.h-yes.c000077700000000000000000000000001500472222400274232../../hasutmploginlogout.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmploginlogout.h-yes.out000066400000000000000000000000351500472222400232550ustar00rootroot00000000000000#define HASUTMPLOGINLOGOUT 1 tinyssh-20250501/old/sysdep/hasutmplogwtmp.h-yes.c000077700000000000000000000000001500472222400257012../../hasutmplogwtmp.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmplogwtmp.h-yes.out000066400000000000000000000000311500472222400224000ustar00rootroot00000000000000#define HASUTMPLOGWTMP 1 tinyssh-20250501/old/sysdep/hasutmpname.h-yes.c000077700000000000000000000000001500472222400243572../../hasutmpname.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmpname.h-yes.out000066400000000000000000000000261500472222400216330ustar00rootroot00000000000000#define HASUTMPNAME 1 tinyssh-20250501/old/sysdep/hasutmppid.h-yes.c000077700000000000000000000000001500472222400240472../../hasutmppid.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmppid.h-yes.out000066400000000000000000000000251500472222400214660ustar00rootroot00000000000000#define HASUTMPPID 1 tinyssh-20250501/old/sysdep/hasutmptime.h-yes.c000077700000000000000000000000001500472222400244132../../hasutmptime.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmptime.h-yes.out000066400000000000000000000000261500472222400216510ustar00rootroot00000000000000#define HASUTMPTIME 1 tinyssh-20250501/old/sysdep/hasutmptv.h-yes.c000077700000000000000000000000001500472222400236012../../hasutmptv.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmptv.h-yes.out000066400000000000000000000000241500472222400213420ustar00rootroot00000000000000#define HASUTMPTV 1 tinyssh-20250501/old/sysdep/hasutmptype.h-yes.c000077700000000000000000000000001500472222400244612../../hasutmptype.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmptype.h-yes.out000066400000000000000000000000261500472222400216740ustar00rootroot00000000000000#define HASUTMPTYPE 1 tinyssh-20250501/old/sysdep/hasutmpuser.h-yes.c000077700000000000000000000000001500472222400244532../../hasutmpuser.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmpuser.h-yes.out000066400000000000000000000000261500472222400216710ustar00rootroot00000000000000#define HASUTMPUSER 1 tinyssh-20250501/old/sysdep/hasutmpx.h-yes.c000077700000000000000000000000001500472222400232352../../hasutmpx.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmpx.h-yes.out000066400000000000000000000000231500472222400211570ustar00rootroot00000000000000#define HASUTMPX 1 tinyssh-20250501/old/sysdep/hasutmpxaddrv6.h-yes.c000077700000000000000000000000001500472222400254532../../hasutmpxaddrv6.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmpxaddrv6.h-yes.out000066400000000000000000000000311500472222400222650ustar00rootroot00000000000000#define HASUTMPXADDRV6 1 tinyssh-20250501/old/sysdep/hasutmpxsyslen.h-yes.c000077700000000000000000000000001500472222400257312../../hasutmpxsyslen.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmpxsyslen.h-yes.out000066400000000000000000000000311500472222400224140ustar00rootroot00000000000000#define HASUTMPXSYSLEN 1 tinyssh-20250501/old/sysdep/hasutmpxupdwtmpx.h-yes.c000077700000000000000000000000001500472222400266572../../hasutmpxupdwtmpx.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/hasutmpxupdwtmpx.h-yes.out000066400000000000000000000000331500472222400227710ustar00rootroot00000000000000#define HASUTMPXUPDWTMPX 1 tinyssh-20250501/old/sysdep/hasvalgrind.h-yes.c000077700000000000000000000000001500472222400243172../../hasvalgrind.custar00rootroot00000000000000tinyssh-20250501/old/sysdep/list000066400000000000000000000035721500472222400164430ustar00rootroot00000000000000#!/bin/sh -e #mlock echo 'hasmlock.h hasmlock.h-yes' echo 'hasmlock.h default.h-no' #util/libutil echo 'haslibutilh.h haslibutilh.h-yes' echo 'haslibutilh.h default.h-no' echo 'hasutilh.h hasutilh.h-yes' echo 'hasutilh.h default.h-no' #openpty/login_tty echo 'hasopenpty.h hasopenpty.h-yes' echo 'hasopenpty.h default.h-no' echo 'haslogintty.h haslogintty.h-yes' echo 'haslogintty.h default.h-no' #utmpx echo 'hasutmpx.h hasutmpx.h-yes' echo 'hasutmpx.h default.h-no' echo 'hasutmpxupdwtmpx.h hasutmpxupdwtmpx.h-yes' echo 'hasutmpxupdwtmpx.h default.h-no' echo 'hasutmpxsyslen.h hasutmpxsyslen.h-yes' echo 'hasutmpxsyslen.h default.h-no' echo 'hasutmpxaddrv6.h hasutmpxaddrv6.h-yes' echo 'hasutmpxaddrv6.h default.h-no' #utmp echo 'hasutmp.h hasutmp.h-yes' echo 'hasutmp.h default.h-no' echo 'hasutmpname.h hasutmpname.h-yes' echo 'hasutmpname.h default.h-no' echo 'hasutmpuser.h hasutmpuser.h-yes' echo 'hasutmpuser.h default.h-no' echo 'hasutmphost.h hasutmphost.h-yes' echo 'hasutmphost.h default.h-no' echo 'hasutmptime.h hasutmptime.h-yes' echo 'hasutmptime.h default.h-no' echo 'hasutmptv.h hasutmptv.h-yes' echo 'hasutmptv.h default.h-no' echo 'hasutmppid.h hasutmppid.h-yes' echo 'hasutmppid.h default.h-no' echo 'hasutmptype.h hasutmptype.h-yes' echo 'hasutmptype.h default.h-no' echo 'hasutmplogwtmp.h hasutmplogwtmp.h-yes' echo 'hasutmplogwtmp.h default.h-no' echo 'hasutmploginlogout.h hasutmploginlogout.h-yes' echo 'hasutmploginlogout.h default.h-no' echo 'hasutmpaddrv6.h hasutmpaddrv6.h-yes' echo 'hasutmpaddrv6.h default.h-no' #limits echo 'haslimits.h haslimits.h-yes' echo 'haslimits.h default.h-no' #valgrind echo 'hasvalgrind.h hasvalgrind.h-yes' echo 'hasvalgrind.h default.h-no' # librandombytes + lib25519 + libntruprime + lib1305 echo 'haslibrandombytes.h default.h-no' echo 'haslib25519.h default.h-no' echo 'haslibntruprime.h default.h-no' echo 'haslib1305.h default.h-no' tinyssh-20250501/old/tinyssh-tests/000077500000000000000000000000001500472222400170705ustar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/blockingtest.c000066400000000000000000000010661500472222400217270ustar00rootroot00000000000000/* 20140302 Jan Mojzis Public domain. */ #include #include #include #include "fail.h" #include "blocking.h" int main(void) { int pi[2]; long long i; if (pipe(pi) == -1) fail("failure"); for (i = 0; i < 2; ++i) { if ((fcntl(pi[i], F_GETFL) & O_NONBLOCK) != 0) fail("failure"); blocking_disable(pi[i]); if ((fcntl(pi[i], F_GETFL) & O_NONBLOCK) == 0) fail("failure"); blocking_enable(pi[i]); if ((fcntl(pi[i], F_GETFL) & O_NONBLOCK) != 0) fail("failure"); } _exit(0); } tinyssh-20250501/old/tinyssh-tests/buftest.c000066400000000000000000000506011500472222400207120ustar00rootroot00000000000000/* 20140303 Jan Mojzis Public domain. */ #include #include #include #include #include "fail.h" #include "byte.h" #include "buf.h" #include "str.h" #include "crypto_uint32.h" #include "crypto_uint8.h" /* XXX */ static int xbuf_putnum8_(const char *fn, unsigned long long line, struct buf *b, long long uu) { crypto_uint8 u = uu; return buf_putnum8_(fn, line, b, u); } static int xbuf_putnum32_(const char *fn, unsigned long long line, struct buf *b, long long uu) { crypto_uint32 u = uu; return buf_putnum32_(fn, line, b, u); } struct vectors1 { int (*op)(const char *, unsigned long long, struct buf *, long long); long long spacelen; long long xlen; } testvectors1[] = { { buf_putzerobytes_, 5, 4 }, { buf_putrandombytes_, 5, 4 }, { buf_putpadding_, 5, 4 }, { xbuf_putnum32_, 5, 0 }, { xbuf_putnum8_, 2, 0 }, { 0, 0, 0 } }; struct vectors2 { int (*op)(const char *, unsigned long long, struct buf *, const unsigned char *, long long); long long spacelen; const unsigned char *x; long long xlen; } testvectors2[] = { { buf_put_, 1, (unsigned char *)"", 0 }, { buf_put_, 5, (unsigned char *)"ahoj", 4 }, { buf_putstringlen_, 5, (unsigned char *)"", 0 }, { buf_putstringlen_, 9, (unsigned char *)"ahoj", 4 }, { 0, 0, 0, 0 } }; struct vectors3 { int (*op)(const char *, unsigned long long, struct buf *, const char *); long long spacelen; const char *x; } testvectors3[] = { { buf_puts_, 1, "" }, { buf_puts_, 5, "ahoj" }, { buf_putstring_, 5, "" }, { buf_putstring_, 9, "ahoj" }, { 0, 0, 0 } }; static int _test1a1(long long spacelen, int (*op)(const char *, unsigned long long, struct buf *, long long), long long xlen) { pid_t pid; int status; unsigned char bspace[10]; struct buf b; pid = fork(); if (pid == -1) return -1; if (pid == 0) { close(2); buf_init(&b, bspace, spacelen); op(__FILE__, __LINE__, &b, xlen); buf_put(&b, (unsigned char *)"", 1); /* overflow */ _exit(0); } while (waitpid(pid, &status, 0) != pid) {}; if (!WIFEXITED(status)) return -1; return WEXITSTATUS(status); } static int _test1a2(long long spacelen, int (*op)(const char *, unsigned long long, struct buf *, const unsigned char *, long long), const unsigned char *x, long long xlen) { pid_t pid; int status; unsigned char bspace[10]; struct buf b; pid = fork(); if (pid == -1) return -1; if (pid == 0) { close(2); buf_init(&b, bspace, spacelen); op(__FILE__, __LINE__, &b, x, xlen); buf_put(&b, (unsigned char *)"", 1); /* overflow */ _exit(0); } while (waitpid(pid, &status, 0) != pid) {}; if (!WIFEXITED(status)) return -1; return WEXITSTATUS(status); } static int _test1a3(long long spacelen, int (*op)(const char *, unsigned long long, struct buf *, const char *), const char *x) { pid_t pid; int status; unsigned char bspace[10]; struct buf b; pid = fork(); if (pid == -1) return -1; if (pid == 0) { close(2); buf_init(&b, bspace, spacelen); op(__FILE__, __LINE__, &b, x); buf_put(&b, (unsigned char *)"", 1); /* overflow */ _exit(0); } while (waitpid(pid, &status, 0) != pid) {}; if (!WIFEXITED(status)) return -1; return WEXITSTATUS(status); } static void _test1b1(long long spacelen, int (*op)(const char *, unsigned long long, struct buf *, long long), long long xlen) { unsigned char bspace[10]; struct buf b; buf_init(&b, bspace, spacelen); op(__FILE__, __LINE__, &b, xlen); } static void _test1b2(long long spacelen, int (*op)(const char *, unsigned long long, struct buf *, const unsigned char *, long long), const unsigned char *x, long long xlen) { unsigned char bspace[10]; struct buf b; buf_init(&b, bspace, spacelen); op(__FILE__, __LINE__, &b, x, xlen); } static void _test1b3(long long spacelen, int (*op)(const char *, unsigned long long, struct buf *, const char *), const char *x) { unsigned char bspace[10]; struct buf b; buf_init(&b, bspace, spacelen); op(__FILE__, __LINE__, &b, x); } static void test1(void) { long long i; int r; for (i = 0; testvectors1[i].op; ++i) { r = _test1a1(testvectors1[i].spacelen, testvectors1[i].op, testvectors1[i].xlen); if (r == 0) fail("failure"); _test1b1(testvectors1[i].spacelen, testvectors1[i].op, testvectors1[i].xlen); } for (i = 0; testvectors2[i].op; ++i) { r = _test1a2(testvectors2[i].spacelen, testvectors2[i].op, testvectors2[i].x, testvectors2[i].xlen); if (r == 0) fail("failure"); _test1b2(testvectors2[i].spacelen, testvectors2[i].op, testvectors2[i].x, testvectors2[i].xlen); } for (i = 0; testvectors3[i].op; ++i) { r = _test1a3(testvectors3[i].spacelen, testvectors3[i].op, testvectors3[i].x); if (r == 0) fail("failure"); _test1b3(testvectors3[i].spacelen, testvectors3[i].op, testvectors3[i].x); } } static void test2(void) { unsigned char bspace[2]; struct buf b; unsigned char ch = 0; long long i; buf_init(&b, bspace, sizeof bspace); for (i = 0; i < 10; ++i) { buf_put(&b, &ch, 1); buf_purge(&b); } } struct vectors64 { const char *in; long long inlen; const char *out; } testvectors64[] = { { "\107\303\221\307\306\077\106\014\235\115\356\215\375", 13, "R8ORx8Y/RgydTe6N/Q==" }, { "\133\253\044\246\070\374", 6, "W6skpjj8" }, { "\253\374\323\142\326", 5, "q/zTYtY=" }, { "\335\251\125\150\245\321\040\143\174\152", 10, "3alVaKXRIGN8ag==" }, { "\155\065\344\122\353", 5, "bTXkUus=" }, { "\266\071\073\373\072\035\270\151\201", 9, "tjk7+zoduGmB" }, { "\302\373\135\206\370\012\365", 7, "wvtdhvgK9Q==" }, { "\071\203", 2, "OYM=" }, { "\210\236\076\336\014\122\125\050\016\076\063", 11, "iJ4+3gxSVSgOPjM=" }, { "\241\330\251\122\325\061\142\167\174\315\201\000\275\157\056", 15, "odipUtUxYnd8zYEAvW8u" }, { "\334\306\014\014\021\323\000\120\347\363\335", 11, "3MYMDBHTAFDn890=" }, { "\356\243\102\105\343\146\154\064\006\316\360\301\256\164", 14, "7qNCReNmbDQGzvDBrnQ=" }, { "\250\211\165\344\276\224\031\205\162\315", 10, "qIl15L6UGYVyzQ==" }, { "\356\104\051\125\022\121\070\074\332\301\014\377\303\254\140", 15, "7kQpVRJRODzawQz/w6xg" }, { "\065\340\116\113\133\334\100", 7, "NeBOS1vcQA==" }, { "\151\340\101\120\376", 5, "aeBBUP4=" }, { "\345", 1, "5Q==" }, { "\010\134", 2, "CFw=" }, { "\221\044\355\143\047\351\127\165\314\370\017\347\365", 13, "kSTtYyfpV3XM+A/n9Q==" }, { "\222\237\301\021\214\011\002\367", 8, "kp/BEYwJAvc=" }, { "\235\245\251\304\303\232\223\046\063\062\252\366", 12, "naWpxMOakyYzMqr2" }, { "\215\267\333\017\237\313\210\114\067\164\067\337\024\211\174", 15, "jbfbD5/LiEw3dDffFIl8" }, { "\344\122\212\142\231\251\146\253", 8, "5FKKYpmpZqs=" }, { "\147\105", 2, "Z0U=" }, { "\013\235\177\100\212\167\123\172\201", 9, "C51/QIp3U3qB" }, { "\102\136\120\260\230\125\046\253\323\305\044", 11, "Ql5QsJhVJqvTxSQ=" }, { "\101\152\200\060\134\014\124\202\023\057\250\115\341", 13, "QWqAMFwMVIITL6hN4Q==" }, { "\012\310\224\166\265\072\072\270\052\262\147\145\022", 13, "CsiUdrU6OrgqsmdlEg==" }, { "\021\131\104\067\051\316", 6, "EVlENynO" }, { "\104\323", 2, "RNM=" }, { "\070\274\150\150\014\077", 6, "OLxoaAw/" }, { "\100\132\201\357\023\222\243\301\357", 9, "QFqB7xOSo8Hv" }, { "\225\244", 2, "laQ=" }, { "\212\270\067\052\145\203", 6, "irg3KmWD" }, { "\363\252\326\213\370\065\072\154\077\335\202\242\236\274", 14, "86rWi/g1Omw/3YKinrw=" }, { "\141\041\315\033", 4, "YSHNGw==" }, { "\216\257\025\305\362\044\264\133", 8, "jq8VxfIktFs=" }, { "\342\377\135\236", 4, "4v9dng==" }, { "\121\100\077\162\374\162\274\121\100", 9, "UUA/cvxyvFFA" }, { "\204", 1, "hA==" }, { "\306\345\332\023\241\273\064\227\020\326\102\123\003", 13, "xuXaE6G7NJcQ1kJTAw==" }, { "\227\142\207\137\322\344\074\317\007\245\120", 11, "l2KHX9LkPM8HpVA=" }, { "\267\051\051", 3, "tykp" }, { "\005\244", 2, "BaQ=" }, { "\215\060\165\046\210", 5, "jTB1Jog=" }, { "\100\376\271\317\250\013\264\360\330\012\325\103", 12, "QP65z6gLtPDYCtVD" }, { "\233\340\212\127\160\167\077", 7, "m+CKV3B3Pw==" }, { "\200\041\036\206\273\067", 6, "gCEehrs3" }, { "\207\067\003\324\025\351\033\223\226\300\002\255\167\342\316", 15, "hzcD1BXpG5OWwAKtd+LO" }, { "\263\364\115\054\347\350", 6, "s/RNLOfo" }, { "\211\252\065\167\224", 5, "iao1d5Q=" }, { "\024\327\120\076\031\035\104\003\247", 9, "FNdQPhkdRAOn" }, { "\143\302\131\030\204\134\036\023\305\203\010\236\204\303", 14, "Y8JZGIRcHhPFgwiehMM=" }, { "\124\225\066\007", 4, "VJU2Bw==" }, { "\173\043\162\031\330\351", 6, "eyNyGdjp" }, { "\323\112\227\176\021\120\311\202\035\041\153\326\137", 13, "00qXfhFQyYIdIWvWXw==" }, { "\235\006\017\301\200\121\013\230\373\264\215\256\322\126\111", 15, "nQYPwYBRC5j7tI2u0lZJ" }, { "\317\113\144\056\014\120\246\143\325\272", 10, "z0tkLgxQpmPVug==" }, { "\106\136\226\023\146\054\366\070\007\270\345\321\245\304\177\147", 16, "Rl6WE2Ys9jgHuOXRpcR/Zw==" }, { "\042\163\374\234\332\173\055\166", 8, "InP8nNp7LXY=" }, { "\375\011\321\370\300", 5, "/QnR+MA=" }, { "\034", 1, "HA==" }, { "\350", 1, "6A==" }, { "\147\136\210\264\353\267\311\341\073\110\270\071\033", 13, "Z16ItOu3yeE7SLg5Gw==" }, { "\133\341\131\206\211\171", 6, "W+FZhol5" }, { "\146\176\236\340\264\370\270\313\261\304\217", 11, "Zn6e4LT4uMuxxI8=" }, { "\347\111\263\244\131\103\022\272\163\100\337\324\340\247\006", 15, "50mzpFlDErpzQN/U4KcG" }, { "\132\167\314\125\023\172\223\140\264\146\167\156\245", 13, "WnfMVRN6k2C0ZndupQ==" }, { "\206", 1, "hg==" }, { "\000\346\367\051\051\116", 6, "AOb3KSlO" }, { "\253\117\134\331", 4, "q09c2Q==" }, { "\267\130\307\170", 4, "t1jHeA==" }, { "\252\367\311\250\126\031\001\065\107", 9, "qvfJqFYZATVH" }, { "\204\011\351\022\206\076\056\334\100", 9, "hAnpEoY+LtxA" }, { "\004\302\141\333\230\255\215", 7, "BMJh25itjQ==" }, { "\052\357\233\266\237\017\260\101\000", 9, "Ku+btp8PsEEA" }, { "\302\024\373\144\071\312\012\044\304\340\026\222\066\216", 14, "whT7ZDnKCiTE4BaSNo4=" }, { "\342\054\344\331\312\200\052", 7, "4izk2cqAKg==" }, { "\156\234\310\023\077\041\310\005\137\175\034\307\247", 13, "bpzIEz8hyAVffRzHpw==" }, { "\051\316\243\225\076\257", 6, "Kc6jlT6v" }, { "\275\263\026\127\315\140\172\110\002\365\067\061\270\331", 14, "vbMWV81gekgC9TcxuNk=" }, { "\240\021", 2, "oBE=" }, { "\125\161\171\026\354", 5, "VXF5Fuw=" }, { "\052\131", 2, "Klk=" }, { "\335\234\230\006\054\265\273\124\147\131\015\054\036\335\353", 15, "3ZyYBiy1u1RnWQ0sHt3r" }, { "\073\126\160\312\341\345\234\353\264\245\115\220\316\063\102", 15, "O1ZwyuHlnOu0pU2QzjNC" }, { "\200\070\242\226\226\027\147", 7, "gDiilpYXZw==" }, { "\132\111\013\325\224\115\107\236\124\310\144\262\156\001\004\227", 16, "WkkL1ZRNR55UyGSybgEElw==" }, { "\340\357\121\156\255\173\153\221\125\024", 10, "4O9Rbq17a5FVFA==" }, { "\060\037\251\063\073\022\206\033", 8, "MB+pMzsShhs=" }, { "\355\241", 2, "7aE=" }, { "\144\033\132\321\153\017\244\145\211\027\313\067\166\167\104", 15, "ZBta0WsPpGWJF8s3dndE" }, { "\073\227\264\070\151\002", 6, "O5e0OGkC" }, { "\201\364\206\002\033\125\075\110\036\152\347\011\146\077\023\354", 16, "gfSGAhtVPUgeaucJZj8T7A==" }, { "\232\205\305\006\214\266\355\107\007\314\223\254\142\055\045\260", 16, "moXFBoy27UcHzJOsYi0lsA==" }, { "\053\221\122\341\163", 5, "K5FS4XM=" }, { "\245\113\335\066\012\245\334\335\006\350\373\254\121\346", 14, "pUvdNgql3N0G6PusUeY=" }, { "\250\126\360\135\053\301\342\200", 8, "qFbwXSvB4oA=" }, { "\154\323\054\236\175\252\270\270\220", 9, "bNMsnn2quLiQ" }, { "\322\260\320\175\263", 5, "0rDQfbM=" }, { "\136\073\307\102\376\033\002\243", 8, "XjvHQv4bAqM=" }, { "\361\323\236", 3, "8dOe" }, { "\143\007\375\015", 4, "Ywf9DQ==" }, { "\122\240\036\350\132\212\037\134\114", 9, "UqAe6FqKH1xM" }, { "\213\004\377\313\312\314\144\350\055\147\062\064\270\273\150\221", 16, "iwT/y8rMZOgtZzI0uLtokQ==" }, { "\246\346\106\301\277\300\100", 7, "puZGwb/AQA==" }, { "\176\034\360\143\160\016\072\017\322", 9, "fhzwY3AOOg/S" }, { "\046\335\103\356\145\364\266\165\356\146", 10, "Jt1D7mX0tnXuZg==" }, { "\147\231\300\372\053\373\375\363\257\071", 10, "Z5nA+iv7/fOvOQ==" }, { "\241", 1, "oQ==" }, { "\044\231\150\021\346\347", 6, "JJloEebn" }, { "\026\361\151\071\101", 5, "FvFpOUE=" }, { "\274\021\324\260\123\343", 6, "vBHUsFPj" }, { "\255\312", 2, "rco=" }, { "\012\362\172\166", 4, "CvJ6dg==" }, { "\223\117\213\351\120\321", 6, "k0+L6VDR" }, { "\314\150\017\355\321\372", 6, "zGgP7dH6" }, { "\262\152\141\170\227\353\363\162\116\327\247\342\302\326\255\245", 16, "smpheJfr83JO16fiwtatpQ==" }, { "\276\336\043\244\015\360\114\273\113", 9, "vt4jpA3wTLtL" }, { "\307\075\305\152\226\265\045\170", 8, "xz3Fapa1JXg=" }, { "\342\210\307\244\132\345", 6, "4ojHpFrl" }, { "\370\125\040\013\267\004\057\371\155\321\107\174\241\041", 14, "+FUgC7cEL/lt0Ud8oSE=" }, { "\327\111\202\040\314\147\164\116\217\217\220", 11, "10mCIMxndE6Pj5A=" }, { "\176", 1, "fg==" }, { "\107\326\002\256\146\112\137\304\013\020\020\163\264\213\145\141", 16, "R9YCrmZKX8QLEBBztItlYQ==" }, { "\216", 1, "jg==" }, { "\327\246\371\266\023", 5, "16b5thM=" }, { "\027\352\164\125\266\241\266\272", 8, "F+p0Vbahtro=" }, { "\001\135\250\345", 4, "AV2o5Q==" }, { "\237\302\312\152\355\022\161\240\000\151\330", 11, "n8LKau0ScaAAadg=" }, { "\343\144\171\236\255\261\275\315\300\026\346", 11, "42R5nq2xvc3AFuY=" }, { "\371\206\264\033\200\232\373\003\237\061\120\051\353", 13, "+Ya0G4Ca+wOfMVAp6w==" }, { "\315\220\061\106", 4, "zZAxRg==" }, { "\007", 1, "Bw==" }, { "\125\217\033\216\066\340\143\254\133\004\165\110\143\117\146", 15, "VY8bjjbgY6xbBHVIY09m" }, { "\050\073\200\116\346\355\073\205\061\266\161\033\125\301", 14, "KDuATubtO4UxtnEbVcE=" }, { "\233\140\272\145\333", 5, "m2C6Zds=" }, { "\045\256\173\034\034\373\051\205\041\016\070\212\023\073\204\267", 16, "Ja57HBz7KYUhDjiKEzuEtw==" }, { "\342\254\000\251\017\204\350\152\211\106\116\323\146\262\067\031", 16, "4qwAqQ+E6GqJRk7TZrI3GQ==" }, { "\100\246\015\313\000\366\205\367\273\053", 10, "QKYNywD2hfe7Kw==" }, { "\353\127\334\173\217\266\372\214\374", 9, "61fce4+2+oz8" }, { "\144\243\162\123\006\211\035\337\342\174\071\157\244\316\063\154", 16, "ZKNyUwaJHd/ifDlvpM4zbA==" }, { "\013\371\150\050", 4, "C/loKA==" }, { "\340\214\237\210\113\145\007\077\136\351", 10, "4IyfiEtlBz9e6Q==" }, { "\336\055\356\341\212\040", 6, "3i3u4Yog" }, { "\354\316\211\157\113\304\374\267\010\137\264\043\220\306\210\125", 16, "7M6Jb0vE/LcIX7QjkMaIVQ==" }, { "\355\116\363\331\314\366\005\230\253\137", 10, "7U7z2cz2BZirXw==" }, { "\017\353\200\145\335\054\106\231", 8, "D+uAZd0sRpk=" }, { "\017\146\253\337\150\156\326\076\105\040\026\154\133", 13, "D2ar32hu1j5FIBZsWw==" }, { "\072", 1, "Og==" }, { "\163\107\062\261\176\103\261\267\031\214\346\350\124\101\257", 15, "c0cysX5DsbcZjOboVEGv" }, { "\333\005\104\376\205\323\203", 7, "2wVE/oXTgw==" }, { "\072", 1, "Og==" }, { "\246\270\237\262\261\252\220\273", 8, "prifsrGqkLs=" }, { "\076\140", 2, "PmA=" }, { "\343\043\335\346\134\003\240\244\067\271\105\311", 12, "4yPd5lwDoKQ3uUXJ" }, { "\327\375\152\126", 4, "1/1qVg==" }, { "\103\231\176\252\263\126\047\356\370\266\027\072\003\162", 14, "Q5l+qrNWJ+74thc6A3I=" }, { "\373\321", 2, "+9E=" }, { "\127\052\054\340\245\243\261", 7, "Vyos4KWjsQ==" }, { "\027\236\317\116\373\155\111\057\026\371\247\227\055\242", 14, "F57PTvttSS8W+aeXLaI=" }, { "\175\166\256\272\045\302\221\306\237\151\116\031\223\233", 14, "fXauuiXCkcafaU4Zk5s=" }, { "\140\241", 2, "YKE=" }, { "\064\332\317\246\113\370\276\341\302", 9, "NNrPpkv4vuHC" }, { "\245\306\176\341\217\000\073\265\237\124", 10, "pcZ+4Y8AO7WfVA==" }, { "\026\173\274\034\340\061\376\246\233\375\326\250\164\313\304\353", 16, "Fnu8HOAx/qab/daodMvE6w==" }, { "\277\034", 2, "vxw=" }, { "\215\120\005\160\173\000\153\373\026\123\045\074\142\337", 14, "jVAFcHsAa/sWUyU8Yt8=" }, { "\221\122\070\352\346\035\227\270\342\066\237\170\266", 13, "kVI46uYdl7jiNp94tg==" }, { "\274\270", 2, "vLg=" }, { "\341\155\367\111\106\042\036\112\242\262\004\354\131\153", 14, "4W33SUYiHkqisgTsWWs=" }, { "\254\103\176\060", 4, "rEN+MA==" }, { "\277\305\046\061\037\111\121\315", 8, "v8UmMR9JUc0=" }, { "\220\155\334\167\323\340\065\301\101\014\101\277", 12, "kG3cd9PgNcFBDEG/" }, { "\117", 1, "Tw==" }, { "\152\165\104\351\003\100\006\311\061\045", 10, "anVE6QNABskxJQ==" }, { "\171\020\056\304\213", 5, "eRAuxIs=" }, { "\263\317\223\332\321\036\203\241\016\355\173\163\060\121", 14, "s8+T2tEeg6EO7XtzMFE=" }, { "\051\046\035\170\002", 5, "KSYdeAI=" }, { "\214\324\001\125\062\247\010\122\147\376\021\031", 12, "jNQBVTKnCFJn/hEZ" }, { "\035\126\117\235\225\176\135\370\347", 9, "HVZPnZV+Xfjn" }, { "\334", 1, "3A==" }, { "\203\117\166\021\144\257", 6, "g092EWSv" }, { "\262\155", 2, "sm0=" }, { "\241\242\031\110\014\223\340\175\311", 9, "oaIZSAyT4H3J" }, { "\074\373\225\217\164\140\125\353\300\256\146\202\301\133", 14, "PPuVj3RgVevArmaCwVs=" }, { "\336\354\143\220\367\007\342\114\007\040\331\362\245", 13, "3uxjkPcH4kwHINnypQ==" }, { "\144\107\331\316\274\005\264", 7, "ZEfZzrwFtA==" }, { "\027\371\125\116\174\275\160\220\306\266", 10, "F/lVTny9cJDGtg==" }, { "\155\315\167\325\171\213\242\064\211\122\217\335\250\154", 14, "bc131XmLojSJUo/dqGw=" }, { "\126\075\332\131\265\225\065\337\130\133\314\337", 12, "Vj3aWbWVNd9YW8zf" }, { "\051\032\131\176\353\047\001\037\304\170\136\155\222\344", 14, "KRpZfusnAR/EeF5tkuQ=" }, { "\323\011\213\013\160\037\274\235\026\155\352\234", 12, "0wmLC3AfvJ0Wbeqc" }, { "\174\260\057\114\125\272\330\213\141\034\130\277", 12, "fLAvTFW62IthHFi/" }, { "\234\376\012\217\376\061\152\202\177", 9, "nP4Kj/4xaoJ/" }, { "\162\267\211\246\213\237\325\136\140\143\173", 11, "creJpouf1V5gY3s=" }, { "\224\317\166\131\020\266\045", 7, "lM92WRC2JQ==" }, { "\075\002\145\273\112\375\070\101\311\125\337\070\003\336\363", 15, "PQJlu0r9OEHJVd84A97z" }, { "\177\105\134\344\106\350\034\205", 8, "f0Vc5EboHIU=" }, { "\130\336\125\300\053\331\050", 7, "WN5VwCvZKA==" }, { 0, 0, 0 } }; static void test3(void) { unsigned char bspace[100]; struct buf b; long long i, outlen; buf_init(&b, bspace, sizeof bspace); for (i = 0; testvectors64[i].in; ++i) { buf_purge(&b); outlen = str_len(testvectors64[i].out); buf_putbase64(&b, (unsigned char *)testvectors64[i].in, testvectors64[i].inlen); if (b.len != outlen || !byte_isequal(b.buf, outlen, testvectors64[i].out)) { fail("buf_putbase64 failed"); } } } static void test4(void) { unsigned char bspace[2]; struct buf b; buf_init(&b, bspace, 1); if (buf_ready(&b, 1)) fail("buf_ready failed"); buf_init(&b, bspace, 2); if (!buf_ready(&b, 1)) fail("buf_ready failed"); } struct vectorssh { const char *in; long long inlen; const char *out; long long outlen; } testvectorssh[] = { { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 32, "\0\0\0\0" , 4}, { "\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1", 32, "\0\0\0\040\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1" , 36}, { "\377\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1", 32, "\0\0\0\041\0\377\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1" , 37}, { 0, 0, 0, 0}, }; static unsigned char bspacesh[64]; static struct buf b; static void test5(void) { long long i; buf_init(&b, bspacesh, sizeof bspacesh); for (i = 0; testvectorssh[i].in; ++i) { buf_purge(&b); buf_putsharedsecret(&b, (unsigned char *)testvectorssh[i].in, testvectorssh[i].inlen); if (b.len != testvectorssh[i].outlen || !byte_isequal(b.buf, b.len, testvectorssh[i].out)) { fail("buf_putbasesharedsecret failed"); } } } int main(void) { test1(); test2(); test3(); test4(); test5(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/bytetest.c000066400000000000000000000034071500472222400211030ustar00rootroot00000000000000/* 20140302 Jan Mojzis Public domain. */ /* XXX TODO - check if byte_isequal is constant-time */ #include #include "fail.h" #include "byte.h" int main(void) { unsigned char b1[32]; unsigned char b2[32]; long long i, j; const char *x = "abcdefgh"; char y[8]; /* byte_zero test */ for (i = 0; i < 32; ++i) { for (j = 0; j < sizeof b1; ++j) b1[j] = 0; for (j = 0; j < sizeof b2; ++j) b2[j] = 0; b1[i] = 0xff; b2[i] = 0xff; byte_zero(b1, sizeof b1); if (byte_isequal(b1, 32, b2) != 0) fail("byte_zero failure"); } /* byte_isequal test */ for (i = 0; i < sizeof b1; ++i) b1[i] = 0xff; for (i = 0; i < sizeof b2; ++i) b2[i] = 0xff; if (byte_isequal(b1, 32, b2) == 0) fail("byte_isequal failure"); for (i = 0; i < 32; ++i) { b1[i] = 0; if (byte_isequal(b1, 32, b2) != 0) fail("byte_isequal failure"); b1[i] = 0xff; } /* byte_copy test */ for (i = 0; i < sizeof b1; ++i) b1[i] = 0xff; for (i = 0; i < sizeof b2; ++i) b2[i] = 0x00; byte_copy(b1, 32, b2); if (byte_isequal(b1, 32, b2) == 0) fail("byte_copy failure"); for (i = 0; i < 32; ++i) { b1[i] = 0; byte_copy(b1, 32, b2); if (byte_isequal(b1, 32, b2) == 0) fail("byte_copy failure"); b1[i] = 0xff; } byte_zero(y, 8); if (!byte_isequal(y, 8, "\0\0\0\0\0\0\0\0")) fail("byte_zero/byte_isequal failure"); byte_copy(y, 8, x); if (!byte_isequal(y, 8, x)) fail("byte_copy/byte_isequal failure"); byte_copy(y, 7, y + 1); if (!byte_isequal(y, 8, "bcdefghh")) fail("byte_copy/byte_isequal failure"); byte_zero(y, 8); if (!byte_isequal(y, 8, "\0\0\0\0\0\0\0\0")) fail("byte_zero/byte_isequal failure"); return 0; } tinyssh-20250501/old/tinyssh-tests/channel_droptest.c000077700000000000000000000000001500472222400247652emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/channel_forkptytest.c000077700000000000000000000000001500472222400255172emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/channel_forktest.c000066400000000000000000000041051500472222400225650ustar00rootroot00000000000000/* 20140416 Jan Mojzis Public domain. */ #include #include #include #include #include #include "fail.h" #include "writeall.h" #include "readall.h" #include "byte.h" #include "channel.h" /* test if channel_fork pipes works from child to parent */ static void test1(void) { int fd[3]; pid_t pid; int status; char buf[5]; pid = channel_fork(fd); if (pid == -1) fail("channel_fork failure"); if (pid == 0) { if (writeall(1, "ahoj1", 5) == -1) fail("writeall failure"); if (writeall(2, "ahoj2", 5) == -1) fail("writeall failure"); _exit(0); } if (fd[0] == -1) fail("channel_fork failure"); if (fd[1] == -1) fail("channel_fork failure"); if (fd[2] == -1) fail("channel_fork failure"); if (readall(fd[1], buf, 5) == -1) fail("readall failure"); if (!byte_isequal(buf, 5, "ahoj1")) fail("readall failure"); if (readall(fd[2], buf, 5) == -1) fail("readall failure"); if (!byte_isequal(buf, 5, "ahoj2")) fail("readall failure"); while (waitpid(pid, &status, 0) != pid) {}; if (!WIFEXITED(status)) fail("process killed"); if (WEXITSTATUS(status)) fail("process exited with status != 0"); } /* test if channel_fork pipes works from parent to child */ static void test2(void) { int fd[3]; pid_t pid; int status; char buf[5]; pid = channel_fork(fd); if (pid == -1) fail("channel_fork failure"); if (pid == 0) { if (readall(0, buf, 5) == -1) fail("readall failure"); if (!byte_isequal(buf, 5, "ahoj0")) fail("readall failure"); _exit(0); } if (fd[0] == -1) fail("channel_fork failure"); if (fd[1] == -1) fail("channel_fork failure"); if (fd[2] == -1) fail("channel_fork failure"); if (writeall(fd[0], "ahoj0", 5) == -1) fail("writeall failure"); while (waitpid(pid, &status, 0) != pid) {}; if (!WIFEXITED(status)) fail("process killed"); if (WEXITSTATUS(status)) fail("process exited with status != 0"); } int main(void) { alarm(10); test1(); test2(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/channel_subsystemtest.c000066400000000000000000000034631500472222400236700ustar00rootroot00000000000000/* 20150113 Jan Mojzis Public domain. */ #include #include "fail.h" #include "numtostr.h" #include "channel.h" const char *vector[] = { "0=0", "1=1", "2=2", "3=3", "4=4", "5=5", "6=6", "7=7", "8=8", "9=9", "10=10", "11=11", "12=12", "13=13", "14=14", "15=15", "16=16", "17=17", "18=18", "19=19", "20=20", "21=21", "22=22", "23=23", "24=24", "25=25", "26=26", "27=27", "28=28", "29=29", "30=30", "31=31", "32=32", "33=33", "34=34", "35=35", "36=36", "37=37", "38=38", "39=39", "40=40", "41=41", "42=42", "43=43", "44=44", "45=45", "46=46", "47=47", "48=48", "49=49", "50=50", "51=51", "52=52", "53=53", "54=54", "55=55", "56=56", "57=57", "58=58", "59=59", "60=60", "61=61", "62x=62", "63=63x", "64=64" }; #if CHANNEL_SUBSYSTEM_MAX != 64 error ! #endif static void test1(void) { long long i; for (i = 0; i < 64; ++i) { if (!channel_subsystem_add(vector[i])) fail("failure"); } if (channel_subsystem_add(vector[i])) fail("failure"); } static void test2(void) { long long i; char *x, *n; for (i = 0; i < 62; ++i) { n = numtostr(0, i); x = channel_subsystem_get(n); if (!x) fail("failure"); if (strcmp(x, n)) fail("failure"); } n = numtostr(0, 62); x = channel_subsystem_get(n); if (x) fail("failure"); n = numtostr(0, 63); x = channel_subsystem_get(n); if (!x) fail("failure"); if (!strcmp(x, n)) fail("failure"); n = numtostr(0, 64); x = channel_subsystem_get(n); if (x) fail("failure"); } int main(void) { test1(); test2(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/channeltest.c000066400000000000000000000140511500472222400215450ustar00rootroot00000000000000/* 20140423 Jan Mojzis Public domain. */ #include #include #include #include #include "crypto_uint32.h" #include "fail.h" #include "run.h" #include "byte.h" #include "channel.h" const char *user = "user"; const char *termname = "xterm"; crypto_uint32 id = 0; crypto_uint32 remotewindow = 100; crypto_uint32 maxpacket = 100; crypto_uint32 localwindow; unsigned char ch = 'x'; static char *name(void) { struct passwd *pw; pw = getpwuid(geteuid()); return pw->pw_name; } /* channel can't be opened 2x */ static void testopen1(void) { int r; r = channel_open(user, id, remotewindow, maxpacket, &localwindow); if (r != 1) fail("first channel_open not returns 1"); r = channel_open(user, id, remotewindow, maxpacket, &localwindow); if (r != 0) fail("first channel_open not returns 0"); _exit(0); } /* *localwindow can't be 0 */ static void testopen2(void) { channel_open(user, id, remotewindow, maxpacket, 0); } /* maxpacket can't be 0 */ static void testopen3(void) { channel_open(user, id, remotewindow, 0, &localwindow); } /* remotewindow can't be 0 */ static void testopen4(void) { channel_open(user, id, 0, maxpacket, &localwindow); } /* channel_openterminal() can't be called before channel_open() */ static void testtermopen1(void) { channel_openterminal(termname, 0, 0, 0, 0); } /* channel_env() can't be called before channel_open() */ static void testenv1(void) { channel_env("a", "b"); } /* channel_env() can't be called after channel_exec() */ static void testenv2(void) { channel_open(name(), id, remotewindow, maxpacket, &localwindow); channel_exec("exit 0"); channel_env("a", "b"); } /* channel_exec() can't be called before channel_open() */ static void testexec1(void) { channel_exec("true"); } /* channel_put() can't be called before channel_exec() */ static void testput1(void) { channel_open(user, id, remotewindow, maxpacket, &localwindow); channel_put(&ch, 1); } /* channel_puteof() can't be called before channel_exec() */ static void testputeof1(void) { channel_open(user, id, remotewindow, maxpacket, &localwindow); channel_puteof(); } /* channel_read() can't be called before channel_exec() */ static void testread1(void) { channel_open(user, id, remotewindow, maxpacket, &localwindow); channel_read(&ch, 1); } /* channel_extendedread() can't be called before channel_exec() */ static void testextendedread1(void) { channel_open(user, id, remotewindow, maxpacket, &localwindow); channel_extendedread(&ch, 1); } /* channel_write() can't be called before channel_exec() */ static void testwrite1(void) { channel_open(user, id, remotewindow, maxpacket, &localwindow); channel_write(); } /* OK - tests */ static void testok1(void) { int r, s, e; channel_open(name(), id, remotewindow, maxpacket, &localwindow); channel_exec("exit 0"); do { r = channel_waitnohang(&s, &e); } while (r == 0); if (s != 0) fail("process killed"); if (e != 0) fail("bad status"); _exit(0); } static void testok2(void) { int r, s, e; channel_open(name(), id, remotewindow, maxpacket, &localwindow); channel_exec("exit 1"); do { r = channel_waitnohang(&s, &e); } while (r == 0); if (s != 0) fail("process killed"); if (e != 1) fail("bad status"); _exit(0); } static void testok3(void) { int r, s, e; channel_open(name(), id, remotewindow, maxpacket, &localwindow); channel_exec("kill -9 $$"); do { r = channel_waitnohang(&s, &e); } while (r == 0); if (s != 9) fail("bad exit signal"); _exit(0); } static void testok4(void) { int r, s, e; unsigned char buf[10]; channel_open(name(), id, remotewindow, maxpacket, &localwindow); channel_exec("cat"); ch = 'a'; channel_put(&ch, 1); do { r = channel_write(); } while (r == 0); do { r = channel_read(buf, sizeof buf); } while (r == 0); if (r != 1) fail("channel_write()/channel_read() failure"); if (buf[0] != 'a') fail("channel_write()/channel_read() failure"); channel_puteof(); do { r = channel_waitnohang(&s, &e); } while (r == 0); if (s != 0) fail("process killed"); if (e != 0) fail("bad status"); _exit(0); } #define warn_(a, b, x) do { fprintf(stderr, "%s:%llu: warning: %s\n", (a), (unsigned long long)(b), (x)); fflush(stderr); _exit(0); } while (0); #define warn(x) warn_(__FILE__, __LINE__, (x)) static int homedir(void) { struct passwd *pw; struct stat st; pw = getpwuid(geteuid()); if (!pw) return 0; return 1 + stat(pw->pw_dir, &st); } static int shell(void) { pid_t pid; int status; pid = fork(); if (pid == -1) return 0; if (pid == 0) { struct passwd *pw; char *run[4]; pw = getpwuid(geteuid()); if (!pw) _exit(1); run[0] = pw->pw_shell; run[1] = (char *)"-c"; run[2] = (char *)"exit 0"; run[3] = (char *)0; execvp(run[0], run); _exit(1); } while (waitpid(pid, &status, 0) != pid) {}; if (!WIFEXITED(status)) return 0; if (WEXITSTATUS(status)) return 0; return 1; } int main(void) { /* don't run check when homedir not exist */ if (!homedir()) { warn("homedir not exist - skipping tests") _exit(0); } /* don't run check when shell returns non-zero */ if (!shell()) { warn("shell returns non-zero - skipping tests") _exit(0); } run_mustpass(testopen1); run_mustfail(testopen2); run_mustfail(testopen3); run_mustfail(testopen4); run_mustfail(testtermopen1); run_mustfail(testenv1); run_mustfail(testenv2); run_mustfail(testexec1); run_mustfail(testput1); run_mustfail(testputeof1); run_mustfail(testread1); run_mustfail(testextendedread1); run_mustfail(testwrite1); /* temp. disable the rest */ _exit(0); run_mustpass(testok1); run_mustpass(testok2); run_mustpass(testok3); run_mustpass(testok4); _exit(0); } tinyssh-20250501/old/tinyssh-tests/coetest.c000066400000000000000000000007731500472222400207110ustar00rootroot00000000000000/* 20140302 Jan Mojzis Public domain. */ #include #include #include #include "fail.h" #include "coe.h" int main(void) { int pi[2]; long long i; if (pipe(pi) == -1) fail("failure"); for (i = 0; i < 2; ++i) { if (fcntl(pi[i], F_GETFD) != 0) fail("failure"); coe_enable(pi[i]); if (fcntl(pi[i], F_GETFD) == 0) fail("failure"); coe_disable(pi[i]); if (fcntl(pi[i], F_GETFD) != 0) fail("failure"); } _exit(0); } tinyssh-20250501/old/tinyssh-tests/connectioninfotest.c000066400000000000000000000126221500472222400231520ustar00rootroot00000000000000/* 20140302 Jan Mojzis Public domain. */ #include #include #include #include #include #include #include #include #include #include "fail.h" #include "porttostr.h" #include "iptostr.h" #include "connectioninfo.h" #include "byte.h" static void connectioninfotest_empty(void) { char localip[IPTOSTR_LEN]; char localport[PORTTOSTR_LEN]; char remoteip[IPTOSTR_LEN]; char remoteport[PORTTOSTR_LEN]; connectioninfo(localip, localport, remoteip, remoteport); if (strcmp(localip, "unknown")) fail("connectioninfo failed"); if (strcmp(localport, "0")) fail("connectioninfo failed"); if (strcmp(remoteip, "unknown")) fail("connectioninfo failed"); if (strcmp(remoteport, "0")) fail("connectioninfo failed"); } static void connectioninfotest_tcpserverenv(void) { char localip[IPTOSTR_LEN]; char localport[PORTTOSTR_LEN]; char remoteip[IPTOSTR_LEN]; char remoteport[PORTTOSTR_LEN]; if (setenv("TCPLOCALIP", "aaax", 1) == -1) fail("setenv failed") if (setenv("TCPLOCALPORT", "bbbx", 1) == -1) fail("setenv failed") if (setenv("TCPREMOTEIP", "cccx", 1) == -1) fail("setenv failed") if (setenv("TCPREMOTEPORT", "dddx", 1) == -1) fail("setenv failed") connectioninfo(localip, localport, remoteip, remoteport); if (strcmp(localip, "aaax")) fail("connectioninfo failed"); if (strcmp(localport, "bbbx")) fail("connectioninfo failed"); if (strcmp(remoteip, "cccx")) fail("connectioninfo failed"); if (strcmp(remoteport, "dddx")) fail("connectioninfo failed"); if (unsetenv("TCPLOCALIP") == -1) fail("unsetenv failed") if (unsetenv("TCPLOCALPORT") == -1) fail("unsetenv failed") if (unsetenv("TCPREMOTEIP") == -1) fail("unsetenv failed") if (unsetenv("TCPREMOTEPORT") == -1) fail("unsetenv failed") } static void connectioninfotest_curvecpserverenv(void) { #ifdef TODO char localip[IPTOSTR_LEN]; char localport[PORTTOSTR_LEN]; char remoteip[IPTOSTR_LEN]; char remoteport[PORTTOSTR_LEN]; if (setenv("CURVECPLOCALIP", "aaay", 1) == -1) fail("setenv failed") if (setenv("CURVECPLOCALPORT", "bbby", 1) == -1) fail("setenv failed") if (setenv("CURVECPREMOTEIP", "cccy", 1) == -1) fail("setenv failed") if (setenv("CURVECPREMOTEPORT", "dddy", 1) == -1) fail("setenv failed") connectioninfo(localip, localport, remoteip, remoteport); if (strcmp(localip, "aaay")) fail("connectioninfo failed"); if (strcmp(localport, "bbby")) fail("connectioninfo failed"); if (strcmp(remoteip, "cccy")) fail("connectioninfo failed"); if (strcmp(remoteport, "dddy")) fail("connectioninfo failed"); if (unsetenv("CURVECPLOCALIP") == -1) fail("unsetenv failed") if (unsetenv("CURVECPLOCALPORT") == -1) fail("unsetenv failed") if (unsetenv("CURVECPREMOTEIP") == -1) fail("unsetenv failed") if (unsetenv("CURVECPREMOTEPORT") == -1) fail("unsetenv failed") #endif } static struct vectors { const char *port; const char *portstr; } testvectors[] = { { "\377\000", "65280" }, { "\377\001", "65281" }, { "\377\002", "65282" }, { "\377\003", "65283" }, { "\377\004", "65284" }, { "\377\005", "65285" }, { "\377\006", "65286" }, { "\377\007", "65287" }, { "\377\010", "65288" }, { "\377\011", "65289" }, { "\377\012", "65290" }, { "\377\013", "65291" }, { "\377\014", "65292" }, { "\377\015", "65293" }, { "\377\016", "65294" }, { "\377\017", "65295" }, { "\377\020", "65296" }, { "\377\021", "65297" }, { "\377\022", "65298" }, { "\377\023", "65299" }, { 0, 0 } }; static void connectioninfotest_fromfd(void) { int fd; struct sockaddr_in sa; long long i, j; char localip[IPTOSTR_LEN]; char localport[PORTTOSTR_LEN]; char remoteip[IPTOSTR_LEN]; char remoteport[PORTTOSTR_LEN]; /* create socket */ fd = socket(PF_INET, SOCK_DGRAM, 0); if (fd == -1) fail("socket failed"); /* bind */ for (i = 0; testvectors[i].port; ++i) { byte_zero(&sa, sizeof sa); sa.sin_family = PF_INET; byte_copy(&sa.sin_addr, 4, "\177\0\0\1"); byte_copy(&sa.sin_port, 2, testvectors[i].port); if (bind(fd, (struct sockaddr *)&sa, sizeof sa) == 0) goto bind; } fail("bind failed"); bind: /* connect */ for (j = i; testvectors[j].port; ++j) { byte_zero(&sa, sizeof sa); sa.sin_family = PF_INET; byte_copy(&sa.sin_addr, 4, "\177\0\0\1"); byte_copy(&sa.sin_port, 2, testvectors[i].port); if (connect(fd, (struct sockaddr *)&sa, sizeof sa) == 0) goto connect; } fail("connect failed"); connect: close(0); if (dup(fd) != 0) fail("dup failed"); close(fd); connectioninfo(localip, localport, remoteip, remoteport); if (strcmp(localip, "127.0.0.1")) fail("connectioninfo failed"); if (strcmp(localport, testvectors[i].portstr)) fail("connectioninfo failed"); if (strcmp(remoteip, "127.0.0.1")) fail("connectioninfo failed"); if (strcmp(remoteport, testvectors[j].portstr)) fail("connectioninfo failed"); close(0); } int main(void) { connectioninfotest_empty(); connectioninfotest_tcpserverenv(); connectioninfotest_empty(); connectioninfotest_curvecpserverenv(); connectioninfotest_empty(); connectioninfotest_fromfd(); connectioninfotest_empty(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/dietest.c000077700000000000000000000000001500472222400230722emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/dropuidgidtest.c000066400000000000000000000014051500472222400222660ustar00rootroot00000000000000/* 20140320 Jan Mojzis Public domain. */ #include #include "run.h" #include "fail.h" #include "dropuidgid.h" static void droproot(void) { if (geteuid() == 0) { if (!dropuidgid(0, 1230, 1230)) _exit(111); } if (geteuid() == 0) _exit(111); } static void test1(void) { droproot(); if (dropuidgid(0, 1231, getegid())) _exit(111); _exit(0); } static void test2(void) { droproot(); if (!dropuidgid(0, geteuid(), getegid())) _exit(111); if (!dropuidgid(0, geteuid(), getegid())) _exit(111); _exit(0); } static void test3(void) { droproot(); if (!dropuidgid(0, 0, 0)) _exit(111); _exit(0); } int main(void) { run_mustpass(test1); run_mustpass(test2); run_mustfail(test3); _exit(0); } tinyssh-20250501/old/tinyssh-tests/emptytest.c000066400000000000000000000001411500472222400212660ustar00rootroot00000000000000/* 20140319 Jan Mojzis Public domain. */ #include int main(void) { _exit(0); } tinyssh-20250501/old/tinyssh-tests/envtest.c000066400000000000000000000021771500472222400207330ustar00rootroot00000000000000/* 20130606 Jan Mojzis Public domain. */ #include #include #include #include #include "fail.h" #include "env.h" static void test_zero(void) { if (env_get(0)) fail("env_get accepts zero input"); } static void doit(const char *d0, const char *d) { char *s; s = env_get(d0); if (!s) { if (d) fail("env_get failure"); return; } if (!s) fail("env_get failure"); if (strcmp(s, d)) fail("env_get failure"); return; } static void test_setunset(void) { setenv("x","x",1); doit("x", "x"); setenv("x","y",1); doit("x", "y"); unsetenv("x"); doit("x", 0); } static void test_env(void) { const char *env[10]; env[0] = "a=1"; env[1] = "a=2"; env[2] = "b=b=1"; env[3] = "c="; env[4] = "d"; env[5] = "=null"; env[6] = "e=="; env[7] = 0; environ = (char **)env; doit("a", "1"); doit("b", "b=1"); doit("b=b", "1"); doit("c", ""); doit("d", 0); doit("e", "="); doit("", "null"); } int main(void) { test_zero(); test_setunset(); test_env(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/etest.c000066400000000000000000000002161500472222400203570ustar00rootroot00000000000000/* 20140417 Jan Mojzis Public domain. */ #include #include "e.h" #ifndef EPROTO error! #endif int main(void) { _exit(0); } tinyssh-20250501/old/tinyssh-tests/fail.h000066400000000000000000000013441500472222400201560ustar00rootroot00000000000000#ifndef _FAIL_H____ #define _FAIL_H____ #include #include #include "fail.h" #define fail_(a, b, x) do { fprintf(stderr, "%s:%llu: %s\n", (a), (unsigned long long)(b), (x)); fflush(stderr); _exit(111); } while (0); #define fail(x) fail_(__FILE__, __LINE__, (x)) static void fail_printdata(char *text, unsigned char *data, long long len) { long long i; fprintf(stderr, "%s = {\n ", text); for (i = 0; i < len; ++i) { if (i == len - 1) { fprintf(stderr, "0x%02x", data[i]); } else { fprintf(stderr, "0x%02x, ", data[i]); if (i % 8 == 7) fprintf(stderr, "\n "); } } fprintf(stderr, "\n};\n"); fflush(stderr); } #endif tinyssh-20250501/old/tinyssh-tests/forkptytest.c000077700000000000000000000000001500472222400240272emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/getlntest.c000066400000000000000000000040151500472222400212450ustar00rootroot00000000000000/* 20140323 Jan Mojzis Public domain. */ #include #include #include "fail.h" #include "savesync.h" #include "str.h" #include "byte.h" #include "open.h" #include "getln.h" int main(void) { char buf[6]; int fd; int r; /* create test file */ if (savesync("getlntest.txt", "ab\ncd", 5) == -1) fail("savesync() failure"); /* ok test */ fd = open_read("getlntest.txt"); if (fd == -1) fail("open_read() failure"); r = getln(fd, buf, sizeof buf); if (r != 1) fail("getln() failure"); if (str_len(buf) != 3) fail("getln() failure"); if (!byte_isequal(buf, 3, "ab\n")) fail("getln() failure"); r = getln(fd, buf, sizeof buf); if (r != 0) fail("getln() failure"); if (str_len(buf) != 2) fail("getln() failure"); if (!byte_isequal(buf, 2, "cd")) fail("getln() failure"); close(fd); /* overflow test */ fd = open_read("getlntest.txt"); if (fd == -1) fail("open_read() failure"); r = getln(fd, buf, 3); if (r != -1) fail("getln() failure"); close(fd); if (unlink("getlntest.txt") == -1) fail("unlink() failure"); /* empty test */ if (savesync("getlntest.txt", "", 0) == -1) fail("savesync() failure"); fd = open_read("getlntest.txt"); if (fd == -1) fail("open_read() failure"); r = getln(fd, buf, sizeof buf); if (r != 0) fail("getln() failure"); if (str_len(buf) != 0) fail("getln() failure"); close(fd); if (unlink("getlntest.txt") == -1) fail("unlink() failure"); /* empty line test */ if (savesync("getlntest.txt", "\n", 1) == -1) fail("savesync() failure"); fd = open_read("getlntest.txt"); if (fd == -1) fail("open_read() failure"); r = getln(fd, buf, sizeof buf); if (r != 1) fail("getln() failure"); if (str_len(buf) != 1) fail("getln() failure"); r = getln(fd, buf, sizeof buf); if (r != 0) fail("getln() failure"); if (str_len(buf) != 0) fail("getln() failure"); close(fd); if (unlink("getlntest.txt") == -1) fail("unlink() failure"); _exit(0); } tinyssh-20250501/old/tinyssh-tests/globaltest.c000066400000000000000000000004141500472222400213730ustar00rootroot00000000000000/* 20140304 Jan Mojzis Public domain. */ #include #include "global.h" #ifndef GLOBAL_BSIZE error! #endif int main(void) { global_init(); global_init(); global_purge(); global_purge(); global_init(); global_init(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/iptostrtest.c000066400000000000000000001453141500472222400216500ustar00rootroot00000000000000/* 20130605 Jan Mojzis Public domain. */ #include #include "fail.h" #include "iptostr.h" struct vectors { const char *ip; const char *ipstr; } testvectors[] = { { "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000", "::" }, { "\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000", "1::" }, { "\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000", "0:1::" }, { "\000\001\000\001\000\000\000\000\000\000\000\000\000\000\000\000", "1:1::" }, { "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000", "0:0:1::" }, { "\000\001\000\000\000\001\000\000\000\000\000\000\000\000\000\000", "1:0:1::" }, { "\000\000\000\001\000\001\000\000\000\000\000\000\000\000\000\000", "0:1:1::" }, { "\000\001\000\001\000\001\000\000\000\000\000\000\000\000\000\000", "1:1:1::" }, { "\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000", "0:0:0:1::" }, { "\000\001\000\000\000\000\000\001\000\000\000\000\000\000\000\000", "1:0:0:1::" }, { "\000\000\000\001\000\000\000\001\000\000\000\000\000\000\000\000", "0:1:0:1::" }, { "\000\001\000\001\000\000\000\001\000\000\000\000\000\000\000\000", "1:1:0:1::" }, { "\000\000\000\000\000\001\000\001\000\000\000\000\000\000\000\000", "0:0:1:1::" }, { "\000\001\000\000\000\001\000\001\000\000\000\000\000\000\000\000", "1:0:1:1::" }, { "\000\000\000\001\000\001\000\001\000\000\000\000\000\000\000\000", "0:1:1:1::" }, { "\000\001\000\001\000\001\000\001\000\000\000\000\000\000\000\000", "1:1:1:1::" }, { "\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000", "::1:0:0:0" }, { "\000\001\000\000\000\000\000\000\000\001\000\000\000\000\000\000", "1::1:0:0:0" }, { "\000\000\000\001\000\000\000\000\000\001\000\000\000\000\000\000", "0:1:0:0:1::" }, { "\000\001\000\001\000\000\000\000\000\001\000\000\000\000\000\000", "1:1:0:0:1::" }, { "\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\000", "0:0:1:0:1::" }, { "\000\001\000\000\000\001\000\000\000\001\000\000\000\000\000\000", "1:0:1:0:1::" }, { "\000\000\000\001\000\001\000\000\000\001\000\000\000\000\000\000", "0:1:1:0:1::" }, { "\000\001\000\001\000\001\000\000\000\001\000\000\000\000\000\000", "1:1:1:0:1::" }, { "\000\000\000\000\000\000\000\001\000\001\000\000\000\000\000\000", "::1:1:0:0:0" }, { "\000\001\000\000\000\000\000\001\000\001\000\000\000\000\000\000", "1:0:0:1:1::" }, { "\000\000\000\001\000\000\000\001\000\001\000\000\000\000\000\000", "0:1:0:1:1::" }, { "\000\001\000\001\000\000\000\001\000\001\000\000\000\000\000\000", "1:1:0:1:1::" }, { "\000\000\000\000\000\001\000\001\000\001\000\000\000\000\000\000", "0:0:1:1:1::" }, { "\000\001\000\000\000\001\000\001\000\001\000\000\000\000\000\000", "1:0:1:1:1::" }, { "\000\000\000\001\000\001\000\001\000\001\000\000\000\000\000\000", "0:1:1:1:1::" }, { "\000\001\000\001\000\001\000\001\000\001\000\000\000\000\000\000", "1:1:1:1:1::" }, { "\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000", "::1:0:0" }, { "\000\001\000\000\000\000\000\000\000\000\000\001\000\000\000\000", "1::1:0:0" }, { "\000\000\000\001\000\000\000\000\000\000\000\001\000\000\000\000", "0:1::1:0:0" }, { "\000\001\000\001\000\000\000\000\000\000\000\001\000\000\000\000", "1:1::1:0:0" }, { "\000\000\000\000\000\001\000\000\000\000\000\001\000\000\000\000", "::1:0:0:1:0:0" }, { "\000\001\000\000\000\001\000\000\000\000\000\001\000\000\000\000", "1:0:1::1:0:0" }, { "\000\000\000\001\000\001\000\000\000\000\000\001\000\000\000\000", "0:1:1::1:0:0" }, { "\000\001\000\001\000\001\000\000\000\000\000\001\000\000\000\000", "1:1:1::1:0:0" }, { "\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000", "::1:0:1:0:0" }, { "\000\001\000\000\000\000\000\001\000\000\000\001\000\000\000\000", "1::1:0:1:0:0" }, { "\000\000\000\001\000\000\000\001\000\000\000\001\000\000\000\000", "0:1:0:1:0:1::" }, { "\000\001\000\001\000\000\000\001\000\000\000\001\000\000\000\000", "1:1:0:1:0:1::" }, { "\000\000\000\000\000\001\000\001\000\000\000\001\000\000\000\000", "::1:1:0:1:0:0" }, { "\000\001\000\000\000\001\000\001\000\000\000\001\000\000\000\000", "1:0:1:1:0:1::" }, { "\000\000\000\001\000\001\000\001\000\000\000\001\000\000\000\000", "0:1:1:1:0:1::" }, { "\000\001\000\001\000\001\000\001\000\000\000\001\000\000\000\000", "1:1:1:1:0:1::" }, { "\000\000\000\000\000\000\000\000\000\001\000\001\000\000\000\000", "::1:1:0:0" }, { "\000\001\000\000\000\000\000\000\000\001\000\001\000\000\000\000", "1::1:1:0:0" }, { "\000\000\000\001\000\000\000\000\000\001\000\001\000\000\000\000", "0:1::1:1:0:0" }, { "\000\001\000\001\000\000\000\000\000\001\000\001\000\000\000\000", "1:1::1:1:0:0" }, { "\000\000\000\000\000\001\000\000\000\001\000\001\000\000\000\000", "::1:0:1:1:0:0" }, { "\000\001\000\000\000\001\000\000\000\001\000\001\000\000\000\000", "1:0:1:0:1:1::" }, { "\000\000\000\001\000\001\000\000\000\001\000\001\000\000\000\000", "0:1:1:0:1:1::" }, { "\000\001\000\001\000\001\000\000\000\001\000\001\000\000\000\000", "1:1:1:0:1:1::" }, { "\000\000\000\000\000\000\000\001\000\001\000\001\000\000\000\000", "::1:1:1:0:0" }, { "\000\001\000\000\000\000\000\001\000\001\000\001\000\000\000\000", "1::1:1:1:0:0" }, { "\000\000\000\001\000\000\000\001\000\001\000\001\000\000\000\000", "0:1:0:1:1:1::" }, { "\000\001\000\001\000\000\000\001\000\001\000\001\000\000\000\000", "1:1:0:1:1:1::" }, { "\000\000\000\000\000\001\000\001\000\001\000\001\000\000\000\000", "::1:1:1:1:0:0" }, { "\000\001\000\000\000\001\000\001\000\001\000\001\000\000\000\000", "1:0:1:1:1:1::" }, { "\000\000\000\001\000\001\000\001\000\001\000\001\000\000\000\000", "0:1:1:1:1:1::" }, { "\000\001\000\001\000\001\000\001\000\001\000\001\000\000\000\000", "1:1:1:1:1:1::" }, { "\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000", "::1:0" }, /* inet_ntop incompatible: ::0.1.0.0 */ { "\000\001\000\000\000\000\000\000\000\000\000\000\000\001\000\000", "1::1:0" }, { "\000\000\000\001\000\000\000\000\000\000\000\000\000\001\000\000", "0:1::1:0" }, { "\000\001\000\001\000\000\000\000\000\000\000\000\000\001\000\000", "1:1::1:0" }, { "\000\000\000\000\000\001\000\000\000\000\000\000\000\001\000\000", "0:0:1::1:0" }, { "\000\001\000\000\000\001\000\000\000\000\000\000\000\001\000\000", "1:0:1::1:0" }, { "\000\000\000\001\000\001\000\000\000\000\000\000\000\001\000\000", "0:1:1::1:0" }, { "\000\001\000\001\000\001\000\000\000\000\000\000\000\001\000\000", "1:1:1::1:0" }, { "\000\000\000\000\000\000\000\001\000\000\000\000\000\001\000\000", "::1:0:0:1:0" }, { "\000\001\000\000\000\000\000\001\000\000\000\000\000\001\000\000", "1::1:0:0:1:0" }, { "\000\000\000\001\000\000\000\001\000\000\000\000\000\001\000\000", "0:1:0:1::1:0" }, { "\000\001\000\001\000\000\000\001\000\000\000\000\000\001\000\000", "1:1:0:1::1:0" }, { "\000\000\000\000\000\001\000\001\000\000\000\000\000\001\000\000", "::1:1:0:0:1:0" }, { "\000\001\000\000\000\001\000\001\000\000\000\000\000\001\000\000", "1:0:1:1::1:0" }, { "\000\000\000\001\000\001\000\001\000\000\000\000\000\001\000\000", "0:1:1:1::1:0" }, { "\000\001\000\001\000\001\000\001\000\000\000\000\000\001\000\000", "1:1:1:1::1:0" }, { "\000\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000", "::1:0:1:0" }, { "\000\001\000\000\000\000\000\000\000\001\000\000\000\001\000\000", "1::1:0:1:0" }, { "\000\000\000\001\000\000\000\000\000\001\000\000\000\001\000\000", "0:1::1:0:1:0" }, { "\000\001\000\001\000\000\000\000\000\001\000\000\000\001\000\000", "1:1::1:0:1:0" }, { "\000\000\000\000\000\001\000\000\000\001\000\000\000\001\000\000", "::1:0:1:0:1:0" }, { "\000\001\000\000\000\001\000\000\000\001\000\000\000\001\000\000", "1:0:1:0:1:0:1:0" }, { "\000\000\000\001\000\001\000\000\000\001\000\000\000\001\000\000", "0:1:1:0:1:0:1:0" }, { "\000\001\000\001\000\001\000\000\000\001\000\000\000\001\000\000", "1:1:1:0:1:0:1:0" }, { "\000\000\000\000\000\000\000\001\000\001\000\000\000\001\000\000", "::1:1:0:1:0" }, { "\000\001\000\000\000\000\000\001\000\001\000\000\000\001\000\000", "1::1:1:0:1:0" }, { "\000\000\000\001\000\000\000\001\000\001\000\000\000\001\000\000", "0:1:0:1:1:0:1:0" }, { "\000\001\000\001\000\000\000\001\000\001\000\000\000\001\000\000", "1:1:0:1:1:0:1:0" }, { "\000\000\000\000\000\001\000\001\000\001\000\000\000\001\000\000", "::1:1:1:0:1:0" }, { "\000\001\000\000\000\001\000\001\000\001\000\000\000\001\000\000", "1:0:1:1:1:0:1:0" }, { "\000\000\000\001\000\001\000\001\000\001\000\000\000\001\000\000", "0:1:1:1:1:0:1:0" }, { "\000\001\000\001\000\001\000\001\000\001\000\000\000\001\000\000", "1:1:1:1:1:0:1:0" }, { "\000\000\000\000\000\000\000\000\000\000\000\001\000\001\000\000", "::1:1:0" }, { "\000\001\000\000\000\000\000\000\000\000\000\001\000\001\000\000", "1::1:1:0" }, { "\000\000\000\001\000\000\000\000\000\000\000\001\000\001\000\000", "0:1::1:1:0" }, { "\000\001\000\001\000\000\000\000\000\000\000\001\000\001\000\000", "1:1::1:1:0" }, { "\000\000\000\000\000\001\000\000\000\000\000\001\000\001\000\000", "::1:0:0:1:1:0" }, { "\000\001\000\000\000\001\000\000\000\000\000\001\000\001\000\000", "1:0:1::1:1:0" }, { "\000\000\000\001\000\001\000\000\000\000\000\001\000\001\000\000", "0:1:1::1:1:0" }, { "\000\001\000\001\000\001\000\000\000\000\000\001\000\001\000\000", "1:1:1::1:1:0" }, { "\000\000\000\000\000\000\000\001\000\000\000\001\000\001\000\000", "::1:0:1:1:0" }, { "\000\001\000\000\000\000\000\001\000\000\000\001\000\001\000\000", "1::1:0:1:1:0" }, { "\000\000\000\001\000\000\000\001\000\000\000\001\000\001\000\000", "0:1:0:1:0:1:1:0" }, { "\000\001\000\001\000\000\000\001\000\000\000\001\000\001\000\000", "1:1:0:1:0:1:1:0" }, { "\000\000\000\000\000\001\000\001\000\000\000\001\000\001\000\000", "::1:1:0:1:1:0" }, { "\000\001\000\000\000\001\000\001\000\000\000\001\000\001\000\000", "1:0:1:1:0:1:1:0" }, { "\000\000\000\001\000\001\000\001\000\000\000\001\000\001\000\000", "0:1:1:1:0:1:1:0" }, { "\000\001\000\001\000\001\000\001\000\000\000\001\000\001\000\000", "1:1:1:1:0:1:1:0" }, { "\000\000\000\000\000\000\000\000\000\001\000\001\000\001\000\000", "::1:1:1:0" }, { "\000\001\000\000\000\000\000\000\000\001\000\001\000\001\000\000", "1::1:1:1:0" }, { "\000\000\000\001\000\000\000\000\000\001\000\001\000\001\000\000", "0:1::1:1:1:0" }, { "\000\001\000\001\000\000\000\000\000\001\000\001\000\001\000\000", "1:1::1:1:1:0" }, { "\000\000\000\000\000\001\000\000\000\001\000\001\000\001\000\000", "::1:0:1:1:1:0" }, { "\000\001\000\000\000\001\000\000\000\001\000\001\000\001\000\000", "1:0:1:0:1:1:1:0" }, { "\000\000\000\001\000\001\000\000\000\001\000\001\000\001\000\000", "0:1:1:0:1:1:1:0" }, { "\000\001\000\001\000\001\000\000\000\001\000\001\000\001\000\000", "1:1:1:0:1:1:1:0" }, { "\000\000\000\000\000\000\000\001\000\001\000\001\000\001\000\000", "::1:1:1:1:0" }, { "\000\001\000\000\000\000\000\001\000\001\000\001\000\001\000\000", "1::1:1:1:1:0" }, { "\000\000\000\001\000\000\000\001\000\001\000\001\000\001\000\000", "0:1:0:1:1:1:1:0" }, { "\000\001\000\001\000\000\000\001\000\001\000\001\000\001\000\000", "1:1:0:1:1:1:1:0" }, { "\000\000\000\000\000\001\000\001\000\001\000\001\000\001\000\000", "::1:1:1:1:1:0" }, { "\000\001\000\000\000\001\000\001\000\001\000\001\000\001\000\000", "1:0:1:1:1:1:1:0" }, { "\000\000\000\001\000\001\000\001\000\001\000\001\000\001\000\000", "0:1:1:1:1:1:1:0" }, { "\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\000", "1:1:1:1:1:1:1:0" }, { "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001", "::1" }, { "\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\001", "1::1" }, { "\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\001", "0:1::1" }, { "\000\001\000\001\000\000\000\000\000\000\000\000\000\000\000\001", "1:1::1" }, { "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\001", "0:0:1::1" }, { "\000\001\000\000\000\001\000\000\000\000\000\000\000\000\000\001", "1:0:1::1" }, { "\000\000\000\001\000\001\000\000\000\000\000\000\000\000\000\001", "0:1:1::1" }, { "\000\001\000\001\000\001\000\000\000\000\000\000\000\000\000\001", "1:1:1::1" }, { "\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\001", "::1:0:0:0:1" }, { "\000\001\000\000\000\000\000\001\000\000\000\000\000\000\000\001", "1:0:0:1::1" }, { "\000\000\000\001\000\000\000\001\000\000\000\000\000\000\000\001", "0:1:0:1::1" }, { "\000\001\000\001\000\000\000\001\000\000\000\000\000\000\000\001", "1:1:0:1::1" }, { "\000\000\000\000\000\001\000\001\000\000\000\000\000\000\000\001", "0:0:1:1::1" }, { "\000\001\000\000\000\001\000\001\000\000\000\000\000\000\000\001", "1:0:1:1::1" }, { "\000\000\000\001\000\001\000\001\000\000\000\000\000\000\000\001", "0:1:1:1::1" }, { "\000\001\000\001\000\001\000\001\000\000\000\000\000\000\000\001", "1:1:1:1::1" }, { "\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\001", "::1:0:0:1" }, { "\000\001\000\000\000\000\000\000\000\001\000\000\000\000\000\001", "1::1:0:0:1" }, { "\000\000\000\001\000\000\000\000\000\001\000\000\000\000\000\001", "0:1::1:0:0:1" }, { "\000\001\000\001\000\000\000\000\000\001\000\000\000\000\000\001", "1:1::1:0:0:1" }, { "\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\001", "::1:0:1:0:0:1" }, { "\000\001\000\000\000\001\000\000\000\001\000\000\000\000\000\001", "1:0:1:0:1::1" }, { "\000\000\000\001\000\001\000\000\000\001\000\000\000\000\000\001", "0:1:1:0:1::1" }, { "\000\001\000\001\000\001\000\000\000\001\000\000\000\000\000\001", "1:1:1:0:1::1" }, { "\000\000\000\000\000\000\000\001\000\001\000\000\000\000\000\001", "::1:1:0:0:1" }, { "\000\001\000\000\000\000\000\001\000\001\000\000\000\000\000\001", "1::1:1:0:0:1" }, { "\000\000\000\001\000\000\000\001\000\001\000\000\000\000\000\001", "0:1:0:1:1::1" }, { "\000\001\000\001\000\000\000\001\000\001\000\000\000\000\000\001", "1:1:0:1:1::1" }, { "\000\000\000\000\000\001\000\001\000\001\000\000\000\000\000\001", "::1:1:1:0:0:1" }, { "\000\001\000\000\000\001\000\001\000\001\000\000\000\000\000\001", "1:0:1:1:1::1" }, { "\000\000\000\001\000\001\000\001\000\001\000\000\000\000\000\001", "0:1:1:1:1::1" }, { "\000\001\000\001\000\001\000\001\000\001\000\000\000\000\000\001", "1:1:1:1:1::1" }, { "\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\001", "::1:0:1" }, { "\000\001\000\000\000\000\000\000\000\000\000\001\000\000\000\001", "1::1:0:1" }, { "\000\000\000\001\000\000\000\000\000\000\000\001\000\000\000\001", "0:1::1:0:1" }, { "\000\001\000\001\000\000\000\000\000\000\000\001\000\000\000\001", "1:1::1:0:1" }, { "\000\000\000\000\000\001\000\000\000\000\000\001\000\000\000\001", "::1:0:0:1:0:1" }, { "\000\001\000\000\000\001\000\000\000\000\000\001\000\000\000\001", "1:0:1::1:0:1" }, { "\000\000\000\001\000\001\000\000\000\000\000\001\000\000\000\001", "0:1:1::1:0:1" }, { "\000\001\000\001\000\001\000\000\000\000\000\001\000\000\000\001", "1:1:1::1:0:1" }, { "\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\001", "::1:0:1:0:1" }, { "\000\001\000\000\000\000\000\001\000\000\000\001\000\000\000\001", "1::1:0:1:0:1" }, { "\000\000\000\001\000\000\000\001\000\000\000\001\000\000\000\001", "0:1:0:1:0:1:0:1" }, { "\000\001\000\001\000\000\000\001\000\000\000\001\000\000\000\001", "1:1:0:1:0:1:0:1" }, { "\000\000\000\000\000\001\000\001\000\000\000\001\000\000\000\001", "::1:1:0:1:0:1" }, { "\000\001\000\000\000\001\000\001\000\000\000\001\000\000\000\001", "1:0:1:1:0:1:0:1" }, { "\000\000\000\001\000\001\000\001\000\000\000\001\000\000\000\001", "0:1:1:1:0:1:0:1" }, { "\000\001\000\001\000\001\000\001\000\000\000\001\000\000\000\001", "1:1:1:1:0:1:0:1" }, { "\000\000\000\000\000\000\000\000\000\001\000\001\000\000\000\001", "::1:1:0:1" }, { "\000\001\000\000\000\000\000\000\000\001\000\001\000\000\000\001", "1::1:1:0:1" }, { "\000\000\000\001\000\000\000\000\000\001\000\001\000\000\000\001", "0:1::1:1:0:1" }, { "\000\001\000\001\000\000\000\000\000\001\000\001\000\000\000\001", "1:1::1:1:0:1" }, { "\000\000\000\000\000\001\000\000\000\001\000\001\000\000\000\001", "::1:0:1:1:0:1" }, { "\000\001\000\000\000\001\000\000\000\001\000\001\000\000\000\001", "1:0:1:0:1:1:0:1" }, { "\000\000\000\001\000\001\000\000\000\001\000\001\000\000\000\001", "0:1:1:0:1:1:0:1" }, { "\000\001\000\001\000\001\000\000\000\001\000\001\000\000\000\001", "1:1:1:0:1:1:0:1" }, { "\000\000\000\000\000\000\000\001\000\001\000\001\000\000\000\001", "::1:1:1:0:1" }, { "\000\001\000\000\000\000\000\001\000\001\000\001\000\000\000\001", "1::1:1:1:0:1" }, { "\000\000\000\001\000\000\000\001\000\001\000\001\000\000\000\001", "0:1:0:1:1:1:0:1" }, { "\000\001\000\001\000\000\000\001\000\001\000\001\000\000\000\001", "1:1:0:1:1:1:0:1" }, { "\000\000\000\000\000\001\000\001\000\001\000\001\000\000\000\001", "::1:1:1:1:0:1" }, { "\000\001\000\000\000\001\000\001\000\001\000\001\000\000\000\001", "1:0:1:1:1:1:0:1" }, { "\000\000\000\001\000\001\000\001\000\001\000\001\000\000\000\001", "0:1:1:1:1:1:0:1" }, { "\000\001\000\001\000\001\000\001\000\001\000\001\000\000\000\001", "1:1:1:1:1:1:0:1" }, { "\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\001", "::1:1" }, /* inet_ntop incompatible: ::0.1.0.1 */ { "\000\001\000\000\000\000\000\000\000\000\000\000\000\001\000\001", "1::1:1" }, { "\000\000\000\001\000\000\000\000\000\000\000\000\000\001\000\001", "0:1::1:1" }, { "\000\001\000\001\000\000\000\000\000\000\000\000\000\001\000\001", "1:1::1:1" }, { "\000\000\000\000\000\001\000\000\000\000\000\000\000\001\000\001", "0:0:1::1:1" }, { "\000\001\000\000\000\001\000\000\000\000\000\000\000\001\000\001", "1:0:1::1:1" }, { "\000\000\000\001\000\001\000\000\000\000\000\000\000\001\000\001", "0:1:1::1:1" }, { "\000\001\000\001\000\001\000\000\000\000\000\000\000\001\000\001", "1:1:1::1:1" }, { "\000\000\000\000\000\000\000\001\000\000\000\000\000\001\000\001", "::1:0:0:1:1" }, { "\000\001\000\000\000\000\000\001\000\000\000\000\000\001\000\001", "1::1:0:0:1:1" }, { "\000\000\000\001\000\000\000\001\000\000\000\000\000\001\000\001", "0:1:0:1::1:1" }, { "\000\001\000\001\000\000\000\001\000\000\000\000\000\001\000\001", "1:1:0:1::1:1" }, { "\000\000\000\000\000\001\000\001\000\000\000\000\000\001\000\001", "::1:1:0:0:1:1" }, { "\000\001\000\000\000\001\000\001\000\000\000\000\000\001\000\001", "1:0:1:1::1:1" }, { "\000\000\000\001\000\001\000\001\000\000\000\000\000\001\000\001", "0:1:1:1::1:1" }, { "\000\001\000\001\000\001\000\001\000\000\000\000\000\001\000\001", "1:1:1:1::1:1" }, { "\000\000\000\000\000\000\000\000\000\001\000\000\000\001\000\001", "::1:0:1:1" }, { "\000\001\000\000\000\000\000\000\000\001\000\000\000\001\000\001", "1::1:0:1:1" }, { "\000\000\000\001\000\000\000\000\000\001\000\000\000\001\000\001", "0:1::1:0:1:1" }, { "\000\001\000\001\000\000\000\000\000\001\000\000\000\001\000\001", "1:1::1:0:1:1" }, { "\000\000\000\000\000\001\000\000\000\001\000\000\000\001\000\001", "::1:0:1:0:1:1" }, { "\000\001\000\000\000\001\000\000\000\001\000\000\000\001\000\001", "1:0:1:0:1:0:1:1" }, { "\000\000\000\001\000\001\000\000\000\001\000\000\000\001\000\001", "0:1:1:0:1:0:1:1" }, { "\000\001\000\001\000\001\000\000\000\001\000\000\000\001\000\001", "1:1:1:0:1:0:1:1" }, { "\000\000\000\000\000\000\000\001\000\001\000\000\000\001\000\001", "::1:1:0:1:1" }, { "\000\001\000\000\000\000\000\001\000\001\000\000\000\001\000\001", "1::1:1:0:1:1" }, { "\000\000\000\001\000\000\000\001\000\001\000\000\000\001\000\001", "0:1:0:1:1:0:1:1" }, { "\000\001\000\001\000\000\000\001\000\001\000\000\000\001\000\001", "1:1:0:1:1:0:1:1" }, { "\000\000\000\000\000\001\000\001\000\001\000\000\000\001\000\001", "::1:1:1:0:1:1" }, { "\000\001\000\000\000\001\000\001\000\001\000\000\000\001\000\001", "1:0:1:1:1:0:1:1" }, { "\000\000\000\001\000\001\000\001\000\001\000\000\000\001\000\001", "0:1:1:1:1:0:1:1" }, { "\000\001\000\001\000\001\000\001\000\001\000\000\000\001\000\001", "1:1:1:1:1:0:1:1" }, { "\000\000\000\000\000\000\000\000\000\000\000\001\000\001\000\001", "::1:1:1" }, { "\000\001\000\000\000\000\000\000\000\000\000\001\000\001\000\001", "1::1:1:1" }, { "\000\000\000\001\000\000\000\000\000\000\000\001\000\001\000\001", "0:1::1:1:1" }, { "\000\001\000\001\000\000\000\000\000\000\000\001\000\001\000\001", "1:1::1:1:1" }, { "\000\000\000\000\000\001\000\000\000\000\000\001\000\001\000\001", "::1:0:0:1:1:1" }, { "\000\001\000\000\000\001\000\000\000\000\000\001\000\001\000\001", "1:0:1::1:1:1" }, { "\000\000\000\001\000\001\000\000\000\000\000\001\000\001\000\001", "0:1:1::1:1:1" }, { "\000\001\000\001\000\001\000\000\000\000\000\001\000\001\000\001", "1:1:1::1:1:1" }, { "\000\000\000\000\000\000\000\001\000\000\000\001\000\001\000\001", "::1:0:1:1:1" }, { "\000\001\000\000\000\000\000\001\000\000\000\001\000\001\000\001", "1::1:0:1:1:1" }, { "\000\000\000\001\000\000\000\001\000\000\000\001\000\001\000\001", "0:1:0:1:0:1:1:1" }, { "\000\001\000\001\000\000\000\001\000\000\000\001\000\001\000\001", "1:1:0:1:0:1:1:1" }, { "\000\000\000\000\000\001\000\001\000\000\000\001\000\001\000\001", "::1:1:0:1:1:1" }, { "\000\001\000\000\000\001\000\001\000\000\000\001\000\001\000\001", "1:0:1:1:0:1:1:1" }, { "\000\000\000\001\000\001\000\001\000\000\000\001\000\001\000\001", "0:1:1:1:0:1:1:1" }, { "\000\001\000\001\000\001\000\001\000\000\000\001\000\001\000\001", "1:1:1:1:0:1:1:1" }, { "\000\000\000\000\000\000\000\000\000\001\000\001\000\001\000\001", "::1:1:1:1" }, { "\000\001\000\000\000\000\000\000\000\001\000\001\000\001\000\001", "1::1:1:1:1" }, { "\000\000\000\001\000\000\000\000\000\001\000\001\000\001\000\001", "0:1::1:1:1:1" }, { "\000\001\000\001\000\000\000\000\000\001\000\001\000\001\000\001", "1:1::1:1:1:1" }, { "\000\000\000\000\000\001\000\000\000\001\000\001\000\001\000\001", "::1:0:1:1:1:1" }, { "\000\001\000\000\000\001\000\000\000\001\000\001\000\001\000\001", "1:0:1:0:1:1:1:1" }, { "\000\000\000\001\000\001\000\000\000\001\000\001\000\001\000\001", "0:1:1:0:1:1:1:1" }, { "\000\001\000\001\000\001\000\000\000\001\000\001\000\001\000\001", "1:1:1:0:1:1:1:1" }, { "\000\000\000\000\000\000\000\001\000\001\000\001\000\001\000\001", "::1:1:1:1:1" }, { "\000\001\000\000\000\000\000\001\000\001\000\001\000\001\000\001", "1::1:1:1:1:1" }, { "\000\000\000\001\000\000\000\001\000\001\000\001\000\001\000\001", "0:1:0:1:1:1:1:1" }, { "\000\001\000\001\000\000\000\001\000\001\000\001\000\001\000\001", "1:1:0:1:1:1:1:1" }, { "\000\000\000\000\000\001\000\001\000\001\000\001\000\001\000\001", "::1:1:1:1:1:1" }, { "\000\001\000\000\000\001\000\001\000\001\000\001\000\001\000\001", "1:0:1:1:1:1:1:1" }, { "\000\000\000\001\000\001\000\001\000\001\000\001\000\001\000\001", "0:1:1:1:1:1:1:1" }, { "\000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\001", "1:1:1:1:1:1:1:1" }, { "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000", "::" }, { "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000", "ffff::" }, { "\000\000\377\377\000\000\000\000\000\000\000\000\000\000\000\000", "0:ffff::" }, { "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000", "ffff:ffff::" }, { "\000\000\000\000\377\377\000\000\000\000\000\000\000\000\000\000", "0:0:ffff::" }, { "\377\377\000\000\377\377\000\000\000\000\000\000\000\000\000\000", "ffff:0:ffff::" }, { "\000\000\377\377\377\377\000\000\000\000\000\000\000\000\000\000", "0:ffff:ffff::" }, { "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000", "ffff:ffff:ffff::" }, { "\000\000\000\000\000\000\377\377\000\000\000\000\000\000\000\000", "0:0:0:ffff::" }, { "\377\377\000\000\000\000\377\377\000\000\000\000\000\000\000\000", "ffff:0:0:ffff::" }, { "\000\000\377\377\000\000\377\377\000\000\000\000\000\000\000\000", "0:ffff:0:ffff::" }, { "\377\377\377\377\000\000\377\377\000\000\000\000\000\000\000\000", "ffff:ffff:0:ffff::" }, { "\000\000\000\000\377\377\377\377\000\000\000\000\000\000\000\000", "0:0:ffff:ffff::" }, { "\377\377\000\000\377\377\377\377\000\000\000\000\000\000\000\000", "ffff:0:ffff:ffff::" }, { "\000\000\377\377\377\377\377\377\000\000\000\000\000\000\000\000", "0:ffff:ffff:ffff::" }, { "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000", "ffff:ffff:ffff:ffff::" }, { "\000\000\000\000\000\000\000\000\377\377\000\000\000\000\000\000", "::ffff:0:0:0" }, { "\377\377\000\000\000\000\000\000\377\377\000\000\000\000\000\000", "ffff::ffff:0:0:0" }, { "\000\000\377\377\000\000\000\000\377\377\000\000\000\000\000\000", "0:ffff:0:0:ffff::" }, { "\377\377\377\377\000\000\000\000\377\377\000\000\000\000\000\000", "ffff:ffff:0:0:ffff::" }, { "\000\000\000\000\377\377\000\000\377\377\000\000\000\000\000\000", "0:0:ffff:0:ffff::" }, { "\377\377\000\000\377\377\000\000\377\377\000\000\000\000\000\000", "ffff:0:ffff:0:ffff::" }, { "\000\000\377\377\377\377\000\000\377\377\000\000\000\000\000\000", "0:ffff:ffff:0:ffff::" }, { "\377\377\377\377\377\377\000\000\377\377\000\000\000\000\000\000", "ffff:ffff:ffff:0:ffff::" }, { "\000\000\000\000\000\000\377\377\377\377\000\000\000\000\000\000", "::ffff:ffff:0:0:0" }, { "\377\377\000\000\000\000\377\377\377\377\000\000\000\000\000\000", "ffff:0:0:ffff:ffff::" }, { "\000\000\377\377\000\000\377\377\377\377\000\000\000\000\000\000", "0:ffff:0:ffff:ffff::" }, { "\377\377\377\377\000\000\377\377\377\377\000\000\000\000\000\000", "ffff:ffff:0:ffff:ffff::" }, { "\000\000\000\000\377\377\377\377\377\377\000\000\000\000\000\000", "0:0:ffff:ffff:ffff::" }, { "\377\377\000\000\377\377\377\377\377\377\000\000\000\000\000\000", "ffff:0:ffff:ffff:ffff::" }, { "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\000\000", "0:ffff:ffff:ffff:ffff::" }, { "\377\377\377\377\377\377\377\377\377\377\000\000\000\000\000\000", "ffff:ffff:ffff:ffff:ffff::" }, { "\000\000\000\000\000\000\000\000\000\000\377\377\000\000\000\000", "0.0.0.0" }, /* inet_ntop incompatible: ::ffff:0.0.0.0 */ { "\377\377\000\000\000\000\000\000\000\000\377\377\000\000\000\000", "ffff::ffff:0:0" }, { "\000\000\377\377\000\000\000\000\000\000\377\377\000\000\000\000", "0:ffff::ffff:0:0" }, { "\377\377\377\377\000\000\000\000\000\000\377\377\000\000\000\000", "ffff:ffff::ffff:0:0" }, { "\000\000\000\000\377\377\000\000\000\000\377\377\000\000\000\000", "::ffff:0:0:ffff:0:0" }, { "\377\377\000\000\377\377\000\000\000\000\377\377\000\000\000\000", "ffff:0:ffff::ffff:0:0" }, { "\000\000\377\377\377\377\000\000\000\000\377\377\000\000\000\000", "0:ffff:ffff::ffff:0:0" }, { "\377\377\377\377\377\377\000\000\000\000\377\377\000\000\000\000", "ffff:ffff:ffff::ffff:0:0" }, { "\000\000\000\000\000\000\377\377\000\000\377\377\000\000\000\000", "::ffff:0:ffff:0:0" }, { "\377\377\000\000\000\000\377\377\000\000\377\377\000\000\000\000", "ffff::ffff:0:ffff:0:0" }, { "\000\000\377\377\000\000\377\377\000\000\377\377\000\000\000\000", "0:ffff:0:ffff:0:ffff::" }, { "\377\377\377\377\000\000\377\377\000\000\377\377\000\000\000\000", "ffff:ffff:0:ffff:0:ffff::" }, { "\000\000\000\000\377\377\377\377\000\000\377\377\000\000\000\000", "::ffff:ffff:0:ffff:0:0" }, { "\377\377\000\000\377\377\377\377\000\000\377\377\000\000\000\000", "ffff:0:ffff:ffff:0:ffff::" }, { "\000\000\377\377\377\377\377\377\000\000\377\377\000\000\000\000", "0:ffff:ffff:ffff:0:ffff::" }, { "\377\377\377\377\377\377\377\377\000\000\377\377\000\000\000\000", "ffff:ffff:ffff:ffff:0:ffff::" }, { "\000\000\000\000\000\000\000\000\377\377\377\377\000\000\000\000", "::ffff:ffff:0:0" }, { "\377\377\000\000\000\000\000\000\377\377\377\377\000\000\000\000", "ffff::ffff:ffff:0:0" }, { "\000\000\377\377\000\000\000\000\377\377\377\377\000\000\000\000", "0:ffff::ffff:ffff:0:0" }, { "\377\377\377\377\000\000\000\000\377\377\377\377\000\000\000\000", "ffff:ffff::ffff:ffff:0:0" }, { "\000\000\000\000\377\377\000\000\377\377\377\377\000\000\000\000", "::ffff:0:ffff:ffff:0:0" }, { "\377\377\000\000\377\377\000\000\377\377\377\377\000\000\000\000", "ffff:0:ffff:0:ffff:ffff::" }, { "\000\000\377\377\377\377\000\000\377\377\377\377\000\000\000\000", "0:ffff:ffff:0:ffff:ffff::" }, { "\377\377\377\377\377\377\000\000\377\377\377\377\000\000\000\000", "ffff:ffff:ffff:0:ffff:ffff::" }, { "\000\000\000\000\000\000\377\377\377\377\377\377\000\000\000\000", "::ffff:ffff:ffff:0:0" }, { "\377\377\000\000\000\000\377\377\377\377\377\377\000\000\000\000", "ffff::ffff:ffff:ffff:0:0" }, { "\000\000\377\377\000\000\377\377\377\377\377\377\000\000\000\000", "0:ffff:0:ffff:ffff:ffff::" }, { "\377\377\377\377\000\000\377\377\377\377\377\377\000\000\000\000", "ffff:ffff:0:ffff:ffff:ffff::" }, { "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\000\000", "::ffff:ffff:ffff:ffff:0:0" }, { "\377\377\000\000\377\377\377\377\377\377\377\377\000\000\000\000", "ffff:0:ffff:ffff:ffff:ffff::" }, { "\000\000\377\377\377\377\377\377\377\377\377\377\000\000\000\000", "0:ffff:ffff:ffff:ffff:ffff::" }, { "\377\377\377\377\377\377\377\377\377\377\377\377\000\000\000\000", "ffff:ffff:ffff:ffff:ffff:ffff::" }, { "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\000\000", "::ffff:0" }, /* inet_ntop incompatible: ::255.255.0.0 */ { "\377\377\000\000\000\000\000\000\000\000\000\000\377\377\000\000", "ffff::ffff:0" }, { "\000\000\377\377\000\000\000\000\000\000\000\000\377\377\000\000", "0:ffff::ffff:0" }, { "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\000\000", "ffff:ffff::ffff:0" }, { "\000\000\000\000\377\377\000\000\000\000\000\000\377\377\000\000", "0:0:ffff::ffff:0" }, { "\377\377\000\000\377\377\000\000\000\000\000\000\377\377\000\000", "ffff:0:ffff::ffff:0" }, { "\000\000\377\377\377\377\000\000\000\000\000\000\377\377\000\000", "0:ffff:ffff::ffff:0" }, { "\377\377\377\377\377\377\000\000\000\000\000\000\377\377\000\000", "ffff:ffff:ffff::ffff:0" }, { "\000\000\000\000\000\000\377\377\000\000\000\000\377\377\000\000", "::ffff:0:0:ffff:0" }, { "\377\377\000\000\000\000\377\377\000\000\000\000\377\377\000\000", "ffff::ffff:0:0:ffff:0" }, { "\000\000\377\377\000\000\377\377\000\000\000\000\377\377\000\000", "0:ffff:0:ffff::ffff:0" }, { "\377\377\377\377\000\000\377\377\000\000\000\000\377\377\000\000", "ffff:ffff:0:ffff::ffff:0" }, { "\000\000\000\000\377\377\377\377\000\000\000\000\377\377\000\000", "::ffff:ffff:0:0:ffff:0" }, { "\377\377\000\000\377\377\377\377\000\000\000\000\377\377\000\000", "ffff:0:ffff:ffff::ffff:0" }, { "\000\000\377\377\377\377\377\377\000\000\000\000\377\377\000\000", "0:ffff:ffff:ffff::ffff:0" }, { "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\000\000", "ffff:ffff:ffff:ffff::ffff:0" }, { "\000\000\000\000\000\000\000\000\377\377\000\000\377\377\000\000", "::ffff:0:ffff:0" }, { "\377\377\000\000\000\000\000\000\377\377\000\000\377\377\000\000", "ffff::ffff:0:ffff:0" }, { "\000\000\377\377\000\000\000\000\377\377\000\000\377\377\000\000", "0:ffff::ffff:0:ffff:0" }, { "\377\377\377\377\000\000\000\000\377\377\000\000\377\377\000\000", "ffff:ffff::ffff:0:ffff:0" }, { "\000\000\000\000\377\377\000\000\377\377\000\000\377\377\000\000", "::ffff:0:ffff:0:ffff:0" }, { "\377\377\000\000\377\377\000\000\377\377\000\000\377\377\000\000", "ffff:0:ffff:0:ffff:0:ffff:0" }, { "\000\000\377\377\377\377\000\000\377\377\000\000\377\377\000\000", "0:ffff:ffff:0:ffff:0:ffff:0" }, { "\377\377\377\377\377\377\000\000\377\377\000\000\377\377\000\000", "ffff:ffff:ffff:0:ffff:0:ffff:0" }, { "\000\000\000\000\000\000\377\377\377\377\000\000\377\377\000\000", "::ffff:ffff:0:ffff:0" }, { "\377\377\000\000\000\000\377\377\377\377\000\000\377\377\000\000", "ffff::ffff:ffff:0:ffff:0" }, { "\000\000\377\377\000\000\377\377\377\377\000\000\377\377\000\000", "0:ffff:0:ffff:ffff:0:ffff:0" }, { "\377\377\377\377\000\000\377\377\377\377\000\000\377\377\000\000", "ffff:ffff:0:ffff:ffff:0:ffff:0" }, { "\000\000\000\000\377\377\377\377\377\377\000\000\377\377\000\000", "::ffff:ffff:ffff:0:ffff:0" }, { "\377\377\000\000\377\377\377\377\377\377\000\000\377\377\000\000", "ffff:0:ffff:ffff:ffff:0:ffff:0" }, { "\000\000\377\377\377\377\377\377\377\377\000\000\377\377\000\000", "0:ffff:ffff:ffff:ffff:0:ffff:0" }, { "\377\377\377\377\377\377\377\377\377\377\000\000\377\377\000\000", "ffff:ffff:ffff:ffff:ffff:0:ffff:0" }, { "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\000\000", "255.255.0.0" }, /* inet_ntop incompatible: ::ffff:255.255.0.0 */ { "\377\377\000\000\000\000\000\000\000\000\377\377\377\377\000\000", "ffff::ffff:ffff:0" }, { "\000\000\377\377\000\000\000\000\000\000\377\377\377\377\000\000", "0:ffff::ffff:ffff:0" }, { "\377\377\377\377\000\000\000\000\000\000\377\377\377\377\000\000", "ffff:ffff::ffff:ffff:0" }, { "\000\000\000\000\377\377\000\000\000\000\377\377\377\377\000\000", "::ffff:0:0:ffff:ffff:0" }, { "\377\377\000\000\377\377\000\000\000\000\377\377\377\377\000\000", "ffff:0:ffff::ffff:ffff:0" }, { "\000\000\377\377\377\377\000\000\000\000\377\377\377\377\000\000", "0:ffff:ffff::ffff:ffff:0" }, { "\377\377\377\377\377\377\000\000\000\000\377\377\377\377\000\000", "ffff:ffff:ffff::ffff:ffff:0" }, { "\000\000\000\000\000\000\377\377\000\000\377\377\377\377\000\000", "::ffff:0:ffff:ffff:0" }, { "\377\377\000\000\000\000\377\377\000\000\377\377\377\377\000\000", "ffff::ffff:0:ffff:ffff:0" }, { "\000\000\377\377\000\000\377\377\000\000\377\377\377\377\000\000", "0:ffff:0:ffff:0:ffff:ffff:0" }, { "\377\377\377\377\000\000\377\377\000\000\377\377\377\377\000\000", "ffff:ffff:0:ffff:0:ffff:ffff:0" }, { "\000\000\000\000\377\377\377\377\000\000\377\377\377\377\000\000", "::ffff:ffff:0:ffff:ffff:0" }, { "\377\377\000\000\377\377\377\377\000\000\377\377\377\377\000\000", "ffff:0:ffff:ffff:0:ffff:ffff:0" }, { "\000\000\377\377\377\377\377\377\000\000\377\377\377\377\000\000", "0:ffff:ffff:ffff:0:ffff:ffff:0" }, { "\377\377\377\377\377\377\377\377\000\000\377\377\377\377\000\000", "ffff:ffff:ffff:ffff:0:ffff:ffff:0" }, { "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\000\000", "::ffff:ffff:ffff:0" }, { "\377\377\000\000\000\000\000\000\377\377\377\377\377\377\000\000", "ffff::ffff:ffff:ffff:0" }, { "\000\000\377\377\000\000\000\000\377\377\377\377\377\377\000\000", "0:ffff::ffff:ffff:ffff:0" }, { "\377\377\377\377\000\000\000\000\377\377\377\377\377\377\000\000", "ffff:ffff::ffff:ffff:ffff:0" }, { "\000\000\000\000\377\377\000\000\377\377\377\377\377\377\000\000", "::ffff:0:ffff:ffff:ffff:0" }, { "\377\377\000\000\377\377\000\000\377\377\377\377\377\377\000\000", "ffff:0:ffff:0:ffff:ffff:ffff:0" }, { "\000\000\377\377\377\377\000\000\377\377\377\377\377\377\000\000", "0:ffff:ffff:0:ffff:ffff:ffff:0" }, { "\377\377\377\377\377\377\000\000\377\377\377\377\377\377\000\000", "ffff:ffff:ffff:0:ffff:ffff:ffff:0" }, { "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\000\000", "::ffff:ffff:ffff:ffff:0" }, { "\377\377\000\000\000\000\377\377\377\377\377\377\377\377\000\000", "ffff::ffff:ffff:ffff:ffff:0" }, { "\000\000\377\377\000\000\377\377\377\377\377\377\377\377\000\000", "0:ffff:0:ffff:ffff:ffff:ffff:0" }, { "\377\377\377\377\000\000\377\377\377\377\377\377\377\377\000\000", "ffff:ffff:0:ffff:ffff:ffff:ffff:0" }, { "\000\000\000\000\377\377\377\377\377\377\377\377\377\377\000\000", "::ffff:ffff:ffff:ffff:ffff:0" }, { "\377\377\000\000\377\377\377\377\377\377\377\377\377\377\000\000", "ffff:0:ffff:ffff:ffff:ffff:ffff:0" }, { "\000\000\377\377\377\377\377\377\377\377\377\377\377\377\000\000", "0:ffff:ffff:ffff:ffff:ffff:ffff:0" }, { "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\000\000", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:0" }, { "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377", "::ffff" }, { "\377\377\000\000\000\000\000\000\000\000\000\000\000\000\377\377", "ffff::ffff" }, { "\000\000\377\377\000\000\000\000\000\000\000\000\000\000\377\377", "0:ffff::ffff" }, { "\377\377\377\377\000\000\000\000\000\000\000\000\000\000\377\377", "ffff:ffff::ffff" }, { "\000\000\000\000\377\377\000\000\000\000\000\000\000\000\377\377", "0:0:ffff::ffff" }, { "\377\377\000\000\377\377\000\000\000\000\000\000\000\000\377\377", "ffff:0:ffff::ffff" }, { "\000\000\377\377\377\377\000\000\000\000\000\000\000\000\377\377", "0:ffff:ffff::ffff" }, { "\377\377\377\377\377\377\000\000\000\000\000\000\000\000\377\377", "ffff:ffff:ffff::ffff" }, { "\000\000\000\000\000\000\377\377\000\000\000\000\000\000\377\377", "::ffff:0:0:0:ffff" }, { "\377\377\000\000\000\000\377\377\000\000\000\000\000\000\377\377", "ffff:0:0:ffff::ffff" }, { "\000\000\377\377\000\000\377\377\000\000\000\000\000\000\377\377", "0:ffff:0:ffff::ffff" }, { "\377\377\377\377\000\000\377\377\000\000\000\000\000\000\377\377", "ffff:ffff:0:ffff::ffff" }, { "\000\000\000\000\377\377\377\377\000\000\000\000\000\000\377\377", "0:0:ffff:ffff::ffff" }, { "\377\377\000\000\377\377\377\377\000\000\000\000\000\000\377\377", "ffff:0:ffff:ffff::ffff" }, { "\000\000\377\377\377\377\377\377\000\000\000\000\000\000\377\377", "0:ffff:ffff:ffff::ffff" }, { "\377\377\377\377\377\377\377\377\000\000\000\000\000\000\377\377", "ffff:ffff:ffff:ffff::ffff" }, { "\000\000\000\000\000\000\000\000\377\377\000\000\000\000\377\377", "::ffff:0:0:ffff" }, { "\377\377\000\000\000\000\000\000\377\377\000\000\000\000\377\377", "ffff::ffff:0:0:ffff" }, { "\000\000\377\377\000\000\000\000\377\377\000\000\000\000\377\377", "0:ffff::ffff:0:0:ffff" }, { "\377\377\377\377\000\000\000\000\377\377\000\000\000\000\377\377", "ffff:ffff::ffff:0:0:ffff" }, { "\000\000\000\000\377\377\000\000\377\377\000\000\000\000\377\377", "::ffff:0:ffff:0:0:ffff" }, { "\377\377\000\000\377\377\000\000\377\377\000\000\000\000\377\377", "ffff:0:ffff:0:ffff::ffff" }, { "\000\000\377\377\377\377\000\000\377\377\000\000\000\000\377\377", "0:ffff:ffff:0:ffff::ffff" }, { "\377\377\377\377\377\377\000\000\377\377\000\000\000\000\377\377", "ffff:ffff:ffff:0:ffff::ffff" }, { "\000\000\000\000\000\000\377\377\377\377\000\000\000\000\377\377", "::ffff:ffff:0:0:ffff" }, { "\377\377\000\000\000\000\377\377\377\377\000\000\000\000\377\377", "ffff::ffff:ffff:0:0:ffff" }, { "\000\000\377\377\000\000\377\377\377\377\000\000\000\000\377\377", "0:ffff:0:ffff:ffff::ffff" }, { "\377\377\377\377\000\000\377\377\377\377\000\000\000\000\377\377", "ffff:ffff:0:ffff:ffff::ffff" }, { "\000\000\000\000\377\377\377\377\377\377\000\000\000\000\377\377", "::ffff:ffff:ffff:0:0:ffff" }, { "\377\377\000\000\377\377\377\377\377\377\000\000\000\000\377\377", "ffff:0:ffff:ffff:ffff::ffff" }, { "\000\000\377\377\377\377\377\377\377\377\000\000\000\000\377\377", "0:ffff:ffff:ffff:ffff::ffff" }, { "\377\377\377\377\377\377\377\377\377\377\000\000\000\000\377\377", "ffff:ffff:ffff:ffff:ffff::ffff" }, { "\000\000\000\000\000\000\000\000\000\000\377\377\000\000\377\377", "0.0.255.255" }, /* inet_ntop incompatible: ::ffff:0.0.255.255 */ { "\377\377\000\000\000\000\000\000\000\000\377\377\000\000\377\377", "ffff::ffff:0:ffff" }, { "\000\000\377\377\000\000\000\000\000\000\377\377\000\000\377\377", "0:ffff::ffff:0:ffff" }, { "\377\377\377\377\000\000\000\000\000\000\377\377\000\000\377\377", "ffff:ffff::ffff:0:ffff" }, { "\000\000\000\000\377\377\000\000\000\000\377\377\000\000\377\377", "::ffff:0:0:ffff:0:ffff" }, { "\377\377\000\000\377\377\000\000\000\000\377\377\000\000\377\377", "ffff:0:ffff::ffff:0:ffff" }, { "\000\000\377\377\377\377\000\000\000\000\377\377\000\000\377\377", "0:ffff:ffff::ffff:0:ffff" }, { "\377\377\377\377\377\377\000\000\000\000\377\377\000\000\377\377", "ffff:ffff:ffff::ffff:0:ffff" }, { "\000\000\000\000\000\000\377\377\000\000\377\377\000\000\377\377", "::ffff:0:ffff:0:ffff" }, { "\377\377\000\000\000\000\377\377\000\000\377\377\000\000\377\377", "ffff::ffff:0:ffff:0:ffff" }, { "\000\000\377\377\000\000\377\377\000\000\377\377\000\000\377\377", "0:ffff:0:ffff:0:ffff:0:ffff" }, { "\377\377\377\377\000\000\377\377\000\000\377\377\000\000\377\377", "ffff:ffff:0:ffff:0:ffff:0:ffff" }, { "\000\000\000\000\377\377\377\377\000\000\377\377\000\000\377\377", "::ffff:ffff:0:ffff:0:ffff" }, { "\377\377\000\000\377\377\377\377\000\000\377\377\000\000\377\377", "ffff:0:ffff:ffff:0:ffff:0:ffff" }, { "\000\000\377\377\377\377\377\377\000\000\377\377\000\000\377\377", "0:ffff:ffff:ffff:0:ffff:0:ffff" }, { "\377\377\377\377\377\377\377\377\000\000\377\377\000\000\377\377", "ffff:ffff:ffff:ffff:0:ffff:0:ffff" }, { "\000\000\000\000\000\000\000\000\377\377\377\377\000\000\377\377", "::ffff:ffff:0:ffff" }, { "\377\377\000\000\000\000\000\000\377\377\377\377\000\000\377\377", "ffff::ffff:ffff:0:ffff" }, { "\000\000\377\377\000\000\000\000\377\377\377\377\000\000\377\377", "0:ffff::ffff:ffff:0:ffff" }, { "\377\377\377\377\000\000\000\000\377\377\377\377\000\000\377\377", "ffff:ffff::ffff:ffff:0:ffff" }, { "\000\000\000\000\377\377\000\000\377\377\377\377\000\000\377\377", "::ffff:0:ffff:ffff:0:ffff" }, { "\377\377\000\000\377\377\000\000\377\377\377\377\000\000\377\377", "ffff:0:ffff:0:ffff:ffff:0:ffff" }, { "\000\000\377\377\377\377\000\000\377\377\377\377\000\000\377\377", "0:ffff:ffff:0:ffff:ffff:0:ffff" }, { "\377\377\377\377\377\377\000\000\377\377\377\377\000\000\377\377", "ffff:ffff:ffff:0:ffff:ffff:0:ffff" }, { "\000\000\000\000\000\000\377\377\377\377\377\377\000\000\377\377", "::ffff:ffff:ffff:0:ffff" }, { "\377\377\000\000\000\000\377\377\377\377\377\377\000\000\377\377", "ffff::ffff:ffff:ffff:0:ffff" }, { "\000\000\377\377\000\000\377\377\377\377\377\377\000\000\377\377", "0:ffff:0:ffff:ffff:ffff:0:ffff" }, { "\377\377\377\377\000\000\377\377\377\377\377\377\000\000\377\377", "ffff:ffff:0:ffff:ffff:ffff:0:ffff" }, { "\000\000\000\000\377\377\377\377\377\377\377\377\000\000\377\377", "::ffff:ffff:ffff:ffff:0:ffff" }, { "\377\377\000\000\377\377\377\377\377\377\377\377\000\000\377\377", "ffff:0:ffff:ffff:ffff:ffff:0:ffff" }, { "\000\000\377\377\377\377\377\377\377\377\377\377\000\000\377\377", "0:ffff:ffff:ffff:ffff:ffff:0:ffff" }, { "\377\377\377\377\377\377\377\377\377\377\377\377\000\000\377\377", "ffff:ffff:ffff:ffff:ffff:ffff:0:ffff" }, { "\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377", "::ffff:ffff" }, /* inet_ntop incompatible: ::255.255.255.255 */ { "\377\377\000\000\000\000\000\000\000\000\000\000\377\377\377\377", "ffff::ffff:ffff" }, { "\000\000\377\377\000\000\000\000\000\000\000\000\377\377\377\377", "0:ffff::ffff:ffff" }, { "\377\377\377\377\000\000\000\000\000\000\000\000\377\377\377\377", "ffff:ffff::ffff:ffff" }, { "\000\000\000\000\377\377\000\000\000\000\000\000\377\377\377\377", "0:0:ffff::ffff:ffff" }, { "\377\377\000\000\377\377\000\000\000\000\000\000\377\377\377\377", "ffff:0:ffff::ffff:ffff" }, { "\000\000\377\377\377\377\000\000\000\000\000\000\377\377\377\377", "0:ffff:ffff::ffff:ffff" }, { "\377\377\377\377\377\377\000\000\000\000\000\000\377\377\377\377", "ffff:ffff:ffff::ffff:ffff" }, { "\000\000\000\000\000\000\377\377\000\000\000\000\377\377\377\377", "::ffff:0:0:ffff:ffff" }, { "\377\377\000\000\000\000\377\377\000\000\000\000\377\377\377\377", "ffff::ffff:0:0:ffff:ffff" }, { "\000\000\377\377\000\000\377\377\000\000\000\000\377\377\377\377", "0:ffff:0:ffff::ffff:ffff" }, { "\377\377\377\377\000\000\377\377\000\000\000\000\377\377\377\377", "ffff:ffff:0:ffff::ffff:ffff" }, { "\000\000\000\000\377\377\377\377\000\000\000\000\377\377\377\377", "::ffff:ffff:0:0:ffff:ffff" }, { "\377\377\000\000\377\377\377\377\000\000\000\000\377\377\377\377", "ffff:0:ffff:ffff::ffff:ffff" }, { "\000\000\377\377\377\377\377\377\000\000\000\000\377\377\377\377", "0:ffff:ffff:ffff::ffff:ffff" }, { "\377\377\377\377\377\377\377\377\000\000\000\000\377\377\377\377", "ffff:ffff:ffff:ffff::ffff:ffff" }, { "\000\000\000\000\000\000\000\000\377\377\000\000\377\377\377\377", "::ffff:0:ffff:ffff" }, { "\377\377\000\000\000\000\000\000\377\377\000\000\377\377\377\377", "ffff::ffff:0:ffff:ffff" }, { "\000\000\377\377\000\000\000\000\377\377\000\000\377\377\377\377", "0:ffff::ffff:0:ffff:ffff" }, { "\377\377\377\377\000\000\000\000\377\377\000\000\377\377\377\377", "ffff:ffff::ffff:0:ffff:ffff" }, { "\000\000\000\000\377\377\000\000\377\377\000\000\377\377\377\377", "::ffff:0:ffff:0:ffff:ffff" }, { "\377\377\000\000\377\377\000\000\377\377\000\000\377\377\377\377", "ffff:0:ffff:0:ffff:0:ffff:ffff" }, { "\000\000\377\377\377\377\000\000\377\377\000\000\377\377\377\377", "0:ffff:ffff:0:ffff:0:ffff:ffff" }, { "\377\377\377\377\377\377\000\000\377\377\000\000\377\377\377\377", "ffff:ffff:ffff:0:ffff:0:ffff:ffff" }, { "\000\000\000\000\000\000\377\377\377\377\000\000\377\377\377\377", "::ffff:ffff:0:ffff:ffff" }, { "\377\377\000\000\000\000\377\377\377\377\000\000\377\377\377\377", "ffff::ffff:ffff:0:ffff:ffff" }, { "\000\000\377\377\000\000\377\377\377\377\000\000\377\377\377\377", "0:ffff:0:ffff:ffff:0:ffff:ffff" }, { "\377\377\377\377\000\000\377\377\377\377\000\000\377\377\377\377", "ffff:ffff:0:ffff:ffff:0:ffff:ffff" }, { "\000\000\000\000\377\377\377\377\377\377\000\000\377\377\377\377", "::ffff:ffff:ffff:0:ffff:ffff" }, { "\377\377\000\000\377\377\377\377\377\377\000\000\377\377\377\377", "ffff:0:ffff:ffff:ffff:0:ffff:ffff" }, { "\000\000\377\377\377\377\377\377\377\377\000\000\377\377\377\377", "0:ffff:ffff:ffff:ffff:0:ffff:ffff" }, { "\377\377\377\377\377\377\377\377\377\377\000\000\377\377\377\377", "ffff:ffff:ffff:ffff:ffff:0:ffff:ffff" }, { "\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377", "255.255.255.255" }, /* inet_ntop incompatible: ::ffff:255.255.255.255 */ { "\377\377\000\000\000\000\000\000\000\000\377\377\377\377\377\377", "ffff::ffff:ffff:ffff" }, { "\000\000\377\377\000\000\000\000\000\000\377\377\377\377\377\377", "0:ffff::ffff:ffff:ffff" }, { "\377\377\377\377\000\000\000\000\000\000\377\377\377\377\377\377", "ffff:ffff::ffff:ffff:ffff" }, { "\000\000\000\000\377\377\000\000\000\000\377\377\377\377\377\377", "::ffff:0:0:ffff:ffff:ffff" }, { "\377\377\000\000\377\377\000\000\000\000\377\377\377\377\377\377", "ffff:0:ffff::ffff:ffff:ffff" }, { "\000\000\377\377\377\377\000\000\000\000\377\377\377\377\377\377", "0:ffff:ffff::ffff:ffff:ffff" }, { "\377\377\377\377\377\377\000\000\000\000\377\377\377\377\377\377", "ffff:ffff:ffff::ffff:ffff:ffff" }, { "\000\000\000\000\000\000\377\377\000\000\377\377\377\377\377\377", "::ffff:0:ffff:ffff:ffff" }, { "\377\377\000\000\000\000\377\377\000\000\377\377\377\377\377\377", "ffff::ffff:0:ffff:ffff:ffff" }, { "\000\000\377\377\000\000\377\377\000\000\377\377\377\377\377\377", "0:ffff:0:ffff:0:ffff:ffff:ffff" }, { "\377\377\377\377\000\000\377\377\000\000\377\377\377\377\377\377", "ffff:ffff:0:ffff:0:ffff:ffff:ffff" }, { "\000\000\000\000\377\377\377\377\000\000\377\377\377\377\377\377", "::ffff:ffff:0:ffff:ffff:ffff" }, { "\377\377\000\000\377\377\377\377\000\000\377\377\377\377\377\377", "ffff:0:ffff:ffff:0:ffff:ffff:ffff" }, { "\000\000\377\377\377\377\377\377\000\000\377\377\377\377\377\377", "0:ffff:ffff:ffff:0:ffff:ffff:ffff" }, { "\377\377\377\377\377\377\377\377\000\000\377\377\377\377\377\377", "ffff:ffff:ffff:ffff:0:ffff:ffff:ffff" }, { "\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377", "::ffff:ffff:ffff:ffff" }, { "\377\377\000\000\000\000\000\000\377\377\377\377\377\377\377\377", "ffff::ffff:ffff:ffff:ffff" }, { "\000\000\377\377\000\000\000\000\377\377\377\377\377\377\377\377", "0:ffff::ffff:ffff:ffff:ffff" }, { "\377\377\377\377\000\000\000\000\377\377\377\377\377\377\377\377", "ffff:ffff::ffff:ffff:ffff:ffff" }, { "\000\000\000\000\377\377\000\000\377\377\377\377\377\377\377\377", "::ffff:0:ffff:ffff:ffff:ffff" }, { "\377\377\000\000\377\377\000\000\377\377\377\377\377\377\377\377", "ffff:0:ffff:0:ffff:ffff:ffff:ffff" }, { "\000\000\377\377\377\377\000\000\377\377\377\377\377\377\377\377", "0:ffff:ffff:0:ffff:ffff:ffff:ffff" }, { "\377\377\377\377\377\377\000\000\377\377\377\377\377\377\377\377", "ffff:ffff:ffff:0:ffff:ffff:ffff:ffff" }, { "\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377", "::ffff:ffff:ffff:ffff:ffff" }, { "\377\377\000\000\000\000\377\377\377\377\377\377\377\377\377\377", "ffff::ffff:ffff:ffff:ffff:ffff" }, { "\000\000\377\377\000\000\377\377\377\377\377\377\377\377\377\377", "0:ffff:0:ffff:ffff:ffff:ffff:ffff" }, { "\377\377\377\377\000\000\377\377\377\377\377\377\377\377\377\377", "ffff:ffff:0:ffff:ffff:ffff:ffff:ffff" }, { "\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\377", "::ffff:ffff:ffff:ffff:ffff:ffff" }, { "\377\377\000\000\377\377\377\377\377\377\377\377\377\377\377\377", "ffff:0:ffff:ffff:ffff:ffff:ffff:ffff" }, { "\000\000\377\377\377\377\377\377\377\377\377\377\377\377\377\377", "0:ffff:ffff:ffff:ffff:ffff:ffff:ffff" }, { "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" }, { 0, 0 } }; static void test_compress(void) { long long i, j; char *buf0; char buf1[IPTOSTR_LEN]; char buf2[IPTOSTR_LEN]; for (i = 0;testvectors[i].ip; ++i) { for (j = 0; j < IPTOSTR_LEN; ++j) { buf1[j] = (char)0xff; buf2[j] = 0; } buf0 = iptostr(0, (unsigned char *)testvectors[i].ip); iptostr(buf1, (unsigned char *)testvectors[i].ip); for (j = 0; j < IPTOSTR_LEN; ++j) { buf2[j] = testvectors[i].ipstr[j]; if (!buf2[j]) break; } for (j = 0; j < IPTOSTR_LEN; ++j) { if (buf0[j] != buf2[j]) fail("bad output"); if (buf1[j] != buf2[j]) fail("bad output"); } } } static void test_bufferoverflow(void) { char buf[IPTOSTR_LEN + 16]; long long i, j; unsigned char ip[16]; char ch[2] = {0x00, (char)0xff }; if ((IPTOSTR_LEN) < sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")) fail("IPTOSTR_LEN too small"); for (i = 0; i < 16; ++i) ip[i] = 0x11; for (j = 0; j < 2; ++j) { for (i = 0; i < sizeof buf; ++i) buf[i] = ch[j]; iptostr(buf + 8, ip); for (i = 0; i < 8; ++i) if (buf[i] != ch[j]) fail("iptostr writes before output"); for (i = 0; i < 8; ++i) if (buf[i + IPTOSTR_LEN + 8] != ch[j]) fail("iptostr writes after output"); } } int main(void) { test_compress(); test_bufferoverflow(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/loadtest.c000066400000000000000000000014011500472222400210470ustar00rootroot00000000000000/* 20140417 Jan Mojzis Public domain. */ #include #include #include #include #include "fail.h" #include "open.h" #include "randombytes.h" #include "byte.h" #include "load.h" #include "writeall.h" #define SPACELEN 1048577 unsigned char space1[SPACELEN]; unsigned char space2[SPACELEN]; static void test1(void) { int fd; fd = open_write("loadtest.data"); if (fd == -1) fail("failure"); randombytes(space1, sizeof space1); if (writeall(fd, space1, sizeof space1) == -1) fail("failure"); close(fd); if (load("loadtest.data", space2, sizeof space2) == -1) fail("failure"); if (!byte_isequal(space1, SPACELEN, space2)) fail("failure"); } int main(void) { test1(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/loginshelltest.c000066400000000000000000000025101500472222400222720ustar00rootroot00000000000000/* 20140429 Jan Mojzis Public domain. */ #include "str.h" #include "byte.h" #include "fail.h" #include "loginshell.h" static char buf[10]; static struct vector { const char *in; const char *out; } vectors[] = { { "", "-" }, { "/", "-" }, { "//", "-" }, { "///", "-" }, { "////", "-" }, { "/////", "-" }, { "/a/b/c/d/", "-" }, { "/a///d/", "-" }, { "//b/c//", "-" }, { "x/", "-" }, { "x/x/xx/xxx/", "-" }, { "sh", "-sh" }, { "/bin/bash", "-bash" }, { "///////dash", "-dash" }, { "///////-ksh", "--ksh" }, /* truncation */ { "longlongsh", "-longlong" }, { 0, 0 } }; static void testok(void) { long long i, len; for (i = 0; vectors[i].in; ++i) { if (!loginshell(buf, sizeof buf, vectors[i].in)) fail("loginshell failure"); len = str_len(vectors[i].out); if (str_len(buf) != len) fail("loginshell failure"); if (!byte_isequal(buf, len, vectors[i].out)) fail("loginshell failure"); } } static void testbad(void) { if (loginshell(buf, -1, "")) fail("loginshell failure"); if (loginshell(buf, 0, "")) fail("loginshell failure"); if (loginshell(buf, 1, "")) fail("loginshell failure"); if (loginshell(buf, 1, "//")) fail("loginshell failure"); } int main(void) { testok(); testbad(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/logsystest.c000077700000000000000000000000001500472222400236512emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/logtest.c000066400000000000000000000050371500472222400207220ustar00rootroot00000000000000/* 20140319 Jan Mojzis Public domain. */ #include #include #include #include #include "fail.h" #include "byte.h" #include "log.h" static int readall(int fd, unsigned char *x, long long xlen) { long long r; long long len = 0; while (xlen > 0) { r = read(fd, x, xlen); if (r == 0) break; if (r <= 0) return -1; x += r; len += r; xlen -= r; } return len; } static unsigned char buf[1024]; #define LINE_EXP "?????????\n????????????????????? !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????" static void run(void (*op)(void)) { pid_t pid; int status, fromchild[2]; long long r, i, j; if (pipe(fromchild) == -1) fail("pipe() failure"); pid = fork(); if (pid == -1) fail("fork() failure"); if (pid == 0) { close(fromchild[0]); if (dup2(fromchild[1], 2) == -1) _exit(111); op(); _exit(0); } close(fromchild[1]); r = readall(fromchild[0], buf, sizeof buf); if (r == -1) fail("read() failure"); j = 0; for (i = 0; i < r; ++i) { if (buf[i] == ' ') ++j; if (j == 3) break; } r -= i + 1; byte_copy(buf, r, buf + i + 1); for (r = r - 1; r > 0; --r) { if (buf[r] == ' ') { buf[r] = 0; break; } } while (waitpid(pid, &status, 0) != pid) {}; if (!WIFEXITED(status)) fail("process killed"); if (WEXITSTATUS(status)) fail("process exited with status != 0"); if (r < sizeof(LINE_EXP) - 1) fail("failure"); if (!byte_isequal(buf, sizeof(LINE_EXP) - 1, LINE_EXP)) fail("failure"); } static char line[256]; static void feed(void) { unsigned long long i; for (i = 0; i < 256; ++i) line[i] = (unsigned char)(i + 1); } static void test_fatal(void) { log_init(0, "x", 1, 0); log_d1("hidden"); log_i1("hidden"); log_w1("hidden"); log_f1(line); } static void test_warning(void) { log_init(1, "x", 1, 0); log_d1("hidden"); log_i1("hidden"); log_w1(line); } static void test_info(void) { log_init(1, "x", 1, 0); log_d1("hidden"); log_i1(line); } static void test_debug(void) { log_init(2, "x", 1, 0); log_d1(line); } int main(void) { return 0; feed(); run(test_fatal); run(test_warning); run(test_info); run(test_debug); _exit(0); } tinyssh-20250501/old/tinyssh-tests/main_tinysshd_makekeytest.c000077700000000000000000000000001500472222400267102emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/main_tinysshd_printkeytest.c000077700000000000000000000000001500472222400271272emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/main_tinysshdtest.c000077700000000000000000000000001500472222400252022emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/newenvtest.c000066400000000000000000000066571500472222400214540ustar00rootroot00000000000000/* 20140129 Jan Mojzis Public domain. */ #include #include #include #include "run.h" #include "fail.h" #include "newenv.h" #define SCRIPT1 "\ err='newenvtest: failed: newenv_env does not set correcty variable'\n\ [ x\"$AA1\" = x ] || ( echo $err; exit 111; ) \n\ [ x\"$AA3\" = x ] || ( echo $err; exit 111; ) \n\ [ x\"$BBB\" = xok ] || ( echo $err; exit 111; ) \n\ [ x\"$CC1\" = xok ] || ( echo $err; exit 111; ) \n\ [ x\"$CC3\" = x ] || ( echo $err; exit 111; ) \n\ [ x\"$DD1\" = xok ] || ( echo $err; exit 111; ) \n\ [ x\"$DD3\" = xok ] || ( echo $err; exit 111; ) \n\ [ x\"$EE1\" = xok ] || ( echo $err; exit 111; ) \n\ [ x\"$FF1\" = xok ] || ( echo $err; exit 111; ) \n\ [ x\"$YY1\" = xok ] || ( echo $err; exit 111; ) \n\ [ x\"$ZZ1\" = x ] || ( echo $err; exit 111; ) \n\ [ x\"$ZZ3\" = x ] || ( echo $err; exit 111; ) \n\ exit 0 \n\ " static void test1(void) { char *run[4]; long long i; char buf[100]; /* normal setenv */ if (setenv("BBB", "ok", 1) == -1) fail("setenv failure"); if (!newenv_copyenv("BBB")) fail("newenv_copyenv failure"); /* normal env */ if (!newenv_env("CC1", "ok")) fail("newenv_env failure"); if (newenv_copyenv("CC3")) fail("newenv_copyenv failure"); /* replaced env */ if (!newenv_env("DD1", "failed")) fail("newenv_env failure"); if (!newenv_env("DD1", "ok")) fail("newenv_env failure"); if (setenv("DD3", "failed", 1) == -1) fail("setenv failure"); if (!newenv_copyenv("DD3")) fail("newenv_copyenv failure"); if (setenv("DD3", "ok", 1) == -1) fail("setenv failure"); if (!newenv_copyenv("DD3")) fail("newenv_copyenv failure"); /* setenv first */ if (setenv("EE1", "failed", 1) == -1) fail("setenv failure"); if (!newenv_env("EE1", "ok")) fail("newenv_env failure"); /* setenv last */ if (!newenv_env("FF1", "ok")) fail("newenv_env failure"); if (setenv("FF1", "failed", 1) == -1) fail("setenv failure"); /* replaced env - ok */ if (!newenv_env("YY1", "ok")) fail("newenv_env failure"); for (i = 0; i < 200; ++i) { snprintf(buf, sizeof buf, "%lld", i); newenv_env(buf, buf); } if (!newenv_env("YY1", "ok")) fail("newenv_env failure"); /* replaced env - overflow */ for (i = 0; i < 200; ++i) { snprintf(buf, sizeof buf, "%lld", i); newenv_env(buf, buf); } if (newenv_env("ZZ1", "failed")) fail("newenv_env failure"); if (setenv("ZZ3", "failed", 1) == -1) fail("setenv failure"); if (newenv_copyenv("ZZ3")) fail("newenv_copyenv failure"); run[0] = (char *)"/bin/sh"; run[1] = (char *)"-ec"; run[2] = (char *)SCRIPT1; run[3] = (char *)0; newenv_exec(*run, run); fail("failure"); } #define SCRIPT2 "\ err='newenvtest2: failed: environment should be empty'\n\ [ x\"$AAAA\" = x ] || ( echo $err; exit 111; ) \n\ exit 0 \n\ " static void test2(void) { char *run[4]; /* setenv */ if (setenv("AAAA", "failed", 1) == -1) fail("setenv failure"); run[0] = (char *)"/bin/sh"; run[1] = (char *)"-ec"; run[2] = (char *)SCRIPT2; run[3] = 0; newenv_exec(*run, run); } static void test3(void) { for (;;) { if (newenv_lowenv("XXX", "YYY")) break; } if (!newenv_env("XXX", "YYY")) fail("newenv_env failure"); } static void testdummy(void) { _exit(111); } int main(void) { run_mustpass(test1); run_mustpass(test2); test3(); run_mustfail(testdummy); _exit(0); } tinyssh-20250501/old/tinyssh-tests/numtostrtest.c000066400000000000000000000227731500472222400220420ustar00rootroot00000000000000/* 20140201 Jan Mojzis Public domain. */ #include #include #include #include "fail.h" #include "numtostr.h" static long long int128max(void) { long long x = 9223372036854775807LL; x <<= 32; x <<= 32; x += 9223372036854775807LL; x += 9223372036854775807LL; x += 1; return x; } static void test_bufferoverflow(void) { char buf[NUMTOSTR_LEN + 16]; long long i, j; char ch[2] = {0x00, (char)0xff }; long long llmaxnum; long long llminnum; long long numlen = sizeof(long long); if (numlen == 16) { llmaxnum = int128max(); llminnum = -llmaxnum - 1LL; } else if (numlen == 8) { llmaxnum = 9223372036854775807LL; llminnum = -llmaxnum - 1LL; } else { fail("unsupported size for 'num'"); } if ((NUMTOSTR_LEN) < sizeof("-170141183460469231731687303715884105728")) fail("NUMTOSTR_LEN too small"); for (j = 0; j < 2; ++j) { for (i = 0; i < sizeof buf; ++i) buf[i] = ch[j]; numtostr(buf + 8, llminnum); for (i = 0; i < 8; ++i) if (buf[i] != ch[j]) fail("numtostr() writes before output"); for (i = 0; i < 8; ++i) if (buf[i + NUMTOSTR_LEN + 8] != ch[j]) fail("numtostr() writes after output"); for (i = 0; i < sizeof buf; ++i) buf[i] = ch[j]; numtostr(buf + 8, llmaxnum); for (i = 0; i < 8; ++i) if (buf[i] != ch[j]) fail("numtostr() writes before output"); for (i = 0; i < 8; ++i) if (buf[i + NUMTOSTR_LEN + 8] != ch[j]) fail("numtostr() writes after output"); } } static void test_minmax(void) { const char *llmax; const char *llmin; long long llmaxnum; long long llminnum; char *x; long long numlen = sizeof(long long); if (numlen == 16) { llmax = "170141183460469231731687303715884105727"; llmin = "-170141183460469231731687303715884105728"; llmaxnum = int128max(); llminnum = -llmaxnum - 1LL; } else if (numlen == 8) { llmax = "9223372036854775807"; llmin = "-9223372036854775808"; llmaxnum = 9223372036854775807LL; llminnum = -llmaxnum - 1LL; } else { fail("unsupported size for 'num'"); } x = numtostr(0, llmaxnum); if (strcmp(x, llmax)) fail("numtostr() failure"); x = numtostr(0, llminnum); if (strcmp(x, llmin)) fail("numtostr() failure"); } struct vectors { long long num; const char *strnum; } testvectors[] = { { -100, "-100" }, { -99, "-99" }, { -98, "-98" }, { -97, "-97" }, { -96, "-96" }, { -95, "-95" }, { -94, "-94" }, { -93, "-93" }, { -92, "-92" }, { -91, "-91" }, { -90, "-90" }, { -89, "-89" }, { -88, "-88" }, { -87, "-87" }, { -86, "-86" }, { -85, "-85" }, { -84, "-84" }, { -83, "-83" }, { -82, "-82" }, { -81, "-81" }, { -80, "-80" }, { -79, "-79" }, { -78, "-78" }, { -77, "-77" }, { -76, "-76" }, { -75, "-75" }, { -74, "-74" }, { -73, "-73" }, { -72, "-72" }, { -71, "-71" }, { -70, "-70" }, { -69, "-69" }, { -68, "-68" }, { -67, "-67" }, { -66, "-66" }, { -65, "-65" }, { -64, "-64" }, { -63, "-63" }, { -62, "-62" }, { -61, "-61" }, { -60, "-60" }, { -59, "-59" }, { -58, "-58" }, { -57, "-57" }, { -56, "-56" }, { -55, "-55" }, { -54, "-54" }, { -53, "-53" }, { -52, "-52" }, { -51, "-51" }, { -50, "-50" }, { -49, "-49" }, { -48, "-48" }, { -47, "-47" }, { -46, "-46" }, { -45, "-45" }, { -44, "-44" }, { -43, "-43" }, { -42, "-42" }, { -41, "-41" }, { -40, "-40" }, { -39, "-39" }, { -38, "-38" }, { -37, "-37" }, { -36, "-36" }, { -35, "-35" }, { -34, "-34" }, { -33, "-33" }, { -32, "-32" }, { -31, "-31" }, { -30, "-30" }, { -29, "-29" }, { -28, "-28" }, { -27, "-27" }, { -26, "-26" }, { -25, "-25" }, { -24, "-24" }, { -23, "-23" }, { -22, "-22" }, { -21, "-21" }, { -20, "-20" }, { -19, "-19" }, { -18, "-18" }, { -17, "-17" }, { -16, "-16" }, { -15, "-15" }, { -14, "-14" }, { -13, "-13" }, { -12, "-12" }, { -11, "-11" }, { -10, "-10" }, { -9, "-9" }, { -8, "-8" }, { -7, "-7" }, { -6, "-6" }, { -5, "-5" }, { -4, "-4" }, { -3, "-3" }, { -2, "-2" }, { -1, "-1" }, { 0, "0" }, { 1, "1" }, { 2, "2" }, { 3, "3" }, { 4, "4" }, { 5, "5" }, { 6, "6" }, { 7, "7" }, { 8, "8" }, { 9, "9" }, { 10, "10" }, { 11, "11" }, { 12, "12" }, { 13, "13" }, { 14, "14" }, { 15, "15" }, { 16, "16" }, { 17, "17" }, { 18, "18" }, { 19, "19" }, { 20, "20" }, { 21, "21" }, { 22, "22" }, { 23, "23" }, { 24, "24" }, { 25, "25" }, { 26, "26" }, { 27, "27" }, { 28, "28" }, { 29, "29" }, { 30, "30" }, { 31, "31" }, { 32, "32" }, { 33, "33" }, { 34, "34" }, { 35, "35" }, { 36, "36" }, { 37, "37" }, { 38, "38" }, { 39, "39" }, { 40, "40" }, { 41, "41" }, { 42, "42" }, { 43, "43" }, { 44, "44" }, { 45, "45" }, { 46, "46" }, { 47, "47" }, { 48, "48" }, { 49, "49" }, { 50, "50" }, { 51, "51" }, { 52, "52" }, { 53, "53" }, { 54, "54" }, { 55, "55" }, { 56, "56" }, { 57, "57" }, { 58, "58" }, { 59, "59" }, { 60, "60" }, { 61, "61" }, { 62, "62" }, { 63, "63" }, { 64, "64" }, { 65, "65" }, { 66, "66" }, { 67, "67" }, { 68, "68" }, { 69, "69" }, { 70, "70" }, { 71, "71" }, { 72, "72" }, { 73, "73" }, { 74, "74" }, { 75, "75" }, { 76, "76" }, { 77, "77" }, { 78, "78" }, { 79, "79" }, { 80, "80" }, { 81, "81" }, { 82, "82" }, { 83, "83" }, { 84, "84" }, { 85, "85" }, { 86, "86" }, { 87, "87" }, { 88, "88" }, { 89, "89" }, { 90, "90" }, { 91, "91" }, { 92, "92" }, { 93, "93" }, { 94, "94" }, { 95, "95" }, { 96, "96" }, { 97, "97" }, { 98, "98" }, { 99, "99" }, { 100, "100" }, { -9223372036854775808LL, "-9223372036854775808" }, { -9223372036854775807LL, "-9223372036854775807" }, { -9223372036854775806LL, "-9223372036854775806" }, { -9223372036854775805LL, "-9223372036854775805" }, { -9223372036854775804LL, "-9223372036854775804" }, { -9223372036854775803LL, "-9223372036854775803" }, { -9223372036854775802LL, "-9223372036854775802" }, { -9223372036854775801LL, "-9223372036854775801" }, { -9223372036854775800LL, "-9223372036854775800" }, { -9223372036854775799LL, "-9223372036854775799" }, { -9223372036854775798LL, "-9223372036854775798" }, { -9223372036854775797LL, "-9223372036854775797" }, { -9223372036854775796LL, "-9223372036854775796" }, { -9223372036854775795LL, "-9223372036854775795" }, { -9223372036854775794LL, "-9223372036854775794" }, { -9223372036854775793LL, "-9223372036854775793" }, { -9223372036854775792LL, "-9223372036854775792" }, { -9223372036854775791LL, "-9223372036854775791" }, { -9223372036854775790LL, "-9223372036854775790" }, { -9223372036854775789LL, "-9223372036854775789" }, { -9223372036854775788LL, "-9223372036854775788" }, { -9223372036854775787LL, "-9223372036854775787" }, { -9223372036854775786LL, "-9223372036854775786" }, { -9223372036854775785LL, "-9223372036854775785" }, { -9223372036854775784LL, "-9223372036854775784" }, { -9223372036854775783LL, "-9223372036854775783" }, { -9223372036854775782LL, "-9223372036854775782" }, { -9223372036854775781LL, "-9223372036854775781" }, { 9223372036854775780LL, "9223372036854775780" }, { 9223372036854775781LL, "9223372036854775781" }, { 9223372036854775782LL, "9223372036854775782" }, { 9223372036854775783LL, "9223372036854775783" }, { 9223372036854775784LL, "9223372036854775784" }, { 9223372036854775785LL, "9223372036854775785" }, { 9223372036854775786LL, "9223372036854775786" }, { 9223372036854775787LL, "9223372036854775787" }, { 9223372036854775788LL, "9223372036854775788" }, { 9223372036854775789LL, "9223372036854775789" }, { 9223372036854775790LL, "9223372036854775790" }, { 9223372036854775791LL, "9223372036854775791" }, { 9223372036854775792LL, "9223372036854775792" }, { 9223372036854775793LL, "9223372036854775793" }, { 9223372036854775794LL, "9223372036854775794" }, { 9223372036854775795LL, "9223372036854775795" }, { 9223372036854775796LL, "9223372036854775796" }, { 9223372036854775797LL, "9223372036854775797" }, { 9223372036854775798LL, "9223372036854775798" }, { 9223372036854775799LL, "9223372036854775799" }, { 9223372036854775800LL, "9223372036854775800" }, { 9223372036854775801LL, "9223372036854775801" }, { 9223372036854775802LL, "9223372036854775802" }, { 9223372036854775803LL, "9223372036854775803" }, { 9223372036854775804LL, "9223372036854775804" }, { 9223372036854775805LL, "9223372036854775805" }, { 9223372036854775806LL, "9223372036854775806" }, { 9223372036854775807LL, "9223372036854775807" }, { 0, 0 } }; static void test_vector(void) { long long i; char *x; for (i = 0; testvectors[i].strnum; ++i) { x = numtostr(0, testvectors[i].num); if (strcmp(x, testvectors[i].strnum)) fail("numtostr() failure"); } } int main(void) { test_bufferoverflow(); test_minmax(); test_vector(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/opentest.c000066400000000000000000000022601500472222400210750ustar00rootroot00000000000000/* 20140410 Jan Mojzis Public domain. */ #include #include #include "run.h" #include "fail.h" #include "open.h" static void cat(void) { char *catcmd[2] = { (char *)"cat", 0 }; execvp(*catcmd, catcmd); } /* test if close-on-exec works for open_read() */ static void test1(void) { int fd; close(0); fd = open_read("opentest.c"); if (fd != 0) fail("unable to open opentest.c for reading"); cat(); } /* test if close-on-exec works for open_write() */ static void test2(void) { int fd; close(1); fd = open_write("opentest.data"); if (fd != 1) fail("unable to open opentest.data for writing"); cat(); } /* test if close-on-exec works for open_pipe() */ static void test3(void) { int fd, pi[2]; close(0); close(1); fd = open_pipe(pi); if (fd == -1) fail("unable to open pipe"); if (pi[0] != 0) fail("unable to open pipe"); if (pi[1] != 1) fail("unable to open pipe"); cat(); } /* dummy test */ static void testdummy(void) { _exit(0); } int main(void) { alarm(10); run_mustfail(test1); run_mustfail(test2); run_mustfail(test3); run_mustpass(testdummy); _exit(0); } tinyssh-20250501/old/tinyssh-tests/packet_authtest.c000077700000000000000000000000001500472222400246212emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/packet_channel_opentest.c000077700000000000000000000000001500472222400263112emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/packet_channel_recvtest.c000077700000000000000000000000001500472222400263072emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/packet_channel_requesttest.c000077700000000000000000000000001500472222400270402emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/packet_channel_sendtest.c000077700000000000000000000000001500472222400263012emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/packet_gettest.c000077700000000000000000000000001500472222400244372emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/packet_hellotest.c000077700000000000000000000000001500472222400247632emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/packet_kexdhtest.c000077700000000000000000000000001500472222400247632emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/packet_kextest.c000077700000000000000000000000001500472222400244472emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/packet_puttest.c000077700000000000000000000000001500472222400244702emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/packet_recvtest.c000077700000000000000000000000001500472222400246172emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/packet_sendtest.c000077700000000000000000000000001500472222400246112emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/packet_unimplementedtest.c000077700000000000000000000000001500472222400265262emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/packetparsertest.c000066400000000000000000000113141500472222400226200ustar00rootroot00000000000000/* 20140303 Jan Mojzis Public domain. */ #include #include "run.h" #include "fail.h" #include "byte.h" #include "packetparser.h" /* checks packetparser_uint8(), packetparser_uint32() function and packetparser_end called more than once */ static void test1(void) { unsigned char buf[4]; crypto_uint8 ch; crypto_uint32 u; long long i, pos = 0; byte_copy(buf, 4, "abcd"); /* uint8 */ pos = 0; for (i = 0; i < sizeof buf; ++i) { pos = packetparser_uint8(buf, sizeof buf, pos, &ch); if (ch != buf[i]) fail("failure"); } if (pos != sizeof buf) fail("failure"); /* uint32 */ pos = 0; pos = packetparser_uint8(buf, sizeof buf, 0, &ch); pos = packetparser_uint32(buf, sizeof buf, 0, &u); if (pos != sizeof buf) fail("failure"); pos = packetparser_end(buf, sizeof buf, pos); pos = packetparser_end(buf, sizeof buf, pos); pos = packetparser_end(buf, sizeof buf, pos); } /* checks if packetparser_skip() skips 0 bytes */ static void test2(void) { unsigned char buf[5]; crypto_uint8 ch; crypto_uint32 len; long long i, pos = 0; for (i = 0; i < sizeof buf; ++i) buf[i] = 0; pos = packetparser_uint32(buf, sizeof buf, pos, &len); if (len != 0) fail("failure"); pos = packetparser_skip(buf, sizeof buf, pos, len); pos = packetparser_uint8(buf, sizeof buf, pos, &ch); if (ch) fail("failure"); if (pos != sizeof buf) fail("failure"); pos = packetparser_end(buf, sizeof buf, pos); pos = packetparser_end(buf, sizeof buf, pos); pos = packetparser_end(buf, sizeof buf, pos); } /* checks if packetparser_copy() accepts 0 bytes */ static void test4(void) { unsigned char buf[5]; unsigned char buf2[6]; crypto_uint8 ch; crypto_uint32 len; long long i, pos = 0; for (i = 0; i < sizeof buf; ++i) buf[i] = 0; pos = packetparser_uint32(buf, sizeof buf, pos, &len); if (len != 0) fail("failure"); pos = packetparser_copy(buf, sizeof buf, pos, buf2, len); pos = packetparser_uint8(buf, sizeof buf, pos, &ch); if (ch) fail("failure"); if (pos != sizeof buf) fail("failure"); pos = packetparser_end(buf, sizeof buf, pos); pos = packetparser_end(buf, sizeof buf, pos); pos = packetparser_end(buf, sizeof buf, pos); } /* packetparser_skip() overflow */ static void _test3a(void) { unsigned char buf[5]; long long pos = 0; pos = packetparser_skip(buf, sizeof buf, pos, 6); } static void _test3aa(void) { unsigned char buf[5]; long long len, pos; len = pos = 9223372036854775807LL; pos = packetparser_skip(buf, len, pos, 1); } /* packetparser_uint32() overflow */ static void _test3b(void) { unsigned char buf[3]; crypto_uint32 u; long long pos = 0; pos = packetparser_uint32(buf, sizeof buf, pos, &u); } static void _test3bb(void) { unsigned char buf[4]; crypto_uint32 u; long long len, pos; len = pos = 9223372036854775807LL; pos = packetparser_uint32(buf, len, pos, &u); } /* packetparser_uint8() overflow */ static void _test3c(void) { unsigned char buf[3]; crypto_uint8 ch; long long pos = 0; pos = packetparser_uint8(buf, sizeof buf, pos, &ch); pos = packetparser_uint8(buf, sizeof buf, pos, &ch); pos = packetparser_uint8(buf, sizeof buf, pos, &ch); pos = packetparser_uint8(buf, sizeof buf, pos, &ch); } static void _test3cc(void) { unsigned char buf[3]; crypto_uint8 ch; long long len, pos; len = pos = 9223372036854775807LL; pos = packetparser_uint8(buf, len, pos, &ch); } /* packetparser_copy() overflow */ static void _test3d(void) { unsigned char buf1[10]; unsigned char buf2[11]; long long pos = 0; pos = packetparser_copy(buf1, sizeof buf1, pos, buf2, sizeof buf2); } static void _test3dd(void) { unsigned char buf1[10]; unsigned char buf2[10]; long long len, pos; len = pos = 9223372036854775807LL; pos = packetparser_copy(buf1, len, pos, buf2, sizeof buf2); } /* packetparser_end() failure */ static void _test3e(void) { unsigned char buf[1]; packetparser_end(buf, 0, 1); } static void _test3ee(void) { unsigned char buf[1]; long long pos = 9223372036854775807LL; packetparser_end(buf, pos, pos); } static void test3(void) { run_mustfail(_test3a); run_mustfail(_test3aa); run_mustfail(_test3b); run_mustfail(_test3bb); run_mustfail(_test3c); run_mustfail(_test3cc); run_mustfail(_test3d); run_mustfail(_test3dd); run_mustfail(_test3e); run_mustfail(_test3ee); } /* dummy test */ static void testdummy(void) { _exit(0); } int main(void) { test1(); test2(); test3(); test4(); run_mustpass(testdummy); _exit(0); } tinyssh-20250501/old/tinyssh-tests/packettest.c000077700000000000000000000000001500472222400236002emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/porttostrtest.c000066400000000000000000000046051500472222400222210ustar00rootroot00000000000000/* 20140201 Jan Mojzis Public domain. */ #include #include #include "fail.h" #include "porttostr.h" #include "crypto_uint16.h" static void porttostr_bufferoverflow(void) { char buf[PORTTOSTR_LEN + 16]; long long i, j; unsigned char port[2] = { 5, 5 }; char ch[2] = {0x00, (char)0xff }; if ((PORTTOSTR_LEN) < sizeof("65535")) fail("PORTTOSTR_LEN too small"); for (j = 0; j < 2; ++j) { for (i = 0; i < sizeof buf; ++i) buf[i] = ch[j]; porttostr(buf + 8, port); for (i = 0; i < 8; ++i) if (buf[i] != ch[j]) fail("porttostr writes before output"); for (i = 0; i < 8; ++i) if (buf[i + PORTTOSTR_LEN + 8] != ch[j]) fail("porttostr writes after output"); } } static struct vectors { const char *port; const char *portstr; } testvectors[] = { { "\377\377", "65535" }, { "\000\000", "0\0\0\0\0" }, { 0, 0 } }; static void porttostr_testvectors(void) { char *x, *y, *z; long long i, j; char buf[PORTTOSTR_LEN]; for (i = 0; testvectors[i].port; ++i) { for (j = 0; j < sizeof buf; ++j) buf[j] = (char)0xff; x = porttostr(buf, (unsigned char *)testvectors[i].port); y = porttostr(0, (unsigned char *)testvectors[i].port); z = (char *)testvectors[i].portstr; for (j = 0; j < PORTTOSTR_LEN; ++j) { if (buf[j] != z[j]) fail("bad output"); if (x[j] != z[j]) fail("bad output"); if (y[j] != z[j]) fail("bad output"); } } } static void packport(unsigned char *y, crypto_uint16 x) { y[1] = x & 255; x >>= 8; y[0] = x & 255; } static void porttostr_full(void) { long long i, j; unsigned char port[2]; char *x, *y; char buf[PORTTOSTR_LEN]; char buf2[PORTTOSTR_LEN + 10]; for (i = 0; i < 65536; ++i) { for (j = 0; j < sizeof buf; ++j) buf[j] = (char)0xff; for (j = 0; j < sizeof buf; ++j) buf2[j] = 0; packport(port, i); x = porttostr(buf, port); y = porttostr(0, port); snprintf(buf2, sizeof buf2, "%lld", i); for (j = 0; j < PORTTOSTR_LEN; ++j) { if (buf[j] != buf2[j]) fail("bad output"); if (x[j] != buf2[j]) fail("bad output"); if (y[j] != buf2[j]) fail("bad output"); } } } int main(void) { porttostr_bufferoverflow(); porttostr_testvectors(); porttostr_full(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/randommodtest.c000066400000000000000000000010541500472222400221140ustar00rootroot00000000000000/* 20140416 Jan Mojzis Public domain. */ #include #include #include "fail.h" #include "randommod.h" int main(void) { long long i, r; if (randommod(-1) != 0) fail("failure"); if (randommod(0) != 0) fail("failure"); if (randommod(1) != 0) fail("failure"); for (i = 2; i < 10; ++i) { r = randommod(i); if (r > i - 1 || r < 0) fail("failure"); } for (i = 18014398509481984ULL; i < 18014398509481994ULL; ++i) { if (randommod(i) == randommod(i)) fail("failure"); } _exit(0); } tinyssh-20250501/old/tinyssh-tests/readalltest.c000066400000000000000000000014541500472222400215440ustar00rootroot00000000000000/* 20140417 Jan Mojzis Public domain. */ #include #include #include #include #include "fail.h" #include "open.h" #include "randombytes.h" #include "byte.h" #include "readall.h" #include "writeall.h" #define SPACELEN 1048577 unsigned char space1[SPACELEN]; unsigned char space2[SPACELEN]; static void test1(void) { int fd; fd = open_write("readall.data"); if (fd == -1) fail("failure"); randombytes(space1, sizeof space1); if (writeall(fd, space1, sizeof space1) == -1) fail("failure"); close(fd); fd = open_read("readall.data"); if (readall(fd, space2, sizeof space2) == -1) fail("failure"); close(fd); if (!byte_isequal(space1, SPACELEN, space2)) fail("failure"); } int main(void) { test1(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/run.h000066400000000000000000000064201500472222400200470ustar00rootroot00000000000000#ifndef _RUN_H____ #define _RUN_H____ #include #include #include #include #include "fail.h" static void _run_mustfail(const char *file, unsigned long long line, void (*op)(void)) {\ \ pid_t pid; \ int status; \ \ pid = fork(); \ if (pid == -1) fail_(file, line, "unable to fork"); \ \ if (pid == 0) { \ close(2); \ op(); \ _exit(0); \ } \ \ while (waitpid(pid, &status, 0) != pid) {}; \ if (!WIFEXITED(status)) fail_(file, line, "process killed"); \ if (!WEXITSTATUS(status)) fail_(file, line, "process exited with status = 0"); \ } static void _run_mustpass(const char *file, unsigned long long line, void (*op)(void)) {\ \ pid_t pid; \ int status; \ \ pid = fork(); \ if (pid == -1) fail_(file, line, "unable to fork"); \ \ if (pid == 0) { \ close(2); \ op(); \ _exit(111); \ } \ \ while (waitpid(pid, &status, 0) != pid) {}; \ if (!WIFEXITED(status)) fail_(file, line, "process killed"); \ if (WEXITSTATUS(status)) fail_(file, line, "process exited with status != 0"); \ } #define run_mustfail(x) _run_mustfail(__FILE__, __LINE__, (x)); #define run_mustpass(x) _run_mustpass(__FILE__, __LINE__, (x)); #endif tinyssh-20250501/old/tinyssh-tests/savesynctest.c000066400000000000000000000013301500472222400217640ustar00rootroot00000000000000/* 20140417 Jan Mojzis Public domain. */ #include #include #include #include #include "fail.h" #include "randombytes.h" #include "byte.h" #include "load.h" #include "savesync.h" #include "writeall.h" #define SPACELEN 1048577 unsigned char space1[SPACELEN]; unsigned char space2[SPACELEN]; static void test1(void) { randombytes(space1, sizeof space1); if (savesync("savesynctest.data", space1, sizeof space1) == -1) fail("savesync() failure"); if (load("savesynctest.data", space2, sizeof space2) == -1) fail("load() failure"); if (!byte_isequal(space1, SPACELEN, space2)) fail("load()/savesync() failure"); } int main(void) { test1(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/sshcrypto_cipher_chachapolytest.c000077700000000000000000000000001500472222400301142emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/sshcrypto_ciphertest.c000077700000000000000000000000001500472222400257212emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/sshcrypto_kex_curve25519test.c000077700000000000000000000000001500472222400270502emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/sshcrypto_kex_sntrup761x25519test.c000077700000000000000000000000001500472222400277052emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/sshcrypto_kextest.c000077700000000000000000000000001500472222400252362emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/sshcrypto_key_ed25519test.c000077700000000000000000000000001500472222400263152emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/sshcrypto_keytest.c000077700000000000000000000000001500472222400252372emptytest.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh-tests/sshcryptotest.c000066400000000000000000000021041500472222400221670ustar00rootroot00000000000000/* 20140417 Jan Mojzis Public domain. */ #include #include "sshcrypto.h" /* grep "define sshcrypto_" source/tinyssh/sshcrypto.h | cut -d ' ' -f2 | while read x; do echo \#ifndef $x; echo error! ;echo \#endif; done */ #ifndef sshcrypto_kem_PUBLICKEYMAX error! #endif #ifndef sshcrypto_kem_CIPHERTEXTMAX error! #endif #ifndef sshcrypto_kem_MAX error! #endif #ifndef sshcrypto_hash_MAX error! #endif #ifndef sshcrypto_sign_PUBLICKEYMAX error! #endif #ifndef sshcrypto_sign_SECRETKEYMAX error! #endif #ifndef sshcrypto_sign_MAX error! #endif #ifndef sshcrypto_sign_BASE64PUBLICKEYMAX error! #endif #ifndef sshcrypto_sign_BASE64PUBLICKEYMIN error! #endif #ifndef sshcrypto_cipher_KEYMAX error! #endif int main(void) { /* check sshcrypto_init() called called more than once */ sshcrypto_init(); sshcrypto_init(); /* check sshcrypto_purge() called called more than once */ sshcrypto_purge(); sshcrypto_purge(); /* check sshcrypto_init() called called more than once after sshcrypto_purge() */ sshcrypto_init(); sshcrypto_init(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/sshtest.c000066400000000000000000000034501500472222400207330ustar00rootroot00000000000000/* 20140319 Jan Mojzis Public domain. */ #include #include #include #include "fail.h" #include "ssh.h" /* grep SSH_ * | sed 's/.*SSH_/SSH_/g' | cut -d ',' -f1 | cut -d ' ' -f1 | cut -d ')' -f1 | cut -d ':' -f1 | cut -d '"' -f1 | cut -d ';' -f1 | sort -u | grep -v 'SSH_TTY\|SSH_CONNECTION'| while read x; do echo \#ifndef $x; echo error! ;echo \#endif; done */ #ifndef SSH_MSG_CHANNEL_CLOSE error! #endif #ifndef SSH_MSG_CHANNEL_DATA error! #endif #ifndef SSH_MSG_CHANNEL_EOF error! #endif #ifndef SSH_MSG_CHANNEL_EXTENDED_DATA error! #endif #ifndef SSH_MSG_CHANNEL_OPEN error! #endif #ifndef SSH_MSG_CHANNEL_OPEN_CONFIRMATION error! #endif #ifndef SSH_MSG_CHANNEL_OPEN_FAILURE error! #endif #ifndef SSH_MSG_CHANNEL_REQUEST error! #endif #ifndef SSH_MSG_CHANNEL_SUCCESS error! #endif #ifndef SSH_MSG_CHANNEL_WINDOW_ADJUST error! #endif #ifndef SSH_MSG_DEBUG error! #endif #ifndef SSH_MSG_DISCONNECT error! #endif #ifndef SSH_MSG_IGNORE error! #endif #ifndef SSH_MSG_KEXDH_INIT error! #endif #ifndef SSH_MSG_KEXDH_REPLY error! #endif #ifndef SSH_MSG_KEXINIT error! #endif #ifndef SSH_MSG_NEWKEYS error! #endif #ifndef SSH_MSG_SERVICE_ACCEPT error! #endif #ifndef SSH_MSG_SERVICE_REQUEST error! #endif #ifndef SSH_MSG_UNIMPLEMENTED error! #endif #ifndef SSH_MSG_USERAUTH_FAILURE error! #endif #ifndef SSH_MSG_USERAUTH_PK_OK error! #endif #ifndef SSH_MSG_USERAUTH_REQUEST error! #endif #ifndef SSH_MSG_USERAUTH_SUCCESS error! #endif #ifndef SSH_OPEN_ADMINISTRATIVELY_PROHIBITED error! #endif int main(void) { if (strcmp(ssh_sigstr(SIGTERM), "TERM")) fail("failure") if (strcmp(ssh_sigstrlong(SIGTERM), "SIGTERM (termination)")) fail("failure") if (strcmp(ssh_sigstr(-1), "UNKNOWN")) fail("failure") if (strcmp(ssh_sigstrlong(-1), "UNKNOWN SIGNAL")) fail("failure") _exit(0); } tinyssh-20250501/old/tinyssh-tests/stringparsertest.c000066400000000000000000000040361500472222400226620ustar00rootroot00000000000000/* 20140204 Jan Mojzis Public domain. */ #include #include #include "fail.h" #include "str.h" #include "byte.h" #include "stringparser.h" static struct vectors { const char *buf; } testvectors[] = { { "aaa,bb,c" }, { ",aaa,bb,c" }, { "aaa,bb,c," }, { "aaa,,,,bb,,,,c" }, { ",,,aaa,,,,bb,,,,c" }, { ",,,aaa,,,,bb,,,,c,,," }, { "aaa,bb,,c," }, { 0 } }; static void stringstringparser_test1(void) { unsigned char *buf; long long i, pos = 0; const unsigned char *x; long long xlen, len; for (i = 0; testvectors[i].buf; ++i) { buf = (unsigned char *)testvectors[i].buf; len = str_len(testvectors[i].buf); pos = 0; pos = stringparser(buf, len, pos, &x, &xlen); if (!pos) fail("parsing error"); if (xlen != 3) fail("parsing error"); if (!byte_isequal(x, xlen, "aaa")) fail("parsing error"); pos = stringparser(buf, len, pos, &x, &xlen); if (!pos) fail("parsing error"); if (xlen != 2) fail("parsing error"); if (!byte_isequal(x, xlen, "bb")) fail("parsing error"); pos = stringparser(buf, len, pos, &x, &xlen); if (!pos) fail("parsing error"); if (xlen != 1) fail("parsing error"); if (!byte_isequal(x, xlen, "c")) fail("parsing error"); if (stringparser(buf, len, pos, &x, &xlen)) fail("overflow"); } } static void stringstringparser_test2(void) { unsigned char *buf; long long pos = 0; const unsigned char *x; long long xlen, len; buf = (unsigned char *)""; len = str_len((char *)buf); pos = 0; if (stringparser(buf, len, pos, &x, &xlen)) fail("overflow"); buf = (unsigned char *)","; len = str_len((char *)buf); pos = 0; if (stringparser(buf, len, pos, &x, &xlen)) fail("overflow"); buf = (unsigned char *)",,,,,,,,"; len = str_len((char *)buf); pos = 0; if (stringparser(buf, len, pos, &x, &xlen)) fail("overflow"); } int main(void) { stringstringparser_test1(); stringstringparser_test2(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/strtest.c000066400000000000000000000056351500472222400207550ustar00rootroot00000000000000/* 20130610 Jan Mojzis Public domain. */ #include #include #include #include "fail.h" #include "str.h" static void test_len(void) { if (str_len("") != 0) fail("str_len return's bad length"); if (str_len("\0ahoj") != 0) fail("str_len return's bad length"); if (str_len("a\0hoj") != 1) fail("str_len return's bad length"); if (str_len("ahoj\0") != 4) fail("str_len return's bad length"); if (str_len("ahoj") != 4) fail("str_len return's bad length"); } static void test_start(void) { if (!str_start("","")) fail("str_start failure"); if (!str_start("x","")) fail("str_start failure"); if (str_start("","x")) fail("str_start failure"); if (!str_start("ahojx","ahoj")) fail("str_start failure"); if (str_start("ahoj","ahojx")) fail("str_start failure"); } static void test_equal(void) { #ifdef TODO /* equal */ if (!str_equal("","")) fail("str_equal failure"); if (!str_equal("\0","\0")) fail("str_equal failure"); if (!str_equal("","\0")) fail("str_equal failure"); if (!str_equal("\0","")) fail("str_equal failure"); if (!str_equal("ahoj","ahoj")) fail("str_equal failure"); if (!str_equal("ahoj","ahoj\0")) fail("str_equal failure"); if (!str_equal("ahoj\0","ahoj")) fail("str_equal failure"); /* not equal */ if (str_equal("x","")) fail("str_equal failure"); if (str_equal("","x")) fail("str_equal failure"); if (str_equal("xx","x")) fail("str_equal failure"); if (str_equal("x","xx")) fail("str_equal failure"); if (str_equal("ahojx","ahoj")) fail("str_equal failure"); if (str_equal("ahoj","ahojx")) fail("str_equal failure"); #endif } static void test_equaln(void) { char buf[5]; /* not equal */ if (str_equaln(buf, 0, "a")) fail("str_equaln failure"); if (str_equaln("ahoj", 4, "aho")) fail("str_equaln failure"); if (str_equaln("ahoj", 4, "ahoj!")) fail("str_equaln failure"); if (str_equaln("ahoj", 4, "ahox")) fail("str_equaln failure"); /* equal */ if (!str_equaln(buf, 0, "")) fail("str_equaln failure"); if (strncmp(buf, "", 0)) fail("strncmp failure"); if (!str_equaln("ahoj", 4, "ahoj")) fail("str_equaln failure"); if (strncmp("ahoj", "ahoj", 4)) fail("strncmp failure"); } static void test_copyn(void) { char buf[5]; /* bad */ if (str_copyn(buf, 0, "")) fail("str_copyn failure"); if (str_copyn(buf, 1, "a")) fail("str_copyn failure"); if (str_copyn(buf, sizeof buf, "ahoj!")) fail("str_copyn failure"); if (strcmp(buf, "ahoj")) fail("str_copyn failure"); /* ok */ if (!str_copyn(buf, sizeof buf, "ahoj")) fail("str_copyn failure"); if (strcmp(buf, "ahoj")) fail("str_copyn failure"); if (!str_copyn(buf, sizeof buf, "")) fail("str_copyn failure"); if (strcmp(buf, "")) fail("str_copyn failure"); } int main(void) { test_len(); test_start(); test_equal(); test_equaln(); test_copyn(); _exit(0); } tinyssh-20250501/old/tinyssh-tests/subprocess_authtest.c000066400000000000000000000447011500472222400233530ustar00rootroot00000000000000/* 20140321 Jan Mojzis Public domain. */ #include #include #include #include #include #include "fail.h" #include "dropuidgid.h" #include "savesync.h" #include "open.h" #include "global.h" #include "byte.h" #include "str.h" #include "log.h" #include "subprocess.h" static int readall(int fd, unsigned char *x, long long xlen) { long long r; long long len = 0; while (xlen > 0) { r = read(fd, x, xlen); if (r == 0) break; if (r <= 0) return -1; x += r; len += r; xlen -= r; } return len; } static unsigned char logbuf[1024]; static char globalpath[4096]; static long long globalpathlen; static void run(void (*op)(void), const char *exp) { pid_t pid; int status, fromchild[2]; long long r, i; if (pipe(fromchild) == -1) fail("pipe() failure"); pid = fork(); if (pid == -1) fail("fork() failure"); if (pid == 0) { close(fromchild[0]); if (dup2(fromchild[1], 2) == -1) _exit(111); op(); _exit(0); } close(fromchild[1]); r = readall(fromchild[0], logbuf, sizeof logbuf); if (r == -1) fail("read() failure"); for (i = 0; i < r; ++i) if (logbuf[i] == '\n') break; r = i; for (i = 0; i < r; ++i) if (logbuf[i] == '/') break; r -= i; byte_copy(logbuf, r, logbuf + i); /* fprintf(stderr, "xxx: %s\n", logbuf); fflush(stderr); */ if (r < globalpathlen + 1) fail("log error"); if (!byte_isequal(globalpath, globalpathlen, logbuf)) fail("log error"); r -= globalpathlen + 1; byte_copy(logbuf, r, logbuf + globalpathlen + 1); for (i = 0; i < r; ++i) if (logbuf[i] == '{') break; r = i; logbuf[r] = 0; while (waitpid(pid, &status, 0) != pid) {}; if (!WIFEXITED(status)) fail("process killed"); if (WEXITSTATUS(status)) fail("process exited with status != 0"); i = str_len(exp); if (r != i) fail("failed"); if (!byte_isequal(logbuf, i, exp)) fail("failed"); } static int run2(void (*op)(void)) { pid_t pid; int status; pid = fork(); if (pid == -1) return -1; if (pid == 0) { close(2); op(); _exit(0); } while (waitpid(pid, &status, 0) != pid) {}; if (!WIFEXITED(status)) return -1; return WEXITSTATUS(status); } static void test_usernotexist(void) { const char *account = "21ecdfcc00506bc138d004a0c04139442e24b02ac456bf05601f1e8f645baa2"; const char *keyname = "ssh-ed25519"; const char *key = "key1"; if (subprocess_auth(account, keyname, key) == 0) fail("subprocess_auth() failure"); } static void test_usertoolong(void) { const char *account = "21ecdfcc00506bc138d004a0c04139442e24b02ac456bf05601f1e8f645baa25"; const char *keyname = "ssh-ed25519"; const char *key = "key1"; if (subprocess_auth(account, keyname, key) == 0) fail("subprocess_auth() failure"); } static void test_keytooshort(void) { const char *account = "21ecdfcc00506bc138d004a0c04139442e24b02ac456bf05601f1e8f645baa2"; const char *keyname = "ssh-ed25519"; const char *key = "AAAAC3NzaC1lZDI1NTE5AAAAICj44ZR+OCpjuLbOwqys2MKHroSvAWGgEE1o7yq+UVe"; if (subprocess_auth(account, keyname, key) == 0) fail("subprocess_auth() failure"); } static struct passwd *pw; static void droproot(void) { uid_t uid; uid = geteuid(); if (uid == 0) { pw = getpwnam("nobody"); if (!pw) fail("getpwnam() failure") if (!dropuidgid(pw->pw_name, pw->pw_uid, pw->pw_gid)) fail("dropuidgid() failure"); } else { pw = getpwuid(uid); if (!pw) fail("getpwuid() failure") } if (geteuid() == 0) fail("dropuidgid() failure"); } static void test_root(void) { const char *account = "root"; const char *keyname = "ssh-ed25519"; const char *key = "key1"; if (subprocess_auth(account, keyname, key) == 0) fail("subprocess_auth() failure"); } #define path global_bspace2 /* reusing global buffer */ #define buf global_bspace1 /* reusing global buffer */ static void test_path_authorizedkeys_ne(void) { umask(000); if (mkdir("d1", 0755) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_authorizedkeys_fifo(void) { umask(000); if (mkdir("d1", 0755) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (mkfifo("authorized_keys", 0644) == -1) fail("mkfifo() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_authorizedkeys_perm1(void) { umask(000); if (mkdir("d1", 0755) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (savesync("authorized_keys", "", 0) == -1) fail("savesync() failure"); if (chmod("authorized_keys", 0777) == -1) fail("chmod() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_authorizedkeys_perm2(void) { umask(000); if (mkdir("d1", 0755) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (savesync("authorized_keys", "", 0) == -1) fail("savesync() failure"); if (chmod("authorized_keys", 0775) == -1) fail("chmod() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_authorizedkeys_perm3(void) { umask(000); if (mkdir("d1", 0755) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (savesync("authorized_keys", "", 0) == -1) fail("savesync() failure"); if (chmod("authorized_keys", 0757) == -1) fail("chmod() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_dir_perm1(void) { umask(000); if (mkdir("d1", 0775) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (savesync("authorized_keys", "", 0) == -1) fail("savesync() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_dir_perm2(void) { umask(000); if (mkdir("d1", 0777) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (savesync("authorized_keys", "", 0) == -1) fail("savesync() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_dir_perm3(void) { umask(000); if (mkdir("d1", 0757) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (savesync("authorized_keys", "", 0) == -1) fail("savesync() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_dir2_perm1(void) { umask(000); if (mkdir("d1", 0777) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (mkdir("d2", 0777) == -1) fail("mkdir() failure"); if (chdir("d2") == -1) fail("chdir() failure"); if (savesync("authorized_keys", "", 0) == -1) fail("savesync() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d2") == -1) fail("rmdir() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_dir2_perm2(void) { umask(000); if (mkdir("d1", 0777) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (mkdir("d2", 0775) == -1) fail("mkdir() failure"); if (chdir("d2") == -1) fail("chdir() failure"); if (savesync("authorized_keys", "", 0) == -1) fail("savesync() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d2") == -1) fail("rmdir() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_dir2_perm3(void) { umask(000); if (mkdir("d1", 0777) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (mkdir("d2", 0757) == -1) fail("mkdir() failure"); if (chdir("d2") == -1) fail("chdir() failure"); if (savesync("authorized_keys", "", 0) == -1) fail("savesync() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d2") == -1) fail("rmdir() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_dir3_perm1(void) { umask(000); if (mkdir("d1", 0777) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (mkdir("d2", 0755) == -1) fail("mkdir() failure"); if (chdir("d2") == -1) fail("chdir() failure"); if (savesync("authorized_keys", "", 0) == -1) fail("savesync() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d2") == -1) fail("rmdir() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_dir3_perm2(void) { umask(000); if (mkdir("d1", 0775) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (mkdir("d2", 0755) == -1) fail("mkdir() failure"); if (chdir("d2") == -1) fail("chdir() failure"); if (savesync("authorized_keys", "", 0) == -1) fail("savesync() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d2") == -1) fail("rmdir() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_dir3_perm3(void) { umask(000); if (mkdir("d1", 0757) == -1) fail("mkdir() failure"); if (chdir("d1") == -1) fail("chdir() failure"); if (mkdir("d2", 0755) == -1) fail("mkdir() failure"); if (chdir("d2") == -1) fail("chdir() failure"); if (savesync("authorized_keys", "", 0) == -1) fail("savesync() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d2") == -1) fail("rmdir() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_path_dir_symlink(void) { umask(000); if (mkdir("d1", 0775) == -1) fail("mkdir() failure"); if (symlink("d1", "d2") == -1) fail("symlink() failure"); if (chdir("d2") == -1) fail("chdir() failure"); if (savesync("authorized_keys", "", 0) == -1) fail("savesync() failure"); if (subprocess_auth_checkpath_((char *)path, sizeof path, geteuid())) fail("subprocess_auth_checkpath_() failure"); if (unlink("authorized_keys") == -1) fail("unlink() failure"); if (chdir("..") == -1) fail("chdir() failure"); if (unlink("d2") == -1) fail("rmdir() failure"); if (rmdir("d1") == -1) fail("rmdir() failure"); } static void test_authorizedkeys_ne(void) { const char *keyname = ""; const char *key = ""; if (!getcwd((char *)path, sizeof path)) fail("getcwd() failure"); if (subprocess_auth_authorizedkeys_((char *)keyname, (char *)key, (char *)path, (char *)buf, sizeof buf)) fail("subprocess_auth_authorizedkeys_() failure"); } #define AUTHORIZED_KEYS "\ \n\ \n\ ###\n\ \n\ \n\ \n\ \n\ ssh-rsa AAAAB3Nza...LiPk== user@example.net\n\ from=\"*.sales.example.net,!pc.sales.example.net\" ssh-rsa AAAAB2...19Q== john@example.net\n\ command=\"dump /home\",no-pty,no-port-forwarding ssh-dss AAAAC3...51R== example.net\n\ permitopen=\"192.0.2.1:80\",permitopen=\"192.0.2.2:25\" ssh-dss AAAAB5...21S==\n\ tunnel=\"0\",command=\"sh /etc/netstart tun0\" ssh-rsa AAAA...== jane@example.net\n\ ecdsa-sha2-nistp256 ecdsakey1 apache@apache\n\ \n\ \n\ ssh-ed25519 badkey1 note - extra ' ' before keyname\n\ ssh-ed25519 badkey2. note - '.' as separator\n\ ssh-ed255191 badkey3\n\ ssh-ed25519\tbadkey4\n\ ssh-ed25519 badkey5\n\ \n\ \n\ ssh-ed25519 key1\n\ ssh-ed25519 key2\r\n\ ssh-ed25519 key3 note - ' ' as separator\n\ ssh-ed25519 key4\0note - '\0' as separator\n\ ssh-ed25519 key5 note - last line" static void authorizedkeys(void) { if (savesync("authorized_keys", AUTHORIZED_KEYS, sizeof(AUTHORIZED_KEYS) - 1) == -1) fail("savesync() failure"); } static void test_authorizedkeys_ok(void) { const char *keyname, *key; if (!getcwd((char *)path, sizeof path)) fail("getcwd() failure"); keyname = "ssh-ed25519"; key = "key1"; if (!subprocess_auth_authorizedkeys_((char *)keyname, (char *)key, (char *)path, (char *)buf, sizeof buf)) fail("subprocess_auth_authorizedkeys_() failure"); keyname = "ssh-ed25519"; key = "key2"; if (!subprocess_auth_authorizedkeys_((char *)keyname, (char *)key, (char *)path, (char *)buf, sizeof buf)) fail("subprocess_auth_authorizedkeys_() failure"); keyname = "ssh-ed25519"; key = "key3"; if (!subprocess_auth_authorizedkeys_((char *)keyname, (char *)key, (char *)path, (char *)buf, sizeof buf)) fail("subprocess_auth_authorizedkeys_() failure"); keyname = "ssh-ed25519"; key = "key4"; if (!subprocess_auth_authorizedkeys_((char *)keyname, (char *)key, (char *)path, (char *)buf, sizeof buf)) fail("subprocess_auth_authorizedkeys_() failure"); keyname = "ssh-ed25519"; key = "key5"; if (!subprocess_auth_authorizedkeys_((char *)keyname, (char *)key, (char *)path, (char *)buf, sizeof buf)) fail("subprocess_auth_authorizedkeys_() failure"); } static void test_authorizedkeys_bad(void) { const char *keyname, *key; if (!getcwd((char *)path, sizeof path)) fail("getcwd() failure"); keyname = "ssh-ed25519"; key = "badkey1"; if (subprocess_auth_authorizedkeys_((char *)keyname, (char *)key, (char *)path, (char *)buf, sizeof buf)) fail("subprocess_auth_authorizedkeys_() failure"); keyname = "ssh-ed25519"; key = "badkey2"; if (subprocess_auth_authorizedkeys_((char *)keyname, (char *)key, (char *)path, (char *)buf, sizeof buf)) fail("subprocess_auth_authorizedkeys_() failure"); keyname = "ssh-ed25519"; key = "badkey3"; if (subprocess_auth_authorizedkeys_((char *)keyname, (char *)key, (char *)path, (char *)buf, sizeof buf)) fail("subprocess_auth_authorizedkeys_() failure"); keyname = "ssh-ed25519"; key = "badkey4"; if (subprocess_auth_authorizedkeys_((char *)keyname, (char *)key, (char *)path, (char *)buf, sizeof buf)) fail("subprocess_auth_authorizedkeys_() failure"); keyname = "ssh-ed25519"; key = "badkey5"; if (subprocess_auth_authorizedkeys_((char *)keyname, (char *)key, (char *)path, (char *)buf, sizeof buf)) fail("subprocess_auth_authorizedkeys_() failure"); } int main(void) { if (!getcwd(globalpath, sizeof globalpath)) fail("getcwd() failure"); globalpathlen = str_len(globalpath); log_init(2, "xxx", 1, 0); run(test_path_authorizedkeys_ne, "d1/authorized_keys (file does not exist)"); run(test_path_authorizedkeys_fifo, "d1/authorized_keys (access denied)"); run(test_path_authorizedkeys_perm1, "d1/authorized_keys (access denied)"); run(test_path_authorizedkeys_perm2, "d1/authorized_keys (access denied)"); run(test_path_authorizedkeys_perm3, "d1/authorized_keys (access denied)"); run(test_path_dir_perm1, "d1/ (access denied)"); run(test_path_dir_perm2, "d1/ (access denied)"); run(test_path_dir_perm3, "d1/ (access denied)"); run(test_path_dir2_perm1, "d1/d2/ (access denied)"); run(test_path_dir2_perm2, "d1/d2/ (access denied)"); run(test_path_dir2_perm3, "d1/d2/ (access denied)"); run(test_path_dir3_perm1, "d1/ (access denied)"); run(test_path_dir3_perm2, "d1/ (access denied)"); run(test_path_dir3_perm3, "d1/ (access denied)"); run(test_path_dir_symlink, "d1/ (access denied)"); log_init(-1, "xxx", 1, 0); test_authorizedkeys_ne(); authorizedkeys(); test_authorizedkeys_ok(); test_authorizedkeys_bad(); droproot(); run2(test_usernotexist); run2(test_usertoolong); run2(test_keytooshort); run2(test_root); _exit(0); } tinyssh-20250501/old/tinyssh-tests/subprocess_signtest.c000066400000000000000000000057021500472222400233500ustar00rootroot00000000000000/* 20140321 Jan Mojzis Public domain. */ #include #include #include #include "fail.h" #include "savesync.h" #include "sshcrypto.h" #include "open.h" #include "purge.h" #include "byte.h" #include "randommod.h" #include "crypto_uint32.h" #include "subprocess.h" unsigned char sh[sshcrypto_hash_MAX]; unsigned char sm[sshcrypto_sign_MAX + sshcrypto_hash_MAX]; unsigned char m[sshcrypto_sign_MAX + sshcrypto_hash_MAX]; unsigned long long mlen; unsigned char sk[sshcrypto_sign_SECRETKEYMAX]; const char *keydir = "./keydir"; static void create(const char *fn, const unsigned char *x, long long xlen) { if (savesync(fn, x, xlen) == -1) fail("unable to create test directory"); } int main(void) { long long i, j; int fd; fd = open_cwd(); if (fd == -1) fail("open_cwd() failure"); /* make keydir */ umask(022); if (mkdir(keydir, 0755) == -1) fail("unable to create test directory"); if (chdir(keydir) == -1) fail("unable to chdir to directory"); for (i = 0; sshcrypto_keys[i].name; ++i) { if (sshcrypto_keys[i].sign_keypair(sshcrypto_keys[i].sign_publickey, sk) != 0) fail("unable to generate key pair"); umask(022); create(sshcrypto_keys[i].sign_publickeyfilename, sshcrypto_keys[i].sign_publickey, sshcrypto_keys[i].sign_publickeybytes); umask(077); create(sshcrypto_keys[i].sign_secretkeyfilename, sk, sshcrypto_keys[i].sign_secretkeybytes); purge(sk, sizeof sk); } if (fchdir(fd) == -1) fail("fchdir() failure"); for (i = 0; sshcrypto_keys[i].name; ++i) { /* set globals */ sshcrypto_key_name = sshcrypto_keys[i].name; sshcrypto_sign = sshcrypto_keys[i].sign; sshcrypto_sign_publickey = sshcrypto_keys[i].sign_publickey; sshcrypto_sign_publickeybytes = sshcrypto_keys[i].sign_publickeybytes; sshcrypto_sign_secretkeybytes = sshcrypto_keys[i].sign_secretkeybytes; sshcrypto_sign_bytes = sshcrypto_keys[i].sign_bytes; sshcrypto_sign_secretkeyfilename = sshcrypto_keys[i].sign_secretkeyfilename; sshcrypto_hash_bytes = 64; for (j = 0; j < 100; ++j) { /* sign */ purge(sh, sizeof sh); if (subprocess_sign(sm, sshcrypto_sign_bytes, keydir, sh, sshcrypto_hash_bytes) != 0) fail("unable to sign"); byte_copy(sm + sshcrypto_sign_bytes, sshcrypto_hash_bytes, sh); /* verify */ if (sshcrypto_keys[i].sign_open(m, &mlen, sm, sshcrypto_hash_bytes + sshcrypto_sign_bytes, sshcrypto_keys[i].sign_publickey) != 0) fail("unable to open signed box"); #if 0 /* forgery */ sm[randommod(sshcrypto_sign_bytes + sshcrypto_hash_bytes)] += 1 + randommod(255); if (sshcrypto_keys[i].sign_open(m, &mlen, sm, sshcrypto_hash_bytes + sshcrypto_sign_bytes, sshcrypto_keys[i].sign_publickey) == 0) fail("forgery"); #endif } } _exit(0); } tinyssh-20250501/old/tinyssh-tests/trymlocktest.c000066400000000000000000000003231500472222400217760ustar00rootroot00000000000000/* 20140303 Jan Mojzis Public domain. */ #include #include "trymlock.h" unsigned char buf[100]; int main(void) { long long i; for (i = 81; i < 100; ++i) trymlock(buf, i); _exit(0); } tinyssh-20250501/old/tinyssh-tests/writealltest.c000066400000000000000000000014111500472222400217540ustar00rootroot00000000000000/* 20140417 Jan Mojzis Public domain. */ #include #include #include #include #include "fail.h" #include "open.h" #include "randombytes.h" #include "byte.h" #include "load.h" #include "writeall.h" #define SPACELEN 1048577 unsigned char space1[SPACELEN]; unsigned char space2[SPACELEN]; static void test1(void) { int fd; fd = open_write("writealltest.data"); if (fd == -1) fail("failure"); randombytes(space1, sizeof space1); if (writeall(fd, space1, sizeof space1) == -1) fail("failure"); close(fd); if (load("writealltest.data", space2, sizeof space2) == -1) fail("failure"); if (!byte_isequal(space1, SPACELEN, space2)) fail("failure"); } int main(void) { test1(); _exit(0); } tinyssh-20250501/old/tinyssh/000077500000000000000000000000001500472222400157305ustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/LIBS000066400000000000000000000015371500472222400164120ustar00rootroot00000000000000blocking.o buf.o byte.o channel.o channel_drop.o channel_fork.o channel_forkpty.o channel_subsystem.o coe.o connectioninfo.o die.o dropuidgid.o e.o env.o getln.o global.o iptostr.o load.o log.o loginshell.o logsys.o main_tinysshd.o main_tinysshd_makekey.o main_tinysshd_printkey.o newenv.o numtostr.o open.o packet.o packet_auth.o packet_channel_open.o packet_channel_recv.o packet_channel_request.o packet_channel_send.o packet_get.o packet_hello.o packet_kex.o packet_kexdh.o packet_put.o packet_recv.o packet_send.o packet_unimplemented.o packetparser.o porttostr.o randommod.o readall.o savesync.o ssh.o sshcrypto.o sshcrypto_cipher.o sshcrypto_cipher_chachapoly.o sshcrypto_kex.o sshcrypto_kex_curve25519.o sshcrypto_kex_sntrup761x25519.o sshcrypto_key.o sshcrypto_key_ed25519.o str.o stringparser.o subprocess_auth.o subprocess_sign.o trymlock.o writeall.o tinyssh-20250501/old/tinyssh/LINKS000066400000000000000000000000761500472222400165360ustar00rootroot00000000000000tinysshd tinysshd-makekey tinysshd tinysshd-printkey tinysshd tinyssh-20250501/old/tinyssh/SOURCES000066400000000000000000000014211500472222400167740ustar00rootroot00000000000000blocking buf byte channel channel_drop channel_fork channel_forkpty channel_subsystem coe connectioninfo die dropuidgid e env getln global iptostr load log loginshell logsys main_tinysshd main_tinysshd_makekey main_tinysshd_printkey newenv numtostr open packet packet_auth packet_channel_open packet_channel_recv packet_channel_request packet_channel_send packet_get packet_hello packet_kex packet_kexdh packet_put packet_recv packet_send packet_unimplemented packetparser porttostr randommod readall savesync ssh sshcrypto sshcrypto_cipher sshcrypto_cipher_chachapoly sshcrypto_kex sshcrypto_kex_curve25519 sshcrypto_kex_sntrup761x25519 sshcrypto_key sshcrypto_key_ed25519 str stringparser subprocess_auth subprocess_sign tinysshd tinysshd-makekey tinysshd-printkey trymlock writeall tinyssh-20250501/old/tinyssh/TARGETS000066400000000000000000000000751500472222400167660ustar00rootroot00000000000000tinysshd tinysshnoneauthd tinysshd-makekey tinysshd-printkey tinyssh-20250501/old/tinyssh/blocking.c000077700000000000000000000000001500472222400222412../../blocking.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/blocking.h000077700000000000000000000000001500472222400222532../../blocking.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/buf.c000077700000000000000000000000001500472222400202112../../buf.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/buf.h000077700000000000000000000000001500472222400202232../../buf.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/bug.h000077700000000000000000000000001500472222400202252../../bug.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/byte.c000077700000000000000000000000001500472222400205672../../byte.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/byte.h000077700000000000000000000000001500472222400206012../../byte.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/channel.c000077700000000000000000000000001500472222400217012../../channel.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/channel.h000077700000000000000000000000001500472222400217132../../channel.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/channel_drop.c000077700000000000000000000000001500472222400237512../../channel_drop.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/channel_fork.c000077700000000000000000000000001500472222400237432../../channel_fork.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/channel_forkpty.c000077700000000000000000000000001500472222400252352../../channel_forkpty.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/channel_subsystem.c000077700000000000000000000000001500472222400261352../../channel_subsystem.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/coe.c000077700000000000000000000000001500472222400201752../../coe.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/coe.h000077700000000000000000000000001500472222400202072../../coe.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/connectioninfo.c000077700000000000000000000000001500472222400247072../../connectioninfo.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/connectioninfo.h000077700000000000000000000000001500472222400247212../../connectioninfo.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/die.c000077700000000000000000000000001500472222400201632../../die.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/die.h000077700000000000000000000000001500472222400201752../../die.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/dropuidgid.c000077700000000000000000000000001500472222400231452../../dropuidgid.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/dropuidgid.h000077700000000000000000000000001500472222400231572../../dropuidgid.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/e.c000077700000000000000000000000001500472222400173312../../e.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/e.h000077700000000000000000000000001500472222400173432../../e.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/env.c000077700000000000000000000000001500472222400202412../../env.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/env.h000077700000000000000000000000001500472222400202532../../env.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/getln.c000077700000000000000000000000001500472222400211032../../getln.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/getln.h000077700000000000000000000000001500472222400211152../../getln.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/global.c000077700000000000000000000000001500472222400213612../../global.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/global.h000077700000000000000000000000001500472222400213732../../global.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/iptostr.c000077700000000000000000000000001500472222400220712../../iptostr.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/iptostr.h000077700000000000000000000000001500472222400221032../../iptostr.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/limit.h000077700000000000000000000000001500472222400211272../../limit.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/load.c000077700000000000000000000000001500472222400205172../../load.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/load.h000077700000000000000000000000001500472222400205312../../load.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/log.c000077700000000000000000000000001500472222400202232../../log.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/log.h000077700000000000000000000000001500472222400202352../../log.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/loginshell.c000077700000000000000000000000001500472222400231612../../loginshell.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/loginshell.h000077700000000000000000000000001500472222400231732../../loginshell.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/logsys.c000077700000000000000000000000001500472222400215212../../logsys.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/logsys.h000077700000000000000000000000001500472222400215332../../logsys.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/main.h000077700000000000000000000000001500472222400205432../../main.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/main_tinysshd.c000077700000000000000000000000001500472222400244032../../main_tinysshd.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/main_tinysshd_makekey.c000077700000000000000000000000001500472222400276172../../main_tinysshd_makekey.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/main_tinysshd_printkey.c000077700000000000000000000000001500472222400302552../../main_tinysshd_printkey.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/newenv.c000077700000000000000000000000001500472222400214652../../newenv.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/newenv.h000077700000000000000000000000001500472222400214772../../newenv.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/numtostr.c000077700000000000000000000000001500472222400224472../../numtostr.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/numtostr.h000077700000000000000000000000001500472222400224612../../numtostr.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/open.c000077700000000000000000000000001500472222400205632../../open.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/open.h000077700000000000000000000000001500472222400205752../../open.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet.c000077700000000000000000000000001500472222400213772../../packet.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet.h000077700000000000000000000000001500472222400214112../../packet.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet_auth.c000077700000000000000000000000001500472222400234412../../packet_auth.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet_channel_open.c000077700000000000000000000000001500472222400266212../../packet_channel_open.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet_channel_recv.c000077700000000000000000000000001500472222400266152../../packet_channel_recv.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet_channel_request.c000077700000000000000000000000001500472222400300772../../packet_channel_request.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet_channel_send.c000077700000000000000000000000001500472222400266012../../packet_channel_send.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet_get.c000077700000000000000000000000001500472222400230752../../packet_get.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet_hello.c000077700000000000000000000000001500472222400237452../../packet_hello.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet_kex.c000077700000000000000000000000001500472222400231152../../packet_kex.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet_kexdh.c000077700000000000000000000000001500472222400237452../../packet_kexdh.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet_put.c000077700000000000000000000000001500472222400231572../../packet_put.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet_recv.c000077700000000000000000000000001500472222400234352../../packet_recv.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet_send.c000077700000000000000000000000001500472222400234212../../packet_send.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packet_unimplemented.c000077700000000000000000000000001500472222400272532../../packet_unimplemented.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packetparser.c000077700000000000000000000000001500472222400240312../../packetparser.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/packetparser.h000077700000000000000000000000001500472222400240432../../packetparser.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/porttostr.c000077700000000000000000000000001500472222400230212../../porttostr.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/porttostr.h000077700000000000000000000000001500472222400230332../../porttostr.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/purge.h000077700000000000000000000000001500472222400211372../../purge.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/randommod.c000077700000000000000000000000001500472222400226212../../randommod.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/randommod.h000077700000000000000000000000001500472222400226332../../randommod.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/readall.c000077700000000000000000000000001500472222400216712../../readall.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/readall.h000077700000000000000000000000001500472222400217032../../readall.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/savesync.c000077700000000000000000000000001500472222400223472../../savesync.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/savesync.h000077700000000000000000000000001500472222400223612../../savesync.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/ssh.c000077700000000000000000000000001500472222400202532../../ssh.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/ssh.h000077700000000000000000000000001500472222400202652../../ssh.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/sshcrypto.c000077700000000000000000000000001500472222400227552../../sshcrypto.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/sshcrypto.h000077700000000000000000000000001500472222400227672../../sshcrypto.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/sshcrypto_cipher.c000077700000000000000000000000001500472222400256412../../sshcrypto_cipher.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/sshcrypto_cipher_chachapoly.c000077700000000000000000000000001500472222400322272../../sshcrypto_cipher_chachapoly.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/sshcrypto_kex.c000077700000000000000000000000001500472222400244732../../sshcrypto_kex.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/sshcrypto_kex_curve25519.c000077700000000000000000000000001500472222400301172../../sshcrypto_kex_curve25519.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/sshcrypto_kex_sntrup761x25519.c000077700000000000000000000000001500472222400316112../../sshcrypto_kex_sntrup761x25519.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/sshcrypto_key.c000077700000000000000000000000001500472222400244752../../sshcrypto_key.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/sshcrypto_key_ed25519.c000077700000000000000000000000001500472222400266312../../sshcrypto_key_ed25519.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/str.c000077700000000000000000000000001500472222400203012../../str.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/str.h000077700000000000000000000000001500472222400203132../../str.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/stringparser.c000077700000000000000000000000001500472222400241272../../stringparser.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/stringparser.h000077700000000000000000000000001500472222400241412../../stringparser.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/subprocess.h000077700000000000000000000000001500472222400232532../../subprocess.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/subprocess_auth.c000077700000000000000000000000001500472222400253032../../subprocess_auth.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/subprocess_sign.c000077700000000000000000000000001500472222400253012../../subprocess_sign.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/tinysshd-makekey.c000077700000000000000000000000001500472222400240172../../tinysshd.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/tinysshd-makekey.exp000077700000000000000000000000001500472222400273442../../test-tinysshd-makekey.expustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/tinysshd-makekey.rts000077700000000000000000000000001500472222400271762../../test-tinysshd-makekey.shustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/tinysshd-printkey.c000077700000000000000000000000001500472222400242362../../tinysshd.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/tinysshd-printkey.exp000077700000000000000000000000001500472222400300022../../test-tinysshd-printkey.expustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/tinysshd-printkey.rts000077700000000000000000000000001500472222400276342../../test-tinysshd-printkey.shustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/tinysshd.c000077700000000000000000000000001500472222400223732../../tinysshd.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/tinysshd.exp000077700000000000000000000000001500472222400242742../../test-tinysshd.expustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/tinysshd.rts000077700000000000000000000000001500472222400241262../../test-tinysshd.shustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/tinysshnoneauthd.c000077700000000000000000000000001500472222400241352../../tinysshd.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/tinysshnoneauthd.exp000077700000000000000000000000001500472222400276002../../test-tinysshnoneauthd.expustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/tinysshnoneauthd.rts000077700000000000000000000000001500472222400274322../../test-tinysshnoneauthd.shustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/trymlock.c000077700000000000000000000000001500472222400223712../../trymlock.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/trymlock.h000077700000000000000000000000001500472222400224032../../trymlock.hustar00rootroot00000000000000tinyssh-20250501/old/tinyssh/writeall.c000077700000000000000000000000001500472222400223272../../writeall.custar00rootroot00000000000000tinyssh-20250501/old/tinyssh/writeall.h000077700000000000000000000000001500472222400223412../../writeall.hustar00rootroot00000000000000tinyssh-20250501/old/tools000077700000000000000000000000001500472222400166032../toolsustar00rootroot00000000000000tinyssh-20250501/open.c000066400000000000000000000017751500472222400145700ustar00rootroot00000000000000/* taken from nacl-20110221, from curvecp/open_cwd.c curvecp/open_pipe.c curvecp/open_read.c curvecp/open_write.c - reformated using clang-format */ #include #include #include #include #include "blocking.h" #include "open.h" int open_cwd(void) { return open_read("."); } int open_pipe(int *fd) { int i; if (pipe(fd) == -1) return -1; for (i = 0; i < 2; ++i) { fcntl(fd[i], F_SETFD, 1); blocking_disable(fd[i]); } return 0; } int open_read(const char *fn) { #ifdef O_CLOEXEC return open(fn, O_RDONLY | O_NONBLOCK | O_CLOEXEC); #else int fd = open(fn, O_RDONLY | O_NONBLOCK); if (fd == -1) return -1; fcntl(fd, F_SETFD, 1); return fd; #endif } int open_write(const char *fn) { #ifdef O_CLOEXEC return open(fn, O_CREAT | O_WRONLY | O_NONBLOCK | O_CLOEXEC, 0644); #else int fd = open(fn, O_CREAT | O_WRONLY | O_NONBLOCK, 0644); if (fd == -1) return -1; fcntl(fd, F_SETFD, 1); return fd; #endif } tinyssh-20250501/open.h000066400000000000000000000003241500472222400145620ustar00rootroot00000000000000#ifndef OPEN_H____ #define OPEN_H____ extern int open_read(const char *); extern int open_write(const char *); extern int open_lock(const char *); extern int open_cwd(void); extern int open_pipe(int *); #endif tinyssh-20250501/packet.c000066400000000000000000000023551500472222400150710ustar00rootroot00000000000000/* 20140222 20241210 - reformated using clang-format Jan Mojzis Public domain. */ #include "purge.h" #include "trymlock.h" #include "packet.h" struct packet packet = {0}; void packet_purge(void) { purge(&packet, sizeof packet); trymunlock(&packet, sizeof packet); } void packet_init(void) { trymlock(&packet, sizeof packet); purge(&packet, sizeof packet); packet.flagkeys = 0; packet.flagauthorized = 0; packet.flagrekeying = 0; packet.flagclosesent = 0; packet.flageofsent = 0; packet.flagchanneleofreceived = 0; packet.sendpacketid = 0; packet.receivepacketid = 0; packet.packet_length = 0; buf_init(&packet.hellosend, packet.hellosendspace, sizeof packet.hellosendspace); buf_init(&packet.helloreceive, packet.helloreceivespace, sizeof packet.helloreceivespace); buf_init(&packet.kexsend, packet.kexsendspace, sizeof packet.kexsendspace); buf_init(&packet.kexrecv, packet.kexrecvspace, sizeof packet.kexrecvspace); buf_init(&packet.hashbuf, packet.hashbufspace, sizeof packet.hashbufspace); buf_init(&packet.sendbuf, packet.sendbufspace, sizeof packet.sendbufspace); buf_init(&packet.recvbuf, packet.recvbufspace, sizeof packet.recvbufspace); } tinyssh-20250501/packet.h000066400000000000000000000067131500472222400151000ustar00rootroot00000000000000/* 20140108 Jan Mojzis Public domain. */ #ifndef PACKET_H____ #define PACKET_H____ #include "buf.h" #include "crypto_uint32.h" #include "crypto_uint8.h" #include "sshcrypto.h" #include "limit.h" #include "channel.h" #define PACKET_UNAUTHENTICATED_MESSAGES 30 #define PACKET_LIMIT 32768 #define PACKET_FULLLIMIT 35000 #define PACKET_RECVLIMIT 131072 #define PACKET_ZEROBYTES 64 struct packet { /* flags */ int flagkeys; int flagauthorized; int flagrekeying; /* channel */ int flageofsent; int flagclosesent; int flagchanneleofreceived; /* packet id */ crypto_uint32 sendpacketid; crypto_uint32 receivepacketid; /* keys */ unsigned char serverkey[sshcrypto_cipher_KEYMAX]; unsigned char clientkey[sshcrypto_cipher_KEYMAX]; unsigned char servermackey[sshcrypto_cipher_KEYMAX]; unsigned char clientmackey[sshcrypto_cipher_KEYMAX]; unsigned char servernonce[sshcrypto_cipher_KEYMAX]; unsigned char clientnonce[sshcrypto_cipher_KEYMAX]; unsigned char sessionid[sshcrypto_hash_MAX]; char name[LOGIN_NAME_MAX + 1]; crypto_uint8 kex_packet_follows; crypto_uint8 kex_guess; /* buffers */ unsigned char hellosendspace[256]; unsigned char helloreceivespace[256]; unsigned char kexsendspace[1024]; unsigned char kexrecvspace[65536]; unsigned char hashbufspace[65536]; struct buf hellosend; struct buf helloreceive; struct buf kexsend; struct buf kexrecv; struct buf hashbuf; /* send/recv */ unsigned char recvbufspace[4 * PACKET_FULLLIMIT + 1 + PACKET_ZEROBYTES]; unsigned char sendbufspace[4 * PACKET_FULLLIMIT + 1]; struct buf recvbuf; struct buf sendbuf; crypto_uint32 packet_length; }; /* packet.c */ extern struct packet packet; extern void packet_purge(void); extern void packet_init(void); /* packet_send.c */ extern int packet_sendisready(void); extern int packet_send(void); extern int packet_sendall(void); /* packet_recv.c */ extern int packet_recvisready(void); extern int packet_recv(void); /* packet_get.c */ extern int packet_get(struct buf *, crypto_uint8); extern int packet_getall(struct buf *, crypto_uint8); /* packet_put.c */ extern void packet_put(struct buf *); extern int packet_putisready(void); /* packet_hello.c */ extern int packet_hello_send(void); extern int packet_hello_receive(void); /* packet_kex.c */ extern int packet_kex_send(void); extern int packet_kex_receive(void); /* packet_kexdh.c */ extern int packet_kexdh(const char *, struct buf *, struct buf *); /* packet_auth.c */ extern int packet_auth(struct buf *, struct buf *, int); /* packet_channel_open.c */ extern int packet_channel_open(struct buf *, struct buf *); /* packet_channel_request.c */ extern int packet_channel_request(struct buf *, struct buf *, const char *); /* packet_channel_recv.c */ extern int packet_channel_recv_data(struct buf *); extern int packet_channel_recv_extendeddata(struct buf *); extern int packet_channel_recv_windowadjust(struct buf *); extern int packet_channel_recv_eof(struct buf *); extern int packet_channel_recv_close(struct buf *); /* packet_channel_send.c */ extern void packet_channel_send_data(struct buf *); extern void packet_channel_send_extendeddata(struct buf *); extern int packet_channel_send_windowadjust(struct buf *); extern void packet_channel_send_eof(struct buf *); extern int packet_channel_send_close(struct buf *, int, int); /* packet_unimplemented.c */ extern int packet_unimplemented(struct buf *); #endif tinyssh-20250501/packet_auth.c000066400000000000000000000172371500472222400161170ustar00rootroot00000000000000/* 20140110 20241212 - reformated using clang-format Jan Mojzis Public domain. */ #include #include "buf.h" #include "ssh.h" #include "e.h" #include "str.h" #include "packetparser.h" #include "subprocess.h" #include "sshcrypto.h" #include "bug.h" #include "purge.h" #include "log.h" #include "packet.h" int packet_auth(struct buf *b, struct buf *b2, int flagnoneauth) { crypto_uint8 ch, flagsignature; long long pos, i, count, sign_bytes = 0; crypto_uint32 len; const char *pkname; int (*sign_open)(unsigned char *, unsigned long long *, const unsigned char *, unsigned long long, const unsigned char *) = 0; int (*parsesignpk)(unsigned char *, const unsigned char *, long long) = 0; int (*parsesignature)(unsigned char *, const unsigned char *, long long) = 0; void (*putsignpk)(struct buf *, const unsigned char *) = 0; void (*putsignpkbase64)(struct buf *, const unsigned char *) = 0; unsigned char pk[sshcrypto_sign_PUBLICKEYMAX]; unsigned char sig[sshcrypto_sign_MAX]; unsigned long long smlen; buf_purge(b); /* parse "ssh-userauth" */ pos = 0; if (!packet_getall(b, SSH_MSG_SERVICE_REQUEST)) return 0; pos = packetparser_uint8(b->buf, b->len, pos, &ch); /* SSH_MSG_SERVICE_REQUEST */ if (ch != SSH_MSG_SERVICE_REQUEST) bug_proto(); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* "ssh-userauth" */ pos = packetparser_skip(b->buf, b->len, pos, len); if (!str_equaln((char *) b->buf + pos - len, len, "ssh-userauth")) bug_proto(); pos = packetparser_end(b->buf, b->len, pos); /* send service accept */ b->buf[0] = SSH_MSG_SERVICE_ACCEPT; packet_put(b); if (!packet_sendall()) return 0; for (count = 0; count < 32; ++count) { /* receive userauth request */ pkname = "unknown"; pos = 0; buf_purge(b); if (!packet_getall(b, SSH_MSG_USERAUTH_REQUEST)) return 0; pos = packetparser_uint8(b->buf, b->len, pos, &ch); /* SSH_MSG_USERAUTH_REQUEST */ if (ch != SSH_MSG_USERAUTH_REQUEST) bug_proto(); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* name */ if (len >= sizeof packet.name) bug_proto(); pos = packetparser_copy(b->buf, b->len, pos, (unsigned char *) packet.name, len); packet.name[len] = 0; pos = packetparser_uint32(b->buf, b->len, pos, &len); /* "ssh-connection" */ pos = packetparser_skip(b->buf, b->len, pos, len); if (!str_equaln((char *) b->buf + pos - len, len, "ssh-connection")) bug_proto(); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* publickey/password/hostbased/none */ pos = packetparser_skip(b->buf, b->len, pos, len); if (str_equaln((char *) b->buf + pos - len, len, "none")) { /* if auth. none is enabled get the user from UID */ if (flagnoneauth) { struct passwd *pw; pkname = "none"; pw = getpwuid(geteuid()); if (!pw) bug(); str_copyn(packet.name, sizeof packet.name, pw->pw_name); b->len = 0; b->buf[0] = 0; goto authorized; } } if (str_equaln((char *) b->buf + pos - len, len, "password")) pkname = "password"; if (str_equaln((char *) b->buf + pos - len, len, "hostbased")) pkname = "hostbased"; if (str_equaln((char *) b->buf + pos - len, len, "publickey")) { pos = packetparser_uint8(b->buf, b->len, pos, &flagsignature); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* public key algorithm name */ pos = packetparser_skip(b->buf, b->len, pos, len); if (b->buf[pos] != 0) bug_proto(); pkname = (char *) b->buf + pos - len; /* XXX */ sign_open = 0; parsesignpk = 0; putsignpk = 0; putsignpkbase64 = 0; parsesignature = 0; sign_bytes = 0; for (i = 0; sshcrypto_keys[i].name; ++i) { if (!sshcrypto_keys[i].sign_flagclient) continue; if (!str_equaln(pkname, len, sshcrypto_keys[i].name)) continue; pkname = sshcrypto_keys[i].name; sign_open = sshcrypto_keys[i].sign_open; parsesignature = sshcrypto_keys[i].parsesignature; parsesignpk = sshcrypto_keys[i].parsesignpk; putsignpk = sshcrypto_keys[i].buf_putsignpk; putsignpkbase64 = sshcrypto_keys[i].buf_putsignpkbase64; sign_bytes = sshcrypto_keys[i].sign_bytes; break; } if (sign_open && parsesignpk && putsignpk && putsignpkbase64 && parsesignature) { pos = packetparser_uint32(b->buf, b->len, pos, &len); /* public key blob */ pos = packetparser_skip(b->buf, b->len, pos, len); if (!parsesignpk(pk, b->buf + pos - len, len)) bug_proto(); if (!flagsignature) { /* 'publickey' ... without signature */ buf_purge(b); buf_putnum8(b, SSH_MSG_USERAUTH_PK_OK); buf_putstring(b, pkname); putsignpk(b, pk); packet_put(b); if (!packet_sendall()) return 0; continue; } /* 'publickey' ... with signature */ pos = packetparser_uint32(b->buf, b->len, pos, &len); /* signature blob */ pos = packetparser_skip(b->buf, b->len, pos, len); if (!parsesignature(sig, b->buf + pos - len, len)) bug_proto(); pos = packetparser_end(b->buf, b->len, pos); purge(b->buf + b->len - len - 4, len + 4); b->len -= len + 4; /* authenticate user - verify signature */ buf_purge(b2); buf_put(b2, sig, sign_bytes); buf_putstringlen(b2, packet.sessionid, sshcrypto_hash_bytes); buf_put(b2, b->buf, b->len); buf_purge(b); if (b->alloc <= b2->len) bug_nomem(); if (sign_open(b->buf, &smlen, b2->buf, b2->len, pk) != 0) { errno = EAUTH; bug(); } b->len = smlen; buf_purge(b); /* authorize user - using authorized_keys */ buf_purge(b); putsignpkbase64(b, pk); buf_putnum8(b, 0); if (subprocess_auth(packet.name, pkname, (char *) b->buf) == 0) goto authorized; } } /* reject */ log_d5("auth: ", packet.name, ": ", pkname, " rejected"); buf_purge(b); buf_putnum8(b, SSH_MSG_USERAUTH_FAILURE); buf_putstring(b, "publickey"); buf_putnum8(b, 0); packet_put(b); if (!packet_sendall()) return 0; } log_w1("auth: too many authentication tries"); return 0; authorized: /* authenticated + authorized */ log_i7("auth: ", packet.name, ": ", pkname, " ", (char *) b->buf, " accepted"); buf_purge(b); buf_putnum8(b, SSH_MSG_USERAUTH_SUCCESS); packet_put(b); if (!packet_sendall()) return 0; purge(pk, sizeof pk); purge(sig, sizeof sig); return 1; } tinyssh-20250501/packet_channel_open.c000066400000000000000000000064361500472222400176060ustar00rootroot00000000000000/* 20140120 Jan Mojzis Public domain. */ #include "buf.h" #include "ssh.h" #include "e.h" #include "bug.h" #include "packetparser.h" #include "str.h" #include "packet.h" int packet_channel_open(struct buf *b1, struct buf *b2) { crypto_uint32 id, remotewindow, localwindow, maxpacket, chanlen; long long pos = 0; crypto_uint8 ch; char *chan = (char *) b1->buf + pos; /* parse packet */ pos = packetparser_uint8(b1->buf, b1->len, pos, &ch); /* byte SSH_MSG_CHANNEL_OPEN */ if (ch != SSH_MSG_CHANNEL_OPEN) bug_proto(); pos = packetparser_uint32( b1->buf, b1->len, pos, &chanlen); /* string channel type in US-ASCII only */ chan = (char *) b1->buf + pos; pos = packetparser_skip(b1->buf, b1->len, pos, chanlen); pos = packetparser_uint32(b1->buf, b1->len, pos, &id); /* uint32 sender channel */ pos = packetparser_uint32(b1->buf, b1->len, pos, &remotewindow); /* uint32 initial window size */ pos = packetparser_uint32(b1->buf, b1->len, pos, &maxpacket); /* uint32 maximum packet size */ if (maxpacket > PACKET_LIMIT) maxpacket = PACKET_LIMIT; if (str_equaln(chan, chanlen, "session")) { /* byte SSH_MSG_CHANNEL_OPEN string "session" uint32 sender channel uint32 initial window size uint32 maximum packet size */ pos = packetparser_end(b1->buf, b1->len, pos); /* send confirmation */ buf_purge(b1); if (channel_open(packet.name, id, remotewindow, maxpacket, &localwindow)) { buf_purge(b2); buf_putnum8( b2, SSH_MSG_CHANNEL_OPEN_CONFIRMATION); /* byte SSH_MSG_CHANNEL_OPEN_CONFIRMATION */ buf_putnum32(b2, id); /* uint32 recipient channel */ buf_putnum32(b2, id); /* uint32 sender channel */ buf_putnum32(b2, localwindow); /* uint32 initial window size */ /* XXX use PACKET_LIMIT/2 as maximum packet size, workaround for miscalculated packet_length */ buf_putnum32(b2, PACKET_LIMIT / 2); /* uint32 maximum packet size */ packet_put(b2); buf_purge(b2); return 1; } } /* reject channel */ buf_purge(b2); buf_putnum8( b2, SSH_MSG_CHANNEL_OPEN_FAILURE); /* byte SSH_MSG_CHANNEL_OPEN_FAILURE */ buf_putnum32(b2, id); /* uint32 recipient channel */ buf_putnum32( b2, SSH_OPEN_ADMINISTRATIVELY_PROHIBITED); /* uint32 reason code */ buf_putstring( b2, "only one 'session' channel allowed"); /* string description in ISO-10646 UTF-8 encoding [RFC3629] */ buf_putstring(b2, ""); /* string language tag [RFC3066] */ packet_put(b2); buf_purge(b1); buf_purge(b2); return 1; } tinyssh-20250501/packet_channel_recv.c000066400000000000000000000056621500472222400176040ustar00rootroot00000000000000/* 20140210 Jan Mojzis Public domain. */ #include "bug.h" #include "buf.h" #include "channel.h" #include "ssh.h" #include "packetparser.h" #include "packet.h" int packet_channel_recv_data(struct buf *b) { long long pos = 0; crypto_uint32 len, id; crypto_uint8 ch; pos = packetparser_uint8(b->buf, b->len, pos, &ch); /* byte SSH_MSG_CHANNEL_DATA */ if (ch != SSH_MSG_CHANNEL_DATA) bug_proto(); pos = packetparser_uint32(b->buf, b->len, pos, &id); /* uint32 recipient channel */ if (id != channel_getid()) bug_proto(); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* string data */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_end(b->buf, b->len, pos); channel_put(b->buf + pos - len, len); buf_purge(b); return 1; } int packet_channel_recv_extendeddata(struct buf *b) { /* ignore extended data */ buf_purge(b); return 1; } int packet_channel_recv_windowadjust(struct buf *b) { long long pos = 0; crypto_uint32 len, id; crypto_uint8 ch; pos = packetparser_uint8(b->buf, b->len, pos, &ch); /* byte SSH_MSG_CHANNEL_WINDOW_ADJUST */ if (ch != SSH_MSG_CHANNEL_WINDOW_ADJUST) bug_proto(); pos = packetparser_uint32(b->buf, b->len, pos, &id); /* uint32 recipient channel */ if (id != channel_getid()) bug_proto(); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* uint32 bytes to add */ pos = packetparser_end(b->buf, b->len, pos); channel_incrementremotewindow(len); buf_purge(b); return 1; } int packet_channel_recv_eof(struct buf *b) { long long pos = 0; crypto_uint32 id; crypto_uint8 ch; pos = packetparser_uint8(b->buf, b->len, pos, &ch); /* byte SSH_MSG_CHANNEL_EOF */ if (ch != SSH_MSG_CHANNEL_EOF) bug_proto(); pos = packetparser_uint32(b->buf, b->len, pos, &id); /* uint32 recipient channel */ if (id != channel_getid()) bug_proto(); pos = packetparser_end(b->buf, b->len, pos); log_d1("packet=SSH_MSG_CHANNEL_EOF received"); channel_puteof(); buf_purge(b); return 1; } int packet_channel_recv_close(struct buf *b) { long long pos = 0; crypto_uint32 id; crypto_uint8 ch; pos = packetparser_uint8(b->buf, b->len, pos, &ch); /* byte SSH_MSG_CHANNEL_CLOSE */ if (ch != SSH_MSG_CHANNEL_CLOSE) bug_proto(); pos = packetparser_uint32(b->buf, b->len, pos, &id); /* uint32 recipient channel */ if (id != channel_getid()) bug_proto(); pos = packetparser_end(b->buf, b->len, pos); log_d1("packet=SSH_MSG_CHANNEL_CLOSE received"); packet_channel_send_eof(b); packet.flagchanneleofreceived = 1; buf_purge(b); return 1; } tinyssh-20250501/packet_channel_request.c000066400000000000000000000205251500472222400203300ustar00rootroot00000000000000/* 20140120 Jan Mojzis Public domain. */ #include "buf.h" #include "ssh.h" #include "e.h" #include "bug.h" #include "str.h" #include "log.h" #include "packetparser.h" #include "packet.h" int packet_channel_request(struct buf *b1, struct buf *b2, const char *customcmd) { long long pos = 0; crypto_uint8 ch, wantreply; crypto_uint32 id, a, b, x, y; char *cmd; crypto_uint32 cmdlen; char *p1, *p2; const char *ps; crypto_uint32 plen1, plen2; pos = packetparser_uint8(b1->buf, b1->len, pos, &ch); /* byte SSH_MSG_CHANNEL_REQUEST */ if (ch != SSH_MSG_CHANNEL_REQUEST) bug_proto(); pos = packetparser_uint32(b1->buf, b1->len, pos, &id); /* uint32 recipient channel */ if (id != channel_getid()) bug_proto(); pos = packetparser_uint32( b1->buf, b1->len, pos, &cmdlen); /* string request type in US-ASCII characters only */ cmd = (char *) b1->buf + pos; pos = packetparser_skip(b1->buf, b1->len, pos, cmdlen); pos = packetparser_uint8(b1->buf, b1->len, pos, &wantreply); /* boolean want reply */ cmd[cmdlen] = 0; if (str_equaln(cmd, cmdlen, "exec")) { /* byte SSH_MSG_CHANNEL_REQUEST uint32 recipient channel string "exec" boolean want reply string command */ pos = packetparser_uint32(b1->buf, b1->len, pos, &plen1); p1 = (char *) b1->buf + pos; pos = packetparser_skip(b1->buf, b1->len, pos, plen1); pos = packetparser_end(b1->buf, b1->len, pos); buf_putnum8(b1, 0); p1[plen1] = 0; if (customcmd) { log_d4("packet=SSH_MSG_CHANNEL_REQUEST, exec ", p1, ", rejected: custom program is selected using param. -e ", customcmd); goto reject; } if (!channel_exec(p1)) bug(); log_d3("packet=SSH_MSG_CHANNEL_REQUEST, exec ", p1, ", accepted"); goto accept; } if (str_equaln(cmd, cmdlen, "subsystem")) { /* byte SSH_MSG_CHANNEL_REQUEST uint32 recipient channel string "subsystem" boolean want reply string subsystem name */ pos = packetparser_uint32(b1->buf, b1->len, pos, &plen1); p1 = (char *) b1->buf + pos; pos = packetparser_skip(b1->buf, b1->len, pos, plen1); pos = packetparser_end(b1->buf, b1->len, pos); buf_putnum8(b1, 0); p1[plen1] = 0; if (customcmd) { log_d4("packet=SSH_MSG_CHANNEL_REQUEST, subsystem ", p1, ", rejected: custom program is selected using param. -e ", customcmd); goto reject; } ps = channel_subsystem_get(p1); if (!ps) { log_d3("packet=SSH_MSG_CHANNEL_REQUEST, subsystem ", p1, ", rejected"); goto reject; } if (!channel_exec(ps)) bug(); log_d5("packet=SSH_MSG_CHANNEL_REQUEST, subsystem ", p1, "=", ps, ", accepted"); goto accept; } if (str_equaln(cmd, cmdlen, "shell")) { /* byte SSH_MSG_CHANNEL_REQUEST uint32 recipient channel string "shell" boolean want reply */ pos = packetparser_end(b1->buf, b1->len, pos); if (customcmd) { if (!channel_exec(customcmd)) bug(); log_d3("packet=SSH_MSG_CHANNEL_REQUEST, shell, accepted, executing " "custom shell '", customcmd, "'"); } else { if (!channel_exec(0)) bug(); log_d1("packet=SSH_MSG_CHANNEL_REQUEST, shell, accepted"); } goto accept; } if (str_equaln(cmd, cmdlen, "env")) { /* byte SSH_MSG_CHANNEL_REQUEST uint32 recipient channel string "env" boolean want reply string variable name string variable value */ /**/ pos = packetparser_uint32(b1->buf, b1->len, pos, &plen1); /* string variable name */ p1 = (char *) b1->buf + pos; pos = packetparser_skip(b1->buf, b1->len, pos, plen1); pos = packetparser_uint32(b1->buf, b1->len, pos, &plen2); /* string variable value */ p2 = (char *) b1->buf + pos; pos = packetparser_skip(b1->buf, b1->len, pos, plen2); pos = packetparser_end(b1->buf, b1->len, pos); buf_putnum8(b1, 0); p1[plen1] = 0; p2[plen2] = 0; if (channel_env(p1, p2)) { log_d5("packet=SSH_MSG_CHANNEL_REQUEST, env ", p1, "=", p2, ", accepted"); goto accept; } else { log_d5("packet=SSH_MSG_CHANNEL_REQUEST, env ", p1, "=", p2, ", rejected"); goto reject; } } if (str_equaln(cmd, cmdlen, "pty-req")) { /* byte SSH_MSG_CHANNEL_REQUEST uint32 recipient channel string "pty-req" boolean want_reply string TERM environment variable value (e.g., vt100) uint32 terminal width, characters (e.g., 80) uint32 terminal height, rows (e.g., 24) uint32 terminal width, pixels (e.g., 640) uint32 terminal height, pixels (e.g., 480) string encoded terminal modes */ pos = packetparser_uint32(b1->buf, b1->len, pos, &plen1); p1 = (char *) b1->buf + pos; pos = packetparser_skip(b1->buf, b1->len, pos, plen1); pos = packetparser_uint32(b1->buf, b1->len, pos, &a); pos = packetparser_uint32(b1->buf, b1->len, pos, &b); pos = packetparser_uint32(b1->buf, b1->len, pos, &x); pos = packetparser_uint32(b1->buf, b1->len, pos, &y); pos = packetparser_uint32(b1->buf, b1->len, pos, &plen2); p2 = (char *) b1->buf + pos; pos = packetparser_skip(b1->buf, b1->len, pos, plen2); pos = packetparser_end(b1->buf, b1->len, pos); buf_putnum8(b1, 0); /* XXX TODO encoded terminal modes (p2, plen2) */ p1[plen1] = 0; p2[plen2] = 0; if (!channel_openterminal(p1, a, b, x, y)) { log_w1("unable to open terminal"); log_d3("packet=SSH_MSG_CHANNEL_REQUEST, pty-req ", p1, ", rejected"); goto reject; } log_d3("packet=SSH_MSG_CHANNEL_REQUEST, pty-req ", p1, ", accepted"); goto accept; } if (str_equaln(cmd, cmdlen, "window-change")) { /* byte SSH_MSG_CHANNEL_REQUEST uint32 recipient channel string "window-change" boolean FALSE uint32 terminal width, columns uint32 terminal height, rows uint32 terminal width, pixels uint32 terminal height, pixels */ pos = packetparser_uint32(b1->buf, b1->len, pos, &a); pos = packetparser_uint32(b1->buf, b1->len, pos, &b); pos = packetparser_uint32(b1->buf, b1->len, pos, &x); pos = packetparser_uint32(b1->buf, b1->len, pos, &y); pos = packetparser_end(b1->buf, b1->len, pos); channel_ptyresize(a, b, x, y); log_d1("packet=SSH_MSG_CHANNEL_REQUEST, window-change, accepted"); goto accept; } log_d3("packet=SSH_MSG_CHANNEL_REQUEST, ", cmd, ", rejected or ignored"); reject: /* reject channel request */ if (!wantreply) goto done; buf_purge(b2); buf_putnum8(b2, SSH_MSG_CHANNEL_FAILURE); /* byte SSH_MSG_CHANNEL_SUCCESS */ buf_putnum32(b2, id); /* uint32 recipient channel */ packet_put(b2); buf_purge(b1); buf_purge(b2); return 1; accept: if (!wantreply) goto done; buf_purge(b2); buf_putnum8(b2, SSH_MSG_CHANNEL_SUCCESS); /* byte SSH_MSG_CHANNEL_SUCCESS */ buf_putnum32(b2, id); /* uint32 recipient channel */ packet_put(b2); buf_purge(b1); buf_purge(b2); return 1; done: buf_purge(b1); buf_purge(b2); return 1; } tinyssh-20250501/packet_channel_send.c000066400000000000000000000105501500472222400175660ustar00rootroot00000000000000/* 20140211 Jan Mojzis Public domain. */ #include "bug.h" #include "buf.h" #include "channel.h" #include "ssh.h" #include "bug.h" #include "crypto_uint32.h" #include "packet.h" void packet_channel_send_data(struct buf *b) { long long r; long long limit = PACKET_LIMIT; if (channel.maxpacket > 0) { if (channel.maxpacket < PACKET_LIMIT) { limit = channel.maxpacket; } } buf_purge(b); if (b->alloc <= PACKET_LIMIT) bug_nomem(); if (!packet_putisready()) return; r = channel_read(b->buf + 9, limit - 9); if (r == 0) return; b->len = r + 9; b->buf[0] = SSH_MSG_CHANNEL_DATA; /* byte SSH_MSG_CHANNEL_DATA */ crypto_uint32_store_bigendian( b->buf + 1, channel_getid()); /* uint32 recipient channel */ crypto_uint32_store_bigendian(b->buf + 5, r); /* string data */ packet_put(b); buf_purge(b); return; } void packet_channel_send_extendeddata(struct buf *b) { long long r; long long limit = PACKET_LIMIT; if (channel.maxpacket > 0) { if (channel.maxpacket < PACKET_LIMIT) { limit = channel.maxpacket; } } buf_purge(b); if (b->alloc <= PACKET_LIMIT) bug_nomem(); if (!packet_putisready()) return; r = channel_extendedread(b->buf + 13, limit - 13); if (r == 0) return; b->len = r + 13; b->buf[0] = SSH_MSG_CHANNEL_EXTENDED_DATA; /* byte SSH_MSG_CHANNEL_EXTENDED_DATA */ crypto_uint32_store_bigendian( b->buf + 1, channel_getid()); /* uint32 recipient channel */ crypto_uint32_store_bigendian( b->buf + 5, 1); /* uint32 data_type_code (1 = stderr) */ crypto_uint32_store_bigendian(b->buf + 9, r); /* string data */ packet_put(b); buf_purge(b); return; } int packet_channel_send_windowadjust(struct buf *b) { crypto_uint32 plus; if (channel_getlen0() > CHANNEL_BUFSIZE / 2) return 1; if (channel_getlocalwindow() > CHANNEL_BUFSIZE / 2) return 1; buf_purge(b); buf_putnum8(b, SSH_MSG_CHANNEL_WINDOW_ADJUST); buf_putnum32(b, channel_getid()); plus = CHANNEL_BUFSIZE - channel_getlen0() - channel_getlocalwindow(); buf_putnum32(b, plus); channel_incrementlocalwindow(plus); packet_put(b); buf_purge(b); return 1; } void packet_channel_send_eof(struct buf *b) { if (packet.flageofsent) return; buf_purge(b); buf_putnum8(b, SSH_MSG_CHANNEL_EOF); buf_putnum32(b, channel_getid()); packet_put(b); buf_purge(b); packet.flageofsent = 1; } int packet_channel_send_close(struct buf *b, int exitsignal, int exitcode) { packet_channel_send_eof(b); if (packet.flagclosesent) return 1; if (exitsignal > 0) { buf_purge(b); buf_putnum8(b, SSH_MSG_CHANNEL_REQUEST); /* byte SSH_MSG_CHANNEL_REQUEST */ buf_putnum32(b, channel_getid()); /* uint32 recipient channel */ buf_putstring(b, "exit-signal"); /* string "exit-signal" */ buf_putnum8(b, 0); /* boolean FALSE */ buf_putstring(b, ssh_sigstr(exitsignal)); /* string signal name (without the "SIG" prefix) */ buf_putnum8(b, 0); /* boolean core dumped */ buf_putstring( b, ssh_sigstrlong(exitsignal)); /* string error message in ISO-10646 UTF-8 encoding */ buf_putstring(b, ""); /* string language tag [RFC3066] */ packet_put(b); buf_purge(b); if (!packet_sendall()) return 0; } else { buf_purge(b); buf_putnum8(b, SSH_MSG_CHANNEL_REQUEST); /* byte SSH_MSG_CHANNEL_REQUEST */ buf_putnum32(b, channel_getid()); /* uint32 recipient channel */ buf_putstring(b, "exit-status"); /* string "exit-status" */ buf_putnum8(b, 0); /* boolean FALSE */ buf_putnum32(b, exitcode); /* uint32 exit_status */ packet_put(b); buf_purge(b); if (!packet_sendall()) return 0; } buf_purge(b); buf_putnum8(b, SSH_MSG_CHANNEL_CLOSE); /* byte SSH_MSG_CHANNEL_CLOSE */ buf_putnum32(b, channel_getid()); /* uint32 recipient channel */ packet_put(b); if (!packet_sendall()) return 0; buf_purge(b); packet.flagclosesent = 1; return 1; } tinyssh-20250501/packet_get.c000066400000000000000000000071061500472222400157270ustar00rootroot00000000000000/* 20140126 20241215 - reformated using clang-format Jan Mojzis Public domain. */ #include #include #include "byte.h" #include "e.h" #include "bug.h" #include "crypto_uint32.h" #include "purge.h" #include "ssh.h" #include "sshcrypto.h" #include "numtostr.h" #include "packet.h" static int packet_get_plain_(struct buf *b) { crypto_uint32 packet_length; long long len; struct buf *recvbuf = &packet.recvbuf; unsigned char *pp; long long l; pp = recvbuf->buf + PACKET_ZEROBYTES; l = recvbuf->len - PACKET_ZEROBYTES; /* we need at least 4 bytes */ if (l < 4) return 1; /* parse length */ packet_length = crypto_uint32_load_bigendian(pp); if (packet_length > PACKET_LIMIT) { char buf1[NUMTOSTR_LEN]; char buf2[NUMTOSTR_LEN]; errno = EPROTO; log_f4("packet length ", numtostr(buf1, packet_length), " > PACKET_LIMIT ", numtostr(buf2, PACKET_LIMIT)); global_die(111); } if (packet_length + 4 > l) return 1; /* we have full packet */ len = packet_length; len -= recvbuf->buf[PACKET_ZEROBYTES + 4] + 1; if (len <= 0) bug_proto(); buf_put(b, recvbuf->buf + PACKET_ZEROBYTES + 5, len); byte_copy(pp, l - packet_length + 4, pp + packet_length + 4); purge(pp + l - packet_length + 4, packet_length + 4); recvbuf->len -= packet_length + 4; packet.receivepacketid++; return 1; } static int packet_get_(struct buf *b) { crypto_uint32 lastreceivepacketid = packet.receivepacketid; int ret; if (packet.flagkeys) { ret = sshcrypto_packet_get(b); } else { ret = packet_get_plain_(b); } /* overflow check */ if (lastreceivepacketid > packet.receivepacketid) { log_f1("receivepacketid overflow"); global_die(111); } return ret; } int packet_get(struct buf *b, crypto_uint8 x) { buf_purge(b); if (!packet_get_(b)) return 0; if (b->len <= 0) return 1; if (!packet.flagauthorized) if (packet.receivepacketid > PACKET_UNAUTHENTICATED_MESSAGES) { errno = EPROTO; log_f1("too many unauthenticated messages"); global_die(111); } switch (b->buf[0]) { case SSH_MSG_DISCONNECT: errno = 0; return 0; case SSH_MSG_IGNORE: case SSH_MSG_DEBUG: if (!packet.flagkeys) { log_f1("SSH_MSG_IGNORE/SSH_MSG_DEBUG packet rejected in " "plain-text mode"); global_die(111); } buf_purge(b); break; case SSH_MSG_NEWKEYS: /* strict kex - reset receivepacketid */ if (sshcrypto_kex_flags & sshcrypto_FLAGSTRICTKEX) { packet.receivepacketid = 0; } break; default: if (x && x != b->buf[0]) { char buf1[NUMTOSTR_LEN]; char buf2[NUMTOSTR_LEN]; errno = EPROTO; log_f4("expected packet type ", numtostr(buf1, x), ", got ", numtostr(buf2, b->buf[0])); global_die(111); } break; } return 1; } int packet_getall(struct buf *b, crypto_uint8 ch) { struct pollfd x; long long before; buf_purge(b); for (;;) { before = packet.recvbuf.len; if (!packet_get(b, ch)) return 0; if (b->len > 0) break; if (before != packet.recvbuf.len) continue; x.fd = 0; x.events = POLLIN | POLLERR; poll(&x, 1, -1); if (!packet_recv()) return 0; } return 1; } tinyssh-20250501/packet_hello.c000066400000000000000000000033721500472222400162540ustar00rootroot00000000000000/* 20140125 20241210 - reformated using clang-format Jan Mojzis Public domain. */ #include "buf.h" #include "byte.h" #include "writeall.h" #include "purge.h" #include "log.h" #include "str.h" #include "getln.h" #include "e.h" #include "packet.h" /* The 'packet_hello_send()' function sends SSH hello string to the client. See RFC 4253 4.2. Protocol Version Exchange. Example: SSH-2.0-tinyssh_20160201 iX512l8j */ int packet_hello_send(void) { struct buf *b = &packet.hellosend; buf_purge(b); buf_puts(b, "SSH-2.0-tinyssh"); #ifdef VERSION buf_puts(b, "_"); buf_puts(b, VERSION); #endif buf_puts(b, " "); buf_puts(b, log_string()); buf_puts(b, "\r\n"); if (writeall(1, b->buf, b->len) == -1) return 0; b->len -= 2; /* remove "\r\n" */ b->buf[b->len] = 0; log_d2("hello: server: ", (char *) (b->buf)); purge(b->buf + b->len, b->alloc - b->len); return 1; } /* The 'packet_hello_receive()' function receives SSH hello string from the client. See RFC 4253 4.2. Protocol Version Exchange. Example: SSH-2.0-OpenSSH_6.6.1p1 Debian-4~bpo70+1 */ int packet_hello_receive(void) { int r; struct buf *b = &packet.helloreceive; r = getln(0, b->buf, b->alloc); if (r == 0) { errno = ECONNRESET; return 0; } if (r != 1) return 0; b->len = str_len((char *) b->buf); if (b->len < 6) { errno = EPROTO; return 0; } if (b->buf[b->len - 1] == '\n') --(b->len); /* remove '\n' */ if (b->buf[b->len - 1] == '\r') --(b->len); /* remove '\r' */ b->buf[b->len] = 0; if (!byte_isequal(b->buf, 4, "SSH-")) { errno = EPROTO; return 0; } log_d2("hello: client: ", (char *) b->buf); purge(b->buf + b->len, b->alloc - b->len); return 1; } tinyssh-20250501/packet_kex.c000066400000000000000000000077361500472222400157500ustar00rootroot00000000000000/* 20140110 Jan Mojzis Public domain. */ #include "buf.h" #include "ssh.h" #include "sshcrypto.h" #include "packetparser.h" #include "bug.h" #include "packet.h" int packet_kex_send(void) { struct buf *b = &packet.kexsend; /* send server kex_init */ buf_purge(b); buf_putnum8(b, SSH_MSG_KEXINIT); /* SSH_MSG_KEXINIT */ buf_putrandombytes(b, 16); /* cookie */ sshcrypto_kex_put(b); /* kex algorithms */ sshcrypto_key_put(b); /* server host key algorithms */ sshcrypto_cipher_put(b); /* encryption algorithms client to server */ sshcrypto_cipher_put(b); /* encryption algorithms server to client */ sshcrypto_cipher_macput(b); /* mac algorithms client to server */ sshcrypto_cipher_macput(b); /* mac algorithms server to client */ buf_putstring(b, "none"); /* compress algorithms client to server */ buf_putstring(b, "none"); /* compress algorithms server to client */ buf_putstring(b, ""); /* languages client to server */ buf_putstring(b, ""); /* languages server to client */ buf_putnum8(b, 0); /* kex first packet follows */ buf_putnum32(b, 0); /* reserved */ packet_put(b); return packet_sendall(); } int packet_kex_receive(void) { struct buf *b = &packet.kexrecv; long long pos = 0; crypto_uint8 ch; crypto_uint32 len; if (!packet_getall(b, SSH_MSG_KEXINIT)) return 0; /* parse packet */ pos = packetparser_uint8(b->buf, b->len, pos, &ch); /* SSH_MSG_KEXINIT */ if (ch != SSH_MSG_KEXINIT) bug_proto(); pos = packetparser_skip(b->buf, b->len, pos, 16); /* cookie */ pos = packetparser_uint32(b->buf, b->len, pos, &len); /* kex algorithms */ pos = packetparser_skip(b->buf, b->len, pos, len); if (!sshcrypto_kex_select(b->buf + pos - len, len, &packet.kex_guess)) return 0; pos = packetparser_uint32(b->buf, b->len, pos, &len); /* server host key algorithms */ pos = packetparser_skip(b->buf, b->len, pos, len); if (!sshcrypto_key_select(b->buf + pos - len, len)) return 0; pos = packetparser_uint32( b->buf, b->len, pos, &len); /* encryption algorithms client to server */ pos = packetparser_skip(b->buf, b->len, pos, len); if (!sshcrypto_cipher_select(b->buf + pos - len, len)) return 0; pos = packetparser_uint32( b->buf, b->len, pos, &len); /* encryption algorithms server to client */ pos = packetparser_skip(b->buf, b->len, pos, len); /* XXX assuming same as encryption algorithms client to server */ pos = packetparser_uint32(b->buf, b->len, pos, &len); /* mac algorithms client to server */ pos = packetparser_skip(b->buf, b->len, pos, len); if (!sshcrypto_cipher_macselect(b->buf + pos - len, len)) return 0; pos = packetparser_uint32(b->buf, b->len, pos, &len); /* mac algorithms server to client */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* compress algorithms client to server */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* compress algorithms server to client */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* languages client to server */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_uint32(b->buf, b->len, pos, &len); /* languages server to client */ pos = packetparser_skip(b->buf, b->len, pos, len); pos = packetparser_uint8(b->buf, b->len, pos, &ch); /* kex first packet follows */ packet.kex_packet_follows = ch; pos = packetparser_uint32(b->buf, b->len, pos, &len); /* reserved */ pos = packetparser_end(b->buf, b->len, pos); return 1; } tinyssh-20250501/packet_kexdh.c000066400000000000000000000116631500472222400162560ustar00rootroot00000000000000/* 20141025 Jan Mojzis Public domain. */ #include "buf.h" #include "ssh.h" #include "e.h" #include "crypto_uint32.h" #include "byte.h" #include "sshcrypto.h" #include "packetparser.h" #include "bug.h" #include "log.h" #include "purge.h" #include "subprocess.h" #include "packet.h" int packet_kexdh(const char *keydir, struct buf *b1, struct buf *b2) { unsigned char clientpk[sshcrypto_kem_PUBLICKEYMAX]; unsigned char serverpk[sshcrypto_kem_CIPHERTEXTMAX]; unsigned char sharedsecret[sshcrypto_kem_MAX]; unsigned char sm[sshcrypto_sign_MAX]; unsigned char key[sshcrypto_cipher_KEYMAX]; unsigned char hash[sshcrypto_hash_MAX]; long long pos = 0; crypto_uint8 ch; crypto_uint32 len; long long i; if (packet.kex_packet_follows && !packet.kex_guess) { buf_purge(b1); if (!packet_getall(b1, SSH_MSG_KEXDH_INIT)) return 0; } buf_purge(b1); if (!packet_getall(b1, SSH_MSG_KEXDH_INIT)) return 0; pos = packetparser_uint8(b1->buf, b1->len, pos, &ch); /* byte SSH_MSG_KEXDH_INIT */ if (ch != SSH_MSG_KEXDH_INIT) bug_proto(); pos = packetparser_uint32(b1->buf, b1->len, pos, &len); /* string client's public key */ if (len != sshcrypto_kem_publickeybytes) bug_proto(); pos = packetparser_copy(b1->buf, b1->len, pos, clientpk, len); pos = packetparser_end(b1->buf, b1->len, pos); buf_purge(b1); /* generate key and compute shared secret */ do { /* XXX - workaroud for bug in OpenSSH 6.5 - 6.6 */ if (sshcrypto_enc(serverpk, sharedsecret, clientpk) != 0) bug_proto(); } while (sharedsecret[0] == 0 && sshcrypto_kem_publickeybytes == 32); /* create hash */ buf_purge(&packet.hashbuf); buf_putstringlen(&packet.hashbuf, packet.helloreceive.buf, packet.helloreceive.len); buf_putstringlen(&packet.hashbuf, packet.hellosend.buf, packet.hellosend.len); buf_putstringlen(&packet.hashbuf, packet.kexrecv.buf, packet.kexrecv.len); buf_putstringlen(&packet.hashbuf, packet.kexsend.buf, packet.kexsend.len); sshcrypto_buf_putsignpk(&packet.hashbuf, sshcrypto_sign_publickey); buf_putstringlen(&packet.hashbuf, clientpk, sshcrypto_kem_publickeybytes); buf_putstringlen(&packet.hashbuf, serverpk, sshcrypto_kem_ciphertextbytes); sshcrypto_buf_putkemkey(&packet.hashbuf, sharedsecret); sshcrypto_hash(hash, packet.hashbuf.buf, packet.hashbuf.len); /* session id */ if (!packet.flagrekeying) byte_copy(packet.sessionid, sshcrypto_hash_bytes, hash); packet.flagrekeying = 1; /* signature */ if (subprocess_sign(sm, sshcrypto_sign_bytes, keydir, hash, sshcrypto_hash_bytes) != 0) return 0; buf_purge(b1); buf_purge(b2); /* send server kex_ecdh_reply */ buf_putnum8(b2, SSH_MSG_KEXDH_REPLY); /* SSH_MSG_KEXDH_REPLY */ sshcrypto_buf_putsignpk(b2, sshcrypto_sign_publickey); /* public key */ buf_putstringlen(b2, serverpk, sshcrypto_kem_ciphertextbytes); /* servers's public key */ sshcrypto_buf_putsignature(b2, sm); /* signature */ packet_put(b2); /* send server newkeys */ buf_purge(b2); buf_putnum8(b2, SSH_MSG_NEWKEYS); packet_put(b2); if (!packet_sendall()) return 0; /* receive new keys */ for (;;) { buf_purge(b2); if (!packet_getall(b2, 0)) return 0; if (b2->buf[0] == SSH_MSG_NEWKEYS) break; if (sshcrypto_kex_flags & sshcrypto_FLAGSTRICTKEX) { log_f1("strict KEX mode: rejecting non-SSH_MSG_NEWKEYS packet"); return 0; } } /* key derivation */ for (i = 0; i < 6; ++i) { buf_purge(b1); sshcrypto_buf_putkemkey(b1, sharedsecret); buf_put(b1, hash, sshcrypto_hash_bytes); buf_putnum8(b1, 'A' + i); buf_put(b1, packet.sessionid, sshcrypto_hash_bytes); sshcrypto_hash(key, b1->buf, b1->len); /* one extend */ buf_purge(b1); sshcrypto_buf_putkemkey(b1, sharedsecret); buf_put(b1, hash, sshcrypto_hash_bytes); buf_put(b1, key, sshcrypto_hash_bytes); sshcrypto_hash(key + sshcrypto_hash_bytes, b1->buf, b1->len); if (i == 0) byte_copy(packet.clientnonce, sshcrypto_cipher_KEYMAX, key); if (i == 1) byte_copy(packet.servernonce, sshcrypto_cipher_KEYMAX, key); if (i == 2) byte_copy(packet.clientkey, sshcrypto_cipher_KEYMAX, key); if (i == 3) byte_copy(packet.serverkey, sshcrypto_cipher_KEYMAX, key); if (i == 4) byte_copy(packet.clientmackey, sshcrypto_cipher_KEYMAX, key); if (i == 5) byte_copy(packet.servermackey, sshcrypto_cipher_KEYMAX, key); } purge(clientpk, sizeof clientpk); purge(serverpk, sizeof serverpk); purge(sharedsecret, sizeof sharedsecret); purge(sm, sizeof sm); purge(key, sizeof key); purge(hash, sizeof hash); return 1; } tinyssh-20250501/packet_put.c000066400000000000000000000026261500472222400157620ustar00rootroot00000000000000/* 20140207 20241211 - reformated using clang-format Jan Mojzis Public domain. */ #include "crypto_uint32.h" #include "buf.h" #include "bug.h" #include "sshcrypto.h" #include "ssh.h" #include "log.h" #include "packet.h" static void packet_put_plain_(struct buf *b) { long long pos; crypto_uint8 paddinglen; struct buf *sendbuf = &packet.sendbuf; pos = sendbuf->len; /* get position */ buf_putnum32(sendbuf, 0); /* length */ buf_putnum8(sendbuf, 0); /* padding length */ buf_put(sendbuf, b->buf, b->len); /* add data */ packet.sendpacketid++; /* increment id */ /* padding */ paddinglen = 2 * 8 - ((sendbuf->len - pos) % 8); buf_putzerobytes(sendbuf, paddinglen); sendbuf->buf[pos + 4] = paddinglen; /* add packet length */ crypto_uint32_store_bigendian(sendbuf->buf + pos, sendbuf->len - pos - 4); } int packet_putisready(void) { return buf_ready(&packet.sendbuf, PACKET_FULLLIMIT); } void packet_put(struct buf *b) { if (packet.flagkeys) { sshcrypto_packet_put(b); } else { packet_put_plain_(b); } /* overflow check */ if (!packet.sendpacketid) { log_f1("sendpacketid overflow"); global_die(111); } /* strict kex - reset sendpacketid */ if (b->buf[0] == SSH_MSG_NEWKEYS && sshcrypto_kex_flags & sshcrypto_FLAGSTRICTKEX) { packet.sendpacketid = 0; } } tinyssh-20250501/packet_recv.c000066400000000000000000000014731500472222400161100ustar00rootroot00000000000000/* 20140120 20241211 - reformated using clang-format Jan Mojzis Public domain. */ #include #include "e.h" #include "buf.h" #include "purge.h" #include "packet.h" int packet_recvisready(void) { return buf_ready(&packet.recvbuf, PACKET_FULLLIMIT); } int packet_recv(void) { long long r; struct buf *b = &packet.recvbuf; if (b->len < PACKET_ZEROBYTES) { b->len = PACKET_ZEROBYTES; purge(b->buf, PACKET_ZEROBYTES); } if (!packet_recvisready()) return 1; r = read(0, b->buf + b->len, PACKET_FULLLIMIT); if (r == 0) { errno = ECONNRESET; return 0; } if (r == -1) { if (errno == EINTR) return 1; if (errno == EAGAIN) return 1; if (errno == EWOULDBLOCK) return 1; return 0; } b->len += r; return 1; } tinyssh-20250501/packet_send.c000066400000000000000000000016621500472222400161020ustar00rootroot00000000000000/* 20140120 20241211 - reformated using clang-format Jan Mojzis Public domain. */ #include #include "writeall.h" #include "e.h" #include "byte.h" #include "purge.h" #include "packet.h" int packet_sendisready(void) { return (packet.sendbuf.len > 0); } int packet_send(void) { struct buf *sendbuf = &packet.sendbuf; long long w; if (sendbuf->len <= 0) return 1; w = write(1, sendbuf->buf, sendbuf->len); if (w == -1) { if (errno == EINTR) return 1; if (errno == EAGAIN) return 1; if (errno == EWOULDBLOCK) return 1; return 0; } byte_copy(sendbuf->buf, sendbuf->len - w, sendbuf->buf + w); sendbuf->len -= w; purge(sendbuf->buf + sendbuf->len, w); return 1; } int packet_sendall(void) { if (writeall(1, packet.sendbuf.buf, packet.sendbuf.len) == -1) return 0; purge(packet.sendbuf.buf, packet.sendbuf.len); packet.sendbuf.len = 0; return 1; } tinyssh-20250501/packet_unimplemented.c000066400000000000000000000011371500472222400200140ustar00rootroot00000000000000/* 20150719 20241211 - reformated using clang-format Jan Mojzis Public domain. */ #include "buf.h" #include "ssh.h" #include "log.h" #include "numtostr.h" #include "packet.h" int packet_unimplemented(struct buf *b) { char strnum[NUMTOSTR_LEN]; /* note that b->buf[0] contains packetid */ log_d3("packet=", numtostr(strnum, b->buf[0]), ", sending SSH_MSG_UNIMPLEMENTED message"); buf_purge(b); buf_putnum8(b, SSH_MSG_UNIMPLEMENTED); /* SSH_MSG_UNIMPLEMENTED */ buf_putnum32(b, packet.receivepacketid); /* packeid */ packet_put(b); return packet_sendall(); } tinyssh-20250501/packetparser.c000066400000000000000000000055131500472222400163050ustar00rootroot00000000000000/* 20140210 20241210 - reformated using clang-format Jan Mojzis Public domain. The 'packetparser' library is used to parse SSH packets. The 'packetparser_*' function has always information about buffer, buffer length and position in the buffer. Before parsing checks if the position is not exceeding the buffer length. If the position exceeds the buffer length, packetparser_* function immediately exits with 111 status code. */ #include "e.h" #include "crypto_uint32.h" #include "bug.h" #include "byte.h" #include "packetparser.h" /* Parse one-byte character. */ long long packetparser_uint8_(const char *fn, unsigned long long line, const unsigned char *buf, long long len, long long pos, crypto_uint8 *out) { if (!buf || len < 0 || len > 1073741824 || pos < 0 || pos > 1073741824 || !out) bug_inval_(fn, line); if (pos + 1 > len) bug_proto_(fn, line); *out = buf[pos]; return pos + 1; } /* Parse the unsigned 32-bit number. */ long long packetparser_uint32_(const char *fn, unsigned long long line, const unsigned char *buf, long long len, long long pos, crypto_uint32 *out) { if (!buf || len < 0 || len > 1073741824 || pos < 0 || pos > 1073741824 || !out) bug_inval_(fn, line); if (pos + 4 > len) bug_proto_(fn, line); *out = crypto_uint32_load_bigendian(buf + pos); return pos + 4; } /* Parse the string and copy it. */ long long packetparser_copy_(const char *fn, unsigned long long line, const unsigned char *buf, long long len, long long pos, unsigned char *out, long long outlen) { if (!buf || len < 0 || len > 1073741824 || pos < 0 || pos > 1073741824 || !out || outlen < 0 || outlen > 1073741824) bug_inval_(fn, line); if (pos + outlen > len) bug_proto_(fn, line); byte_copy(out, outlen, buf + pos); return pos + outlen; } /* Skip 'len' bytes. */ long long packetparser_skip_(const char *fn, unsigned long long line, const unsigned char *buf, long long len, long long pos, long long skip) { if (!buf || len < 0 || len > 1073741824 || pos < 0 || pos > 1073741824 || skip < 0 || skip > 1073741824) bug_inval_(fn, line); if (pos + skip > len) bug_proto_(fn, line); return pos + skip; } /* Check if the position is end-position. */ long long packetparser_end_(const char *fn, unsigned long long line, const unsigned char *buf, long long len, long long pos) { if (!buf || len < 0 || len > 1073741824 || pos < 0 || pos > 1073741824) bug_inval_(fn, line); if (pos != len) bug_proto_(fn, line); return pos; } tinyssh-20250501/packetparser.h000066400000000000000000000034441500472222400163130ustar00rootroot00000000000000#ifndef PACKETPARSER_H____ #define PACKETPARSER_H____ #include "crypto_uint32.h" #include "crypto_uint8.h" extern long long packetparser_uint8_(const char *, unsigned long long, const unsigned char *, long long, long long, crypto_uint8 *); extern long long packetparser_uint32_(const char *, unsigned long long, const unsigned char *, long long, long long, crypto_uint32 *); extern long long packetparser_copy_(const char *, unsigned long long, const unsigned char *, long long, long long, unsigned char *, long long); extern long long packetparser_skip_(const char *, unsigned long long, const unsigned char *, long long, long long, long long); extern long long packetparser_end_(const char *, unsigned long long, const unsigned char *, long long, long long); #define packetparser_uint8(a, b, cc, d) \ packetparser_uint8_(__FILE__, __LINE__, (a), (b), (cc), (d)) #define packetparser_uint32(a, b, cc, d) \ packetparser_uint32_(__FILE__, __LINE__, (a), (b), (cc), (d)) #define packetparser_copy(a, b, cc, d, e) \ packetparser_copy_(__FILE__, __LINE__, (a), (b), (cc), (d), (e)) #define packetparser_skip(a, b, cc, d) \ packetparser_skip_(__FILE__, __LINE__, (a), (b), (cc), (d)) #define packetparser_end(a, b, cc) \ packetparser_end_(__FILE__, __LINE__, (a), (b), (cc)) #endif tinyssh-20250501/porttostr.c000066400000000000000000000016051500472222400156770ustar00rootroot00000000000000/* 20130604 20241207 - reformated using clang-format Jan Mojzis Public domain. */ #include "crypto_uint16.h" #include "porttostr.h" /* The 'porttostr(strbuf,port)' converts 'port' from network byte order into the 0-terminated string. The 'port' length is always 2 bytes. The caller must allocate at least PORTTOSTR_LEN bytes for 'strbuf'. */ char *porttostr(char *strbuf, const unsigned char *port) { long long len = 0; crypto_uint16 num; static char staticbuf[PORTTOSTR_LEN]; if (!strbuf) strbuf = staticbuf; /* not thread-safe */ num = port[0]; num <<= 8; num |= port[1]; do { num /= 10; ++len; } while (num); strbuf += len; num = port[0]; num <<= 8; num |= port[1]; do { *--strbuf = '0' + (num % 10); num /= 10; } while (num); while (len < PORTTOSTR_LEN) strbuf[len++] = 0; return strbuf; } tinyssh-20250501/porttostr.h000066400000000000000000000002111500472222400156740ustar00rootroot00000000000000#ifndef PORTTOSTR_H____ #define PORTTOSTR_H____ #define PORTTOSTR_LEN 6 extern char *porttostr(char *, const unsigned char *); #endif tinyssh-20250501/purge.h000066400000000000000000000001351500472222400147430ustar00rootroot00000000000000#ifndef PURGE_H____ #define PURGE_H____ #include "cleanup.h" #define purge cleanup_ #endif tinyssh-20250501/randombytes.c000066400000000000000000000020461500472222400161460ustar00rootroot00000000000000#include "randombytes.h" #include "haslibrandombytes.h" #ifndef HASLIBRANDOMBYTES #include #include #include #include static int fd = -1; __attribute__((constructor)) static void init(void) { if (fd == -1) { for (;;) { #ifdef O_CLOEXEC fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC); #else fd = open("/dev/urandom", O_RDONLY); fcntl(fd, F_SETFD, 1); #endif if (fd != -1) break; sleep(1); } } } void randombytes(void *xv, long long xlen) { long long i; unsigned char *x = xv; if (fd == -1) init(); while (xlen > 0) { if (xlen < 1048576) i = xlen; else i = 1048576; i = read(fd, x, i); if (i < 1) { sleep(1); continue; } x += i; xlen -= i; } #ifdef __GNUC__ __asm__ __volatile__("" : : "r"(xv) : "memory"); #endif } const char *randombytes_source(void) { return "kernel-devurandom"; } #endif tinyssh-20250501/randombytes.h000066400000000000000000000005531500472222400161540ustar00rootroot00000000000000#ifndef RANDOMBYTES_H____ #define RANDOMBYTES_H____ #include "haslibrandombytes.h" #ifdef HASLIBRANDOMBYTES #include #else #define randombytes randombytes_internal_void_voidstar_longlong #define randombytes_source randombytes_internal_source extern void randombytes(void *, long long); extern const char *randombytes_source(void); #endif #endif tinyssh-20250501/randommod.c000066400000000000000000000007161500472222400156010ustar00rootroot00000000000000/* taken from nacl-20110221, from curvecp/randommod.c - reformated using clang-format */ #include "randombytes.h" #include "randommod.h" /* XXX: current implementation is limited to n<2^55 */ long long randommod(long long n) { long long result = 0; long long j; unsigned char r[32]; if (n <= 1) return 0; randombytes(r, 32); for (j = 0; j < 32; ++j) result = (result * 256 + (unsigned long long) r[j]) % n; return result; } tinyssh-20250501/randommod.h000066400000000000000000000001401500472222400155750ustar00rootroot00000000000000#ifndef RANDOMMOD_H____ #define RANDOMMOD_H____ extern long long randommod(long long); #endif tinyssh-20250501/readall.c000066400000000000000000000011411500472222400152160ustar00rootroot00000000000000/* taken from nacl-20110221, from curvecp/load.c - reformated using clang-format */ #include #include "e.h" #include "readall.h" int readall(int fd, void *xv, long long xlen) { long long r; unsigned char *x = (unsigned char *) xv; while (xlen > 0) { r = xlen; if (r > 1048576) r = 1048576; r = read(fd, x, r); if (r == 0) errno = EPROTO; if (r <= 0) { if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) continue; return -1; } x += r; xlen -= r; } return 0; } tinyssh-20250501/readall.h000066400000000000000000000001411500472222400152220ustar00rootroot00000000000000#ifndef READALL_H____ #define READALL_H____ extern int readall(int, void *, long long); #endif tinyssh-20250501/runtest.sh000066400000000000000000000007071500472222400155150ustar00rootroot00000000000000#!/bin/sh LANG=C export LANG [ x"$1" = x ] && exit 100 script="$1" [ x"$2" = x ] && exit 100 outfile="$2" [ x"$3" = x ] && exit 100 expfile="$3" # run test sh "${script}" > "${outfile}" # compare if ! cmp "${expfile}" "${outfile}"; then echo "${script} FAILED" if [ x"`which diff`" != x ]; then # print diff diff -u "${expfile}" "${outfile}" else # print output file cat "${outfile}" fi exit 1 fi echo "${script} OK" exit 0 tinyssh-20250501/savesync.c000066400000000000000000000010741500472222400154520ustar00rootroot00000000000000/* taken from nacl-20110221, from curvecp/savesync.c - reformated using clang-format */ #include #include #include #include #include "open.h" #include "savesync.h" #include "writeall.h" static int writesync(int fd, const void *x, long long xlen) { if (writeall(fd, x, xlen) == -1) return -1; return fsync(fd); } int savesync(const char *fn, const void *x, long long xlen) { int fd; int r; fd = open_write(fn); if (fd == -1) return -1; r = writesync(fd, x, xlen); close(fd); return r; } tinyssh-20250501/savesync.h000066400000000000000000000001631500472222400154550ustar00rootroot00000000000000#ifndef SAVESYNC_H____ #define SAVESYNC_H____ extern int savesync(const char *, const void *, long long); #endif tinyssh-20250501/sc25519.c000066400000000000000000000033231500472222400146310ustar00rootroot00000000000000/* - based on tweetnacl 20140427 (http://tweetnacl.cr.yp.to/software.html) - reformated using clang-format */ #include "crypto_int64.h" #include "crypto_uint32.h" #include "crypto_uint64.h" #include "cleanup.h" #include "sc25519.h" #define FOR(i, n) for (i = 0; i < n; ++i) static const crypto_uint64 L[32] = { 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10}; static void modL(unsigned char *r, crypto_int64 x[64]) { crypto_int64 carry, i, j; for (i = 63; i >= 32; --i) { carry = 0; for (j = i - 32; j < i - 12; ++j) { x[j] += carry - 16 * x[i] * L[j - (i - 32)]; carry = (x[j] + 128) >> 8; x[j] -= carry << 8; } x[j] += carry; x[i] = 0; } carry = 0; FOR(j, 32) { x[j] += carry - (x[31] >> 4) * L[j]; carry = x[j] >> 8; x[j] &= 255; } FOR(j, 32) x[j] -= carry * L[j]; FOR(i, 32) { x[i + 1] += x[i] >> 8; r[i] = x[i] & 255; } } void sc25519_reduce(unsigned char *s) { crypto_int64 t[64], i; for (i = 0; i < 64; ++i) t[i] = s[i]; for (i = 0; i < 64; ++i) s[i] = 0; modL(s, t); cleanup(t); } void sc25519_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c) { crypto_int64 t[64], i, j; for (i = 0; i < 64; ++i) t[i] = 0; for (i = 0; i < 32; ++i) for (j = 0; j < 32; ++j) { t[i + j] += (crypto_int64) a[i] * (crypto_int64) b[j]; } for (i = 0; i < 32; ++i) t[i] += c[i]; modL(s, t); cleanup(t); } tinyssh-20250501/sc25519.h000066400000000000000000000003571500472222400146420ustar00rootroot00000000000000#ifndef SC25519_H____ #define SC25519_H____ extern void sc25519_reduce(unsigned char *); extern void sc25519_muladd(unsigned char *, const unsigned char *, const unsigned char *, const unsigned char *); #endif tinyssh-20250501/ssh.c000066400000000000000000000032611500472222400144140ustar00rootroot00000000000000#include #include "ssh.h" #define X(e, s) \ if (i == e) return s /* Return short name of signal. */ const char *ssh_sigstr(int i) { #ifdef SIGABRT X(SIGABRT, "ABRT"); #endif #ifdef SIGALRM X(SIGALRM, "ALRM"); #endif #ifdef SIGFPE X(SIGFPE, "FPE"); #endif #ifdef SIGHUP X(SIGHUP, "HUP"); #endif #ifdef SIGILL X(SIGILL, "ILL"); #endif #ifdef SIGINT X(SIGINT, "INT"); #endif #ifdef SIGKILL X(SIGKILL, "KILL"); #endif #ifdef SIGPIPE X(SIGPIPE, "PIPE"); #endif #ifdef SIGQUIT X(SIGQUIT, "QUIT"); #endif #ifdef SIGSEGV X(SIGSEGV, "SEGV"); #endif #ifdef SIGTERM X(SIGTERM, "TERM"); #endif #ifdef SIGUSR1 X(SIGUSR1, "USR1"); #endif #ifdef SIGUSR2 X(SIGUSR2, "USR2"); #endif return "UNKNOWN"; } /* Return long name of signal. */ const char *ssh_sigstrlong(int i) { #ifdef SIGABRT X(SIGABRT, "SIGABRT (abort)"); #endif #ifdef SIGALRM X(SIGALRM, "SIGALRM (alarm clock)"); #endif #ifdef SIGFPE X(SIGFPE, "SIGFPE (floating-point exception)"); #endif #ifdef SIGILL X(SIGILL, "SIGILL (illegal instruction)"); #endif #ifdef SIGINT X(SIGINT, "SIGINT (interrupt)"); #endif #ifdef SIGKILL X(SIGKILL, "SIGKILL (kill, unblockable)"); #endif #ifdef SIGPIPE X(SIGPIPE, "SIGPIPE (broken pipe)"); #endif #ifdef SIGQUIT X(SIGQUIT, "SIGQUIT (quit)"); #endif #ifdef SIGSEGV X(SIGSEGV, "SIGSEGV (segment violation)"); #endif #ifdef SIGTERM X(SIGTERM, "SIGTERM (termination)"); #endif #ifdef SIGUSR1 X(SIGUSR1, "SIGUSR1 (user defined signal 1)"); #endif #ifdef SIGUSR2 X(SIGUSR2, "SIGUSR2 (user defined signal 2)"); #endif return "UNKNOWN SIGNAL"; } tinyssh-20250501/ssh.h000066400000000000000000000065121500472222400144230ustar00rootroot00000000000000#ifndef SSH_H____ #define SSH_H____ extern const char *ssh_sigstr(int); extern const char *ssh_sigstrlong(int); #define SSH_MSG_DISCONNECT 1 /* 0x1 */ #define SSH_MSG_IGNORE 2 /* 0x2 */ #define SSH_MSG_UNIMPLEMENTED 3 /* 0x3 */ #define SSH_MSG_DEBUG 4 /* 0x4 */ #define SSH_MSG_SERVICE_REQUEST 5 /* 0x5 */ #define SSH_MSG_SERVICE_ACCEPT 6 /* 0x6 */ #define SSH_MSG_KEXINIT 20 /* 0x14 */ #define SSH_MSG_NEWKEYS 21 /* 0x15 */ #define SSH_MSG_KEXDH_INIT 30 /* 0x1e */ #define SSH_MSG_KEXDH_REPLY 31 /* 0x1f */ #define SSH_MSG_KEX_DH_GEX_REQUEST 30 /* 0x1e */ #define SSH_MSG_KEX_DH_GEX_GROUP 31 /* 0x1f */ #define SSH_MSG_KEX_DH_GEX_INIT 32 /* 0x20 */ #define SSH_MSG_KEX_DH_GEX_REPLY 33 /* 0x21 */ #define SSH_MSG_KEXRSA_PUBKEY 30 /* 0x1e */ #define SSH_MSG_KEXRSA_SECRET 31 /* 0x1f */ #define SSH_MSG_KEXRSA_DONE 32 /* 0x20 */ #define SSH_MSG_USERAUTH_REQUEST 50 /* 0x32 */ #define SSH_MSG_USERAUTH_FAILURE 51 /* 0x33 */ #define SSH_MSG_USERAUTH_SUCCESS 52 /* 0x34 */ #define SSH_MSG_USERAUTH_BANNER 53 /* 0x35 */ #define SSH_MSG_USERAUTH_PK_OK 60 /* 0x3c */ #define SSH_MSG_USERAUTH_PASSWD_CHANGEREQ 60 /* 0x3c */ #define SSH_MSG_USERAUTH_INFO_REQUEST 60 /* 0x3c */ #define SSH_MSG_USERAUTH_INFO_RESPONSE 61 /* 0x3d */ #define SSH_MSG_GLOBAL_REQUEST 80 /* 0x50 */ #define SSH_MSG_REQUEST_SUCCESS 81 /* 0x51 */ #define SSH_MSG_REQUEST_FAILURE 82 /* 0x52 */ #define SSH_MSG_CHANNEL_OPEN 90 /* 0x5a */ #define SSH_MSG_CHANNEL_OPEN_CONFIRMATION 91 /* 0x5b */ #define SSH_MSG_CHANNEL_OPEN_FAILURE 92 /* 0x5c */ #define SSH_MSG_CHANNEL_WINDOW_ADJUST 93 /* 0x5d */ #define SSH_MSG_CHANNEL_DATA 94 /* 0x5e */ #define SSH_MSG_CHANNEL_EXTENDED_DATA 95 /* 0x5f */ #define SSH_MSG_CHANNEL_EOF 96 /* 0x60 */ #define SSH_MSG_CHANNEL_CLOSE 97 /* 0x61 */ #define SSH_MSG_CHANNEL_REQUEST 98 /* 0x62 */ #define SSH_MSG_CHANNEL_SUCCESS 99 /* 0x63 */ #define SSH_MSG_CHANNEL_FAILURE 100 /* 0x64 */ #define SSH_MSG_USERAUTH_GSSAPI_RESPONSE 60 #define SSH_MSG_USERAUTH_GSSAPI_TOKEN 61 #define SSH_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE 63 #define SSH_MSG_USERAUTH_GSSAPI_ERROR 64 #define SSH_MSG_USERAUTH_GSSAPI_ERRTOK 65 #define SSH_MSG_USERAUTH_GSSAPI_MIC 66 #define SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1 #define SSH_DISCONNECT_PROTOCOL_ERROR 2 #define SSH_DISCONNECT_KEY_EXCHANGE_FAILED 3 #define SSH_DISCONNECT_RESERVED 4 #define SSH_DISCONNECT_MAC_ERROR 5 #define SSH_DISCONNECT_COMPRESSION_ERROR 6 #define SSH_DISCONNECT_SERVICE_NOT_AVAILABLE 7 #define SSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED 8 #define SSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE 9 #define SSH_DISCONNECT_CONNECTION_LOST 10 #define SSH_DISCONNECT_BY_APPLICATION 11 #define SSH_DISCONNECT_TOO_MANY_CONNECTIONS 12 #define SSH_DISCONNECT_AUTH_CANCELLED_BY_USER 13 #define SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE 14 #define SSH_DISCONNECT_ILLEGAL_USER_NAME 15 #define SSH_OPEN_ADMINISTRATIVELY_PROHIBITED 1 #define SSH_OPEN_CONNECT_FAILED 2 #define SSH_OPEN_UNKNOWN_CHANNEL_TYPE 3 #define SSH_OPEN_RESOURCE_SHORTAGE 4 #endif tinyssh-20250501/sshcrypto.c000066400000000000000000000034341500472222400156570ustar00rootroot00000000000000/* 20140225 20241210 - reformated using clang-format Jan Mojzis Public domain. */ #include "purge.h" #include "bug.h" #include "str.h" #include "sshcrypto.h" /* Initialize and check *MAX constants */ void sshcrypto_init(void) { long long i; /* kex */ for (i = 0; sshcrypto_kexs[i].name; ++i) { if (sshcrypto_kexs[i].kem_publickeybytes > sshcrypto_kem_PUBLICKEYMAX) bug_inval(); if (sshcrypto_kexs[i].kem_ciphertextbytes > sshcrypto_kem_CIPHERTEXTMAX) bug_inval(); if (sshcrypto_kexs[i].kem_bytes > sshcrypto_kem_MAX) bug_inval(); if (sshcrypto_kexs[i].hash_bytes > sshcrypto_hash_MAX) bug_inval(); } /* key */ for (i = 0; sshcrypto_keys[i].name; ++i) { if (sshcrypto_keys[i].sign_publickeybytes > sshcrypto_sign_PUBLICKEYMAX) bug_inval(); if (sshcrypto_keys[i].sign_secretkeybytes > sshcrypto_sign_SECRETKEYMAX) bug_inval(); if (sshcrypto_keys[i].sign_bytes > sshcrypto_sign_MAX) bug_inval(); if (str_len(sshcrypto_keys[i].name) + 1 > sshcrypto_sign_NAMEMAX) bug_inval(); } /* cipher */ for (i = 0; sshcrypto_ciphers[i].name; ++i) { if (sshcrypto_ciphers[i].stream_keybytes > sshcrypto_cipher_KEYMAX) bug_inval(); } } /* Remove sentitive data from allocated memory. */ void sshcrypto_purge(void) { long long i; /* kex */ for (i = 0; sshcrypto_kexs[i].name; ++i) { purge(&sshcrypto_kexs[i], sizeof(struct sshcrypto_kex)); } /* key */ for (i = 0; sshcrypto_keys[i].name; ++i) { purge(&sshcrypto_keys[i], sizeof(struct sshcrypto_key)); } /* cipher */ for (i = 0; sshcrypto_ciphers[i].name; ++i) { purge(&sshcrypto_ciphers[i], sizeof(struct sshcrypto_cipher)); } } tinyssh-20250501/sshcrypto.h000066400000000000000000000165551500472222400156740ustar00rootroot00000000000000#ifndef SSHCRYPTO_H____ #define SSHCRYPTO_H____ #include "buf.h" #include "crypto.h" /* crypto type */ #define sshcrypto_TYPEOLDCRYPTO 0x1 /* oldcrypto removed */ #define sshcrypto_TYPENEWCRYPTO \ 0x2 /* ssh-ed25519, curve25519-sha256@libssh.org, \ chacha20-poly1305@openssh.com */ #define sshcrypto_TYPEPQCRYPTO \ 0x4 /* TODO, TODO, chacha20-poly1305@openssh.com */ /* kex - kem + hash */ #define sshcrypto_kem_PUBLICKEYMAX crypto_kem_sntrup761x25519_PUBLICKEYBYTES #define sshcrypto_kem_CIPHERTEXTMAX crypto_kem_sntrup761x25519_CIPHERTEXTBYTES #define sshcrypto_kem_MAX crypto_kem_sntrup761x25519_BYTES #define sshcrypto_hash_MAX crypto_hash_sha512_BYTES #define sshcrypto_FLAGSTRICTKEX 0x1 struct sshcrypto_kex { const char *name; int (*enc)(unsigned char *, unsigned char *, const unsigned char *); long long kem_publickeybytes; long long kem_ciphertextbytes; long long kem_bytes; int (*hash)(unsigned char *, const unsigned char *, unsigned long long); long long hash_bytes; void (*buf_putkemkey)(struct buf *, const unsigned char *); unsigned int cryptotype; int flagenabled; }; extern struct sshcrypto_kex sshcrypto_kexs[]; struct sshcrypto_pseudokex { const char *name; const char *cname; int flag; }; extern struct sshcrypto_pseudokex sshcrypto_pseudokexs[]; extern int sshcrypto_kex_flags; extern const char *sshcrypto_kex_name; extern int (*sshcrypto_enc)(unsigned char *, unsigned char *, const unsigned char *); extern long long sshcrypto_kem_publickeybytes; extern long long sshcrypto_kem_ciphertextbytes; extern long long sshcrypto_kem_bytes; extern int (*sshcrypto_hash)(unsigned char *, const unsigned char *, unsigned long long); extern long long sshcrypto_hash_bytes; extern void (*sshcrypto_buf_putkemkey)(struct buf *, const unsigned char *); extern int sshcrypto_kex_select(const unsigned char *, long long, crypto_uint8 *); extern void sshcrypto_kex_put(struct buf *); #if defined(crypto_dh_x25519_BYTES) && defined(crypto_hash_sha256_BYTES) /* sshcrypto_kex_curve25519.c */ extern int curve25519_enc(unsigned char *, unsigned char *, const unsigned char *); extern void curve25519_putkemkey(struct buf *, const unsigned char *); #endif #if defined(crypto_kem_sntrup761x25519_BYTES) && \ defined(crypto_hash_sha512_BYTES) /* sshcrypto_kex_sntrup761x25519.c */ extern void sntrup761x25519_putkemkey(struct buf *, const unsigned char *); #endif /* key - sign */ #define sshcrypto_sign_PUBLICKEYMAX 32 /* space for ed25519 pk */ #define sshcrypto_sign_SECRETKEYMAX 64 /* space for ed25519 sk */ #define sshcrypto_sign_MAX 64 /* space for ed25519 sig */ #define sshcrypto_sign_BASE64PUBLICKEYMAX \ 69 /* space for ed25519 in base64 + 0-terminator */ #define sshcrypto_sign_BASE64PUBLICKEYMIN \ 69 /* space for ed25519 in base64 + 0-terminator */ #define sshcrypto_sign_NAMEMAX \ 12 /* space for string ssh-ed25519 + 0-terminator */ struct sshcrypto_key { const char *name; int (*sign)(unsigned char *, unsigned long long *, const unsigned char *, unsigned long long, const unsigned char *); int (*sign_open)(unsigned char *, unsigned long long *, const unsigned char *, unsigned long long, const unsigned char *); int (*sign_keypair)(unsigned char *, unsigned char *); unsigned char sign_publickey[sshcrypto_sign_PUBLICKEYMAX]; long long sign_publickeybytes; long long sign_secretkeybytes; long long sign_bytes; const char *sign_publickeyfilename; const char *sign_secretkeyfilename; unsigned int cryptotype; int sign_flagserver; int sign_flagclient; void (*buf_putsignature)(struct buf *, const unsigned char *); void (*buf_putsignpk)(struct buf *, const unsigned char *); void (*buf_putsignpkbase64)(struct buf *, const unsigned char *); int (*parsesignature)(unsigned char *, const unsigned char *, long long); int (*parsesignpk)(unsigned char *, const unsigned char *, long long); }; extern struct sshcrypto_key sshcrypto_keys[]; extern const char *sshcrypto_key_name; extern int (*sshcrypto_sign)(unsigned char *, unsigned long long *, const unsigned char *, unsigned long long, const unsigned char *); extern unsigned char *sshcrypto_sign_publickey; extern long long sshcrypto_sign_publickeybytes; extern long long sshcrypto_sign_secretkeybytes; extern long long sshcrypto_sign_bytes; extern const char *sshcrypto_sign_secretkeyfilename; extern void (*sshcrypto_buf_putsignature)(struct buf *, const unsigned char *); extern void (*sshcrypto_buf_putsignpk)(struct buf *, const unsigned char *); extern int sshcrypto_key_select(const unsigned char *, long long); extern void sshcrypto_key_put(struct buf *); #ifdef crypto_sign_ed25519_BYTES /* sshcrypto_key_ed25519.c */ extern void ed25519_putsignature(struct buf *, const unsigned char *); extern void ed25519_putsignpk(struct buf *, const unsigned char *); extern void ed25519_putsignpkbase64(struct buf *, const unsigned char *); extern int ed25519_parsesignpk(unsigned char *, const unsigned char *, long long); extern int ed25519_parsesignature(unsigned char *, const unsigned char *, long long); #endif /* cipher + mac */ #define sshcrypto_cipher_KEYMAX 128 /* space for 2 x sha512 */ struct sshcrypto_cipher { const char *name; int (*stream_xor)(unsigned char *, const unsigned char *, unsigned long long, const unsigned char *, const unsigned char *); int (*auth)(unsigned char *, const unsigned char *, unsigned long long, const unsigned char *); long long stream_keybytes; long long cipher_blockbytes; long long auth_bytes; void (*packet_put)(struct buf *); int (*packet_get)(struct buf *); unsigned int cryptotype; int flagenabled; }; extern struct sshcrypto_cipher sshcrypto_ciphers[]; extern const char *sshcrypto_cipher_name; extern int (*sshcrypto_stream_xor)(unsigned char *, const unsigned char *, unsigned long long, const unsigned char *, const unsigned char *); extern int (*sshcrypto_auth)(unsigned char *, const unsigned char *, unsigned long long, const unsigned char *); extern long long sshcrypto_stream_keybytes; extern long long sshcrypto_cipher_blockbytes; extern long long sshcrypto_auth_bytes; extern void (*sshcrypto_packet_put)(struct buf *); extern int (*sshcrypto_packet_get)(struct buf *); extern int sshcrypto_cipher_select(const unsigned char *, long long); extern int sshcrypto_cipher_macselect(const unsigned char *, long long); extern void sshcrypto_cipher_put(struct buf *); extern void sshcrypto_cipher_macput(struct buf *b); /* from sshcrypto_cipher_chachapoly.c */ extern void chachapoly_packet_put(struct buf *); extern int chachapoly_packet_get(struct buf *); /* init/purge */ extern void sshcrypto_init(void); extern void sshcrypto_purge(void); #endif tinyssh-20250501/sshcrypto_cipher.c000066400000000000000000000077201500472222400172130ustar00rootroot00000000000000/* 20140207 20241210 - reformated using clang-format Jan Mojzis Public domain. */ #include "crypto.h" #include "stringparser.h" #include "e.h" #include "log.h" #include "bug.h" #include "str.h" #include "byte.h" #include "packet.h" #include "sshcrypto.h" struct sshcrypto_cipher sshcrypto_ciphers[] = { { "chacha20-poly1305@openssh.com", crypto_stream_chacha20_xor, crypto_onetimeauth_poly1305, crypto_stream_chacha20_KEYBYTES * 2, 8, crypto_onetimeauth_poly1305_BYTES, chachapoly_packet_put, chachapoly_packet_get, sshcrypto_TYPENEWCRYPTO | sshcrypto_TYPEPQCRYPTO, 0, }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }; const char *sshcrypto_cipher_name = 0; int (*sshcrypto_stream_xor)(unsigned char *, const unsigned char *, unsigned long long, const unsigned char *, const unsigned char *) = 0; int (*sshcrypto_auth)(unsigned char *, const unsigned char *, unsigned long long, const unsigned char *) = 0; long long sshcrypto_stream_keybytes = 0; long long sshcrypto_cipher_blockbytes = 0; long long sshcrypto_auth_bytes = 0; void (*sshcrypto_packet_put)(struct buf *) = 0; int (*sshcrypto_packet_get)(struct buf *) = 0; int sshcrypto_cipher_select(const unsigned char *buf, long long len) { long long i, pos = 0; const unsigned char *x; long long xlen; if (sshcrypto_cipher_name) return 1; if (buf[len] != 0) bug_proto(); log_d2("kex: client: cipher algorithms: ", (const char *) buf); for (;;) { pos = stringparser(buf, len, pos, &x, &xlen); if (!pos) break; for (i = 0; sshcrypto_ciphers[i].name; ++i) { if (!sshcrypto_ciphers[i].flagenabled) continue; if (str_equaln((const char *) x, xlen, sshcrypto_ciphers[i].name)) { sshcrypto_cipher_name = sshcrypto_ciphers[i].name; sshcrypto_stream_xor = sshcrypto_ciphers[i].stream_xor; sshcrypto_auth = sshcrypto_ciphers[i].auth; sshcrypto_stream_keybytes = sshcrypto_ciphers[i].stream_keybytes; sshcrypto_cipher_blockbytes = sshcrypto_ciphers[i].cipher_blockbytes; sshcrypto_auth_bytes = sshcrypto_ciphers[i].auth_bytes; sshcrypto_packet_get = sshcrypto_ciphers[i].packet_get; sshcrypto_packet_put = sshcrypto_ciphers[i].packet_put; log_d2("kex: cipher selected: ", sshcrypto_ciphers[i].name); return 1; } } } log_d2("kex: cipher not available ", (const char *) buf); errno = EPROTO; return 0; } int sshcrypto_cipher_macselect(const unsigned char *buf, long long len) { if (buf[len] != 0) bug_proto(); log_d2("kex: client: mac algorithms: ", (const char *) buf); log_d1("kex: mac selected: hmac-sha2-256 (ignored for " "chacha20-poly1305@openssh.com)"); return 1; } void sshcrypto_cipher_put(struct buf *b) { crypto_uint32 len = 0; long long i, j, start; j = 0; for (i = 0; sshcrypto_ciphers[i].name; ++i) { if (!sshcrypto_ciphers[i].flagenabled) continue; if (j++) ++len; len += str_len(sshcrypto_ciphers[i].name); } buf_putnum32(b, len); start = b->len; j = 0; for (i = 0; sshcrypto_ciphers[i].name; ++i) { if (!sshcrypto_ciphers[i].flagenabled) continue; if (j++) buf_puts(b, ","); buf_puts(b, sshcrypto_ciphers[i].name); } b->buf[b->len] = 0; log_d2("kex: server: cipher algorithms: ", (char *) b->buf + start); } /* XXX some clients doesn't accept empty mac, we send hmac-sha2-256 (for chacha20-poly1305@openssh.com is hmac-sha2-256 string ignored) */ void sshcrypto_cipher_macput(struct buf *b) { buf_putstring(b, "hmac-sha2-256"); log_d1("kex: server: mac algorithms: hmac-sha2-256"); } tinyssh-20250501/sshcrypto_cipher_chachapoly.c000066400000000000000000000102131500472222400213750ustar00rootroot00000000000000/* 20140207 20241210 - reformated using clang-format Jan Mojzis Public domain. */ #include "crypto_uint32.h" #include "crypto_verify_16.h" #include "randommod.h" #include "e.h" #include "byte.h" #include "purge.h" #include "sshcrypto.h" #include "bug.h" #include "packet.h" #define BB sshcrypto_cipher_blockbytes #define AB sshcrypto_auth_bytes #define ZB 60 void chachapoly_packet_put(struct buf *b) { long long pos; crypto_uint8 paddinglen; struct buf *sendbuf = &packet.sendbuf; unsigned char n[8]; pos = sendbuf->len; /* get position */ buf_putzerobytes(sendbuf, ZB); /* zero bytes */ buf_putnum32(sendbuf, 0); /* the length */ buf_putnum8(sendbuf, 0); /* padding length */ buf_put(sendbuf, b->buf, b->len); /* add data */ /* pack nonce */ byte_zero(n, 4); crypto_uint32_store_bigendian(n + 4, packet.sendpacketid++); /* padding */ paddinglen = 2 * BB - ((sendbuf->len - pos - ZB) % BB) + 4; paddinglen += randommod(2) * BB; buf_putpadding(sendbuf, paddinglen); sendbuf->buf[pos + ZB + 4] = paddinglen; /* space for mac */ buf_putzerobytes(sendbuf, AB); /* encrypt data */ sshcrypto_stream_xor(sendbuf->buf + pos, sendbuf->buf + pos, sendbuf->len - pos - AB, n, packet.serverkey); /* add packet length */ crypto_uint32_store_bigendian(sendbuf->buf + pos + ZB, sendbuf->len - pos - AB - 4 - ZB); /* encrypt the length */ sshcrypto_stream_xor(sendbuf->buf + pos + ZB, sendbuf->buf + pos + ZB, 4, n, packet.serverkey + 32); purge(n, sizeof n); /* authenticate data */ sshcrypto_auth(sendbuf->buf + sendbuf->len - AB, sendbuf->buf + pos + ZB, sendbuf->len - AB - pos - ZB, sendbuf->buf + pos); /* remove zerobytes */ byte_copy(sendbuf->buf + pos, sendbuf->len - pos - ZB, sendbuf->buf + pos + ZB); sendbuf->len -= ZB; purge(sendbuf->buf + sendbuf->len, ZB); } int chachapoly_packet_get(struct buf *b) { long long len; struct buf *recvbuf = &packet.recvbuf; unsigned char buf[16]; unsigned char *pp; long long l; unsigned char n[8]; /* we need at least 4 bytes */ if (recvbuf->len - PACKET_ZEROBYTES < 4) { packet.packet_length = 0; return 1; } /* parse length */ byte_zero(n, 4); crypto_uint32_store_bigendian(n + 4, packet.receivepacketid); if (packet.packet_length == 0) { sshcrypto_stream_xor(buf, recvbuf->buf + PACKET_ZEROBYTES, 4, n, packet.clientkey + 32); packet.packet_length = crypto_uint32_load_bigendian(buf); } if (packet.packet_length > PACKET_LIMIT) bug_proto(); if (packet.packet_length + AB + 4 > recvbuf->len - PACKET_ZEROBYTES) return 1; /* verify and decrypt packet */ byte_zero(recvbuf->buf, 32); sshcrypto_stream_xor(recvbuf->buf, recvbuf->buf, 32, n, packet.clientkey); sshcrypto_auth(buf, recvbuf->buf + PACKET_ZEROBYTES, packet.packet_length + 4, recvbuf->buf); if (crypto_verify_16(buf, recvbuf->buf + PACKET_ZEROBYTES + packet.packet_length + 4) != 0) bug_proto(); purge(buf, sizeof buf); sshcrypto_stream_xor(recvbuf->buf + 4, recvbuf->buf + 4, packet.packet_length + PACKET_ZEROBYTES, n, packet.clientkey); purge(n, sizeof n); /* process packet */ len = packet.packet_length; len -= recvbuf->buf[PACKET_ZEROBYTES + 4] + 1; if (len <= 0) bug_proto(); buf_put(b, recvbuf->buf + PACKET_ZEROBYTES + 5, len); pp = recvbuf->buf + PACKET_ZEROBYTES; l = recvbuf->len - PACKET_ZEROBYTES; byte_copy(pp, l - packet.packet_length + AB + 4, pp + packet.packet_length + AB + 4); purge(pp + l - packet.packet_length + AB + 4, packet.packet_length + AB + 4); recvbuf->len -= packet.packet_length + AB + 4; /* packetid */ packet.receivepacketid++; /* cleanup */ packet.packet_length = 0; purge(recvbuf->buf, PACKET_ZEROBYTES); return 1; } tinyssh-20250501/sshcrypto_kex.c000066400000000000000000000120741500472222400165260ustar00rootroot00000000000000/* 20140203 20241210 - reformated using clang-format Jan Mojzis Public domain. */ #include "crypto.h" #include "stringparser.h" #include "str.h" #include "byte.h" #include "e.h" #include "log.h" #include "bug.h" #include "sshcrypto.h" struct sshcrypto_kex sshcrypto_kexs[] = { { "curve25519-sha256", curve25519_enc, crypto_scalarmult_curve25519_BYTES, /* pk */ crypto_scalarmult_curve25519_BYTES, /* c */ crypto_scalarmult_curve25519_BYTES, /* k */ crypto_hash_sha256, crypto_hash_sha256_BYTES, curve25519_putkemkey, sshcrypto_TYPENEWCRYPTO, 0, }, { "curve25519-sha256@libssh.org", curve25519_enc, crypto_scalarmult_curve25519_BYTES, /* pk */ crypto_scalarmult_curve25519_BYTES, /* c */ crypto_scalarmult_curve25519_BYTES, /* k */ crypto_hash_sha256, crypto_hash_sha256_BYTES, curve25519_putkemkey, sshcrypto_TYPENEWCRYPTO, 0, }, { "sntrup761x25519-sha512@openssh.com", crypto_kem_sntrup761x25519_enc, crypto_kem_sntrup761x25519_PUBLICKEYBYTES, /* pk */ crypto_kem_sntrup761x25519_CIPHERTEXTBYTES, /* c */ crypto_kem_sntrup761x25519_BYTES, /* k */ crypto_hash_sha512, crypto_hash_sha512_BYTES, sntrup761x25519_putkemkey, sshcrypto_TYPEPQCRYPTO, 0, }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }; struct sshcrypto_pseudokex sshcrypto_pseudokexs[] = { { "kex-strict-s-v00@openssh.com", "kex-strict-c-v00@openssh.com", sshcrypto_FLAGSTRICTKEX, }, { 0, 0, 0, }, }; int sshcrypto_kex_flags = 0; const char *sshcrypto_kex_name = 0; int (*sshcrypto_enc)(unsigned char *, unsigned char *, const unsigned char *) = 0; long long sshcrypto_kem_publickeybytes = 0; long long sshcrypto_kem_ciphertextbytes = 0; long long sshcrypto_kem_bytes = 0; int (*sshcrypto_hash)(unsigned char *, const unsigned char *, unsigned long long) = 0; long long sshcrypto_hash_bytes = 0; void (*sshcrypto_buf_putkemkey)(struct buf *, const unsigned char *) = 0; int sshcrypto_kex_select(const unsigned char *buf, long long len, crypto_uint8 *kex_guess) { long long i, pos; const unsigned char *x; long long xlen; if (sshcrypto_kex_name) return 1; if (buf[len] != 0) bug_proto(); log_d2("kex: client: kex algorithms: ", (const char *) buf); *kex_guess = 1; pos = 0; for (;;) { pos = stringparser(buf, len, pos, &x, &xlen); if (!pos) break; for (i = 0; sshcrypto_pseudokexs[i].name; ++i) { if (str_equaln((const char *) x, xlen, sshcrypto_pseudokexs[i].cname)) { log_d2("kex: pseudokex selected: ", sshcrypto_pseudokexs[i].name); sshcrypto_kex_flags |= sshcrypto_pseudokexs[i].flag; } } } pos = 0; for (;;) { pos = stringparser(buf, len, pos, &x, &xlen); if (!pos) break; for (i = 0; sshcrypto_kexs[i].name; ++i) { if (!sshcrypto_kexs[i].flagenabled) continue; if (str_equaln((const char *) x, xlen, sshcrypto_kexs[i].name)) { sshcrypto_kex_name = sshcrypto_kexs[i].name; sshcrypto_enc = sshcrypto_kexs[i].enc; sshcrypto_kem_publickeybytes = sshcrypto_kexs[i].kem_publickeybytes; sshcrypto_kem_ciphertextbytes = sshcrypto_kexs[i].kem_ciphertextbytes; sshcrypto_kem_bytes = sshcrypto_kexs[i].kem_bytes; sshcrypto_hash = sshcrypto_kexs[i].hash; sshcrypto_hash_bytes = sshcrypto_kexs[i].hash_bytes; sshcrypto_buf_putkemkey = sshcrypto_kexs[i].buf_putkemkey; log_d2("kex: kex selected: ", sshcrypto_kexs[i].name); return 1; } } *kex_guess = 0; } log_d2("kex: kex not available ", (const char *) buf); errno = EPROTO; return 0; } void sshcrypto_kex_put(struct buf *b) { crypto_uint32 len = 0; long long i, j, start; j = 0; for (i = 0; sshcrypto_kexs[i].name; ++i) { if (!sshcrypto_kexs[i].flagenabled) continue; if (j++) ++len; len += str_len(sshcrypto_kexs[i].name); } for (i = 0; sshcrypto_pseudokexs[i].name; ++i) { if (j++) ++len; len += str_len(sshcrypto_pseudokexs[i].name); } buf_putnum32(b, len); start = b->len; j = 0; for (i = 0; sshcrypto_kexs[i].name; ++i) { if (!sshcrypto_kexs[i].flagenabled) continue; if (j++) buf_puts(b, ","); buf_puts(b, sshcrypto_kexs[i].name); } for (i = 0; sshcrypto_pseudokexs[i].name; ++i) { if (j++) buf_puts(b, ","); buf_puts(b, sshcrypto_pseudokexs[i].name); } b->buf[b->len] = 0; log_d2("kex: server: kex algorithms: ", (char *) b->buf + start); } tinyssh-20250501/sshcrypto_kex_curve25519.c000066400000000000000000000013161500472222400203350ustar00rootroot00000000000000/* 20241114 Jan Mojzis Public domain. */ #include "buf.h" #include "crypto.h" #include "purge.h" #include "crypto_int16.h" #include "sshcrypto.h" int curve25519_enc(unsigned char *c, unsigned char *k, const unsigned char *pk) { unsigned char onetimesk[crypto_dh_x25519_SECRETKEYBYTES]; long long i; unsigned int d = 0; crypto_dh_x25519_keypair(/*onetimepk*/ c, onetimesk); crypto_dh_x25519(k, pk, onetimesk); purge(onetimesk, sizeof onetimesk); for (i = 0; i < crypto_dh_x25519_BYTES; ++i) d |= k[i]; return crypto_int16_zero_mask(d); } void curve25519_putkemkey(struct buf *b, const unsigned char *x) { buf_putsharedsecret(b, x, crypto_dh_x25519_BYTES); } tinyssh-20250501/sshcrypto_kex_sntrup761x25519.c000066400000000000000000000004301500472222400211660ustar00rootroot00000000000000/* 20210314 20241210 - reformated using clang-format Jan Mojzis Public domain. */ #include "buf.h" #include "crypto.h" #include "sshcrypto.h" void sntrup761x25519_putkemkey(struct buf *b, const unsigned char *x) { buf_putstringlen(b, x, crypto_kem_sntrup761x25519_BYTES); } tinyssh-20250501/sshcrypto_key.c000066400000000000000000000104051500472222400165230ustar00rootroot00000000000000/* 20140204 20241210 - reformated using clang-format Jan Mojzis Public domain. */ #include "crypto.h" #include "packetparser.h" #include "stringparser.h" #include "str.h" #include "byte.h" #include "e.h" #include "log.h" #include "bug.h" #include "purge.h" #include "sshcrypto.h" struct sshcrypto_key sshcrypto_keys[] = { { "ssh-ed25519", crypto_sign_ed25519, crypto_sign_ed25519_open, crypto_sign_ed25519_keypair, {0}, crypto_sign_ed25519_PUBLICKEYBYTES, crypto_sign_ed25519_SECRETKEYBYTES, crypto_sign_ed25519_BYTES, "ed25519.pk", ".ed25519.sk", sshcrypto_TYPENEWCRYPTO, 0, 0, ed25519_putsignature, ed25519_putsignpk, ed25519_putsignpkbase64, ed25519_parsesignature, ed25519_parsesignpk, }, #if 0 { "pqkeyTODO", crypto_sign_ed25519, crypto_sign_ed25519_open, crypto_sign_ed25519_keypair, {0}, crypto_sign_ed25519_PUBLICKEYBYTES, crypto_sign_ed25519_SECRETKEYBYTES, crypto_sign_ed25519_BYTES, "pqkeyTODO.pk", ".pqkeyTODO.sk", sshcrypto_TYPEPQCRYPTO, 0, 0, ed25519_putsignature, ed25519_putsignpk, ed25519_putsignpkbase64, ed25519_parsesignature, ed25519_parsesignpk, }, #endif { 0, 0, 0, 0, {0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }; const char *sshcrypto_key_name = 0; int (*sshcrypto_sign)(unsigned char *, unsigned long long *, const unsigned char *, unsigned long long, const unsigned char *) = 0; unsigned char *sshcrypto_sign_publickey = 0; long long sshcrypto_sign_publickeybytes = 0; long long sshcrypto_sign_secretkeybytes = 0; long long sshcrypto_sign_bytes = 0; const char *sshcrypto_sign_secretkeyfilename = 0; void (*sshcrypto_buf_putsignature)(struct buf *, const unsigned char *) = 0; void (*sshcrypto_buf_putsignpk)(struct buf *, const unsigned char *) = 0; int sshcrypto_key_select(const unsigned char *buf, long long len) { long long i, pos = 0; const unsigned char *x; long long xlen; if (sshcrypto_key_name) return 1; if (buf[len] != 0) bug_proto(); log_d2("kex: client: key algorithms: ", (const char *) buf); for (;;) { pos = stringparser(buf, len, pos, &x, &xlen); if (!pos) break; for (i = 0; sshcrypto_keys[i].name; ++i) { if (!sshcrypto_keys[i].sign_flagserver) continue; if (str_equaln((const char *) x, xlen, sshcrypto_keys[i].name)) { sshcrypto_key_name = sshcrypto_keys[i].name; sshcrypto_sign = sshcrypto_keys[i].sign; sshcrypto_sign_publickey = sshcrypto_keys[i].sign_publickey; sshcrypto_sign_publickeybytes = sshcrypto_keys[i].sign_publickeybytes; sshcrypto_sign_secretkeybytes = sshcrypto_keys[i].sign_secretkeybytes; sshcrypto_sign_bytes = sshcrypto_keys[i].sign_bytes; sshcrypto_sign_secretkeyfilename = sshcrypto_keys[i].sign_secretkeyfilename; sshcrypto_buf_putsignature = sshcrypto_keys[i].buf_putsignature; sshcrypto_buf_putsignpk = sshcrypto_keys[i].buf_putsignpk; log_d2("kex: key selected: ", sshcrypto_keys[i].name); return 1; } } } log_d2("kex: key not available ", (const char *) buf); errno = EPROTO; return 0; } void sshcrypto_key_put(struct buf *b) { crypto_uint32 len = 0; long long i, j, start; j = 0; for (i = 0; sshcrypto_keys[i].name; ++i) { if (!sshcrypto_keys[i].sign_flagserver) continue; if (j++) ++len; len += str_len(sshcrypto_keys[i].name); } buf_putnum32(b, len); start = b->len; j = 0; for (i = 0; sshcrypto_keys[i].name; ++i) { if (!sshcrypto_keys[i].sign_flagserver) continue; if (j++) buf_puts(b, ","); buf_puts(b, sshcrypto_keys[i].name); } b->buf[b->len] = 0; log_d2("kex: server: key algorithms: ", (char *) b->buf + start); } tinyssh-20250501/sshcrypto_key_ed25519.c000066400000000000000000000042361500472222400176060ustar00rootroot00000000000000/* 20140204 20241210 - reformated using clang-format Jan Mojzis Public domain. */ #include "crypto.h" #include "packetparser.h" #include "buf.h" #include "byte.h" #include "str.h" #include "purge.h" #include "sshcrypto.h" void ed25519_putsignature(struct buf *b, const unsigned char *x) { const char *name = "ssh-ed25519"; long long len = crypto_sign_ed25519_BYTES; buf_putnum32(b, len + str_len(name) + 8); buf_putstring(b, name); buf_putstringlen(b, x, len); } void ed25519_putsignpk(struct buf *b, const unsigned char *x) { const char *name = "ssh-ed25519"; long long len = crypto_sign_ed25519_PUBLICKEYBYTES; buf_putnum32(b, len + str_len(name) + 8); buf_putstring(b, name); buf_putstringlen(b, x, len); } void ed25519_putsignpkbase64(struct buf *b, const unsigned char *x) { unsigned char buf[19 + crypto_sign_ed25519_PUBLICKEYBYTES]; byte_copy(buf, 19, "\0\0\0\013ssh-ed25519\0\0\0\040"); byte_copy(buf + 19, crypto_sign_ed25519_PUBLICKEYBYTES, x); buf_putbase64(b, buf, sizeof buf); purge(buf, sizeof buf); } int ed25519_parsesignpk(unsigned char *buf, const unsigned char *x, long long xlen) { long long pos = 0; crypto_uint32 len; pos = packetparser_uint32(x, xlen, pos, &len); pos = packetparser_skip(x, xlen, pos, len); if (!str_equaln((const char *) x + pos - len, len, "ssh-ed25519")) return 0; pos = packetparser_uint32(x, xlen, pos, &len); if (len != crypto_sign_ed25519_PUBLICKEYBYTES) return 0; pos = packetparser_copy(x, xlen, pos, buf, len); pos = packetparser_end(x, xlen, pos); return 1; } int ed25519_parsesignature(unsigned char *buf, const unsigned char *x, long long xlen) { long long pos = 0; crypto_uint32 len; pos = packetparser_uint32(x, xlen, pos, &len); pos = packetparser_skip(x, xlen, pos, len); if (!str_equaln((const char *) x + pos - len, len, "ssh-ed25519")) return 0; pos = packetparser_uint32(x, xlen, pos, &len); if (len != crypto_sign_ed25519_BYTES) return 0; pos = packetparser_copy(x, xlen, pos, buf, len); pos = packetparser_end(x, xlen, pos); return 1; } tinyssh-20250501/str.c000066400000000000000000000026311500472222400144270ustar00rootroot00000000000000#include "str.h" /* The 'str_len(s)' function calculates the length of the string 's'. */ long long str_len(const char *s) { long long i; for (i = 0; s[i]; ++i); return i; } /* The 'str_start(s,t)' function returns 1 if t is a prefix of s, 0 otherwise. */ int str_start(const char *s, const char *t) { char x; for (;;) { x = *t++; if (!x) return 1; if (x != *s++) return 0; } } /* The 'str_equaln(y,ylen,x)' function returns 1 if the length of string 'x' is ylen and if y and x match up to, 0 otherwise. */ int str_equaln(const char *y, long long ylen, const char *x) { long long i; if (str_len(x) != ylen) return 0; for (i = 0; i < ylen; ++i) if (y[i] != x[i]) return 0; return 1; } /* The 'str_copyn(y,ylen,x)' function copies the string pointed to by 'x' (including \0) to the buffer pointed to by 'y'. If the length of string x is smaller than ylen or equal, then function returns 1. If the length of string x is biger than ylen, then only ylen - 1 bytes of 'x' are copied and function returns 0. The 'y' string is always \0 terminated. */ int str_copyn(char *y, long long ylen, const char *x) { long long len = str_len(x); int ret = 1; if (ylen <= 0) return 0; if (ylen - 1 < len) { len = ylen - 1; ret = 0; } y[len] = 0; while (len > 0) { *y++ = *x++; --len; } return ret; } tinyssh-20250501/str.h000066400000000000000000000003741500472222400144360ustar00rootroot00000000000000#ifndef STR_H____ #define STR_H____ extern long long str_len(const char *); extern int str_start(const char *, const char *); extern int str_equaln(const char *, long long, const char *); extern int str_copyn(char *, long long, const char *); #endif tinyssh-20250501/stringparser.c000066400000000000000000000014351500472222400163430ustar00rootroot00000000000000/* 20140203 20241208 - reformated using clang-format Jan Mojzis Public domain. */ #include "byte.h" #include "e.h" #include "bug.h" #include "stringparser.h" /* The 'stringparser' function parses items from comma-separated list. Empty strings are ignored. */ long long stringparser(const unsigned char *buf, long long len, long long pos, const unsigned char **x, long long *xlen) { long long i; if (!buf || len < 0 || len > 1073741824 || pos < 0 || pos > 1073741824 || !x || !xlen) bug_inval(); for (;;) { if (pos >= len) return 0; for (i = pos; i < len; ++i) { if (buf[i] == ',') break; } *x = buf + pos; *xlen = i - pos; pos = i + 1; if (*xlen != 0) return pos; } } tinyssh-20250501/stringparser.h000066400000000000000000000003161500472222400163450ustar00rootroot00000000000000#ifndef STRINGPARSER_H____ #define STRINGPARSER_H____ extern long long stringparser(const unsigned char *, long long, long long, const unsigned char **, long long *); #endif tinyssh-20250501/subprocess.h000066400000000000000000000007541500472222400160200ustar00rootroot00000000000000#ifndef SUBPROCESS_H____ #define SUBPROCESS_H____ #include extern int subprocess_sign(unsigned char *, long long, const char *, unsigned char *, long long); extern int subprocess_auth(const char *, const char *, const char *); extern int subprocess_auth_checkpath_(char *, long long, uid_t); extern int subprocess_auth_authorizedkeys_(const char *, const char *, const char *, char *, long long); #endif tinyssh-20250501/subprocess_auth.c000066400000000000000000000116371500472222400170360ustar00rootroot00000000000000/* 20140214 20241208 - reformated using clang-format Jan Mojzis Public domain. */ #include #include #include #include #include #include "str.h" #include "open.h" #include "dropuidgid.h" #include "global.h" #include "e.h" #include "log.h" #include "sshcrypto.h" #include "getln.h" #include "bug.h" #include "limit.h" #include "subprocess.h" static int findnameandkey(const char *keyname, const char *key, char *x) { if (!str_start(x, keyname)) return 0; x += str_len(keyname); if (*x != ' ') return 0; x += 1; if (!str_start(x, key)) return 0; x += str_len(key); if (*x == ' ') return 1; if (*x == '\n') return 1; if (*x == '\r') return 1; if (*x == 0) return 1; return 0; } static void check(uid_t uid, const char *d, const char *f, long long *err) { struct stat st; int e = 0; if (f) { if (stat(f, &st) == -1) { log_w4("auth: unable to stat file: ", d, "/", f); e = 1; } if (e == 0 && !S_ISREG(st.st_mode)) { errno = EACCES; log_w4("auth: non-regular file: ", d, "/", f); e = 1; } } else { if (stat(d, &st) == -1) { log_w4("auth: unable to stat directory: ", d, "/", f); e = 1; } if (e == 0 && !S_ISDIR(st.st_mode)) { errno = ENOTDIR; log_w4("auth: unable to stat directory: ", d, "/", f); e = 1; } } if (e == 0 && (st.st_mode & 022) != 0) { errno = EACCES; log_w4("auth: bad mode: directory writable by group or others: ", d, "/", f); e = 1; } if (e == 0 && st.st_uid != uid && st.st_uid != 0) { errno = EACCES; log_w4("auth: bad owner: ", d, "/", f); e = 1; } if (e) *err = 1; else log_d4("auth: path: ok: ", d, "/", f); } int subprocess_auth_checkpath_(char *path, long long pathlen, uid_t uid) { long long err = 0, j, i; if (pathlen <= 16) return 0; if (!getcwd(path, pathlen)) return 0; for (i = 0; i < pathlen; ++i) if (path[i] == 0) break; if (i == pathlen) return 0; check(uid, path, "authorized_keys", &err); do { check(uid, path, 0, &err); for (j = i; j >= 0; --j) { if (path[j] == '/') { path[j] = 0; i = j; break; } } } while (j > 0); return (err == 0); } int subprocess_auth_authorizedkeys_(const char *keyname, const char *key, const char *dir, char *buf, long long bufmax) { int fd = -1; int r; fd = open_read("authorized_keys"); if (fd == -1) { log_w3("auth: unable to open file: ", dir, "/.ssh/authorized_keys"); return 0; } do { r = getln(fd, buf, bufmax); if (r == -1) { log_w3("auth: unable to read from file ", dir, "/.ssh/authorized_keys"); return 0; } if (findnameandkey(keyname, key, buf)) return 1; /* authorized */ } while (r > 0); log_w1("auth: unable to authorize using authorized_keys: key not found"); return 0; } /* The 'subprocess_auth' is used for authorization using ~/.ssh/authorized_keys file. */ int subprocess_auth(const char *account, const char *keyname, const char *key) { pid_t pid; int status; pid = fork(); if (pid == -1) return -1; if (pid == 0) { #define buf global_bspace2 /* reusing global buffer */ struct passwd *pw; if (!account || !keyname || !key) bug_inval(); if (sshcrypto_sign_BASE64PUBLICKEYMIN > str_len(key) + 1) bug_inval(); /* drop privileges */ pw = getpwnam(account); if (!pw) { log_w3("auth: account ", account, ": not exist"); global_die(111); } if (!dropuidgid(pw->pw_name, pw->pw_uid, pw->pw_gid)) { log_w2("auth: unable to drop privileges to account ", account); global_die(111); } /* change directory to ~/.ssh */ if (chdir(pw->pw_dir) == -1) { log_w2("auth: unable to change directory to ", pw->pw_dir); global_die(111); } if (chdir(".ssh") == -1) { log_w3("auth: unable to change directory to ", pw->pw_dir, "/.ssh"); global_die(111); } /* authorization starts here */ if (!subprocess_auth_checkpath_((char *) buf, sizeof buf, pw->pw_uid)) global_die(111); if (!subprocess_auth_authorizedkeys_(keyname, key, pw->pw_dir, (char *) buf, sizeof buf)) global_die(111); /* authorization ends here */ global_die(0); } while (waitpid(pid, &status, 0) != pid) {} if (!WIFEXITED(status)) return -1; return WEXITSTATUS(status); } tinyssh-20250501/subprocess_sign.c000066400000000000000000000054021500472222400170260ustar00rootroot00000000000000/* 20140117 20241208 - reformated using clang-format Jan Mojzis Public domain. */ #include #include #include #include "load.h" #include "log.h" #include "open.h" #include "writeall.h" #include "purge.h" #include "global.h" #include "bug.h" #include "e.h" #include "purge.h" #include "readall.h" #include "blocking.h" #include "sshcrypto.h" #include "subprocess.h" /* The 'subprocess_sign' function reads secret-key from 'keydir' and signs the data 'x' of length 'xlen' and returns it in 'y'. Caller is expecting 'y' of length 'ylen'. Signing is done in a different process, so secret-key is in a separate memory space than rest of the program. */ int subprocess_sign(unsigned char *y, long long ylen, const char *keydir, unsigned char *x, long long xlen) { pid_t pid; int status, fromchild[2] = {-1, -1}; if (ylen != sshcrypto_sign_bytes) bug_inval(); if (xlen != sshcrypto_hash_bytes) bug_inval(); if (!y || !keydir || !x) bug_inval(); if (open_pipe(fromchild) == -1) return -1; pid = fork(); if (pid == -1) { close(fromchild[0]); close(fromchild[1]); return -1; } if (pid == 0) { unsigned char sk[sshcrypto_sign_SECRETKEYMAX]; unsigned char sm[sshcrypto_sign_MAX + sshcrypto_hash_MAX]; unsigned long long smlen; close(fromchild[0]); /* signing starts here */ if (chdir(keydir) == -1) { log_w2("sign: unable to change directory to ", keydir); global_die(111); } if (load(sshcrypto_sign_secretkeyfilename, sk, sshcrypto_sign_secretkeybytes) == -1) { log_w4("sign: unable to load secret-key from file ", keydir, "/", sshcrypto_sign_secretkeyfilename); purge(sk, sizeof sk); global_die(111); } if (sshcrypto_sign(sm, &smlen, x, sshcrypto_hash_bytes, sk) != 0) { log_w4("sign: unable to sign using secret-key from file ", keydir, "/", sshcrypto_sign_secretkeyfilename); purge(sk, sizeof sk); global_die(111); } purge(sk, sizeof sk); if (writeall(fromchild[1], sm, sshcrypto_sign_bytes) == -1) { log_w1("sign: unable to write signature to parrent process"); global_die(111); } close(fromchild[1]); /* signing ends here */ purge(sm, sizeof sm); global_die(0); } close(fromchild[1]); blocking_enable(fromchild[0]); if (readall(fromchild[0], y, ylen) == -1) { close(fromchild[0]); return -1; } close(fromchild[0]); while (waitpid(pid, &status, 0) != pid) {} if (!WIFEXITED(status)) return -1; return WEXITSTATUS(status); } tinyssh-20250501/test-crypto-dh.exp000066400000000000000000000001201500472222400170460ustar00rootroot00000000000000--- test-crypto dh dh_x25519 offset 0 dh_x25519 offset 1 all tests succeeded 0 tinyssh-20250501/test-crypto-dh.sh000066400000000000000000000001121500472222400166650ustar00rootroot00000000000000#!/bin/sh echo '--- test-crypto dh' ./test-crypto dh echo $? echo exit 0 tinyssh-20250501/test-crypto-hash.exp000066400000000000000000000002001500472222400173750ustar00rootroot00000000000000--- test-crypto hash hash_sha256 offset 0 hash_sha256 offset 1 hash_sha512 offset 0 hash_sha512 offset 1 all tests succeeded 0 tinyssh-20250501/test-crypto-hash.sh000066400000000000000000000001161500472222400172210ustar00rootroot00000000000000#!/bin/sh echo '--- test-crypto hash' ./test-crypto hash echo $? echo exit 0 tinyssh-20250501/test-crypto-kem.exp000066400000000000000000000001311500472222400172310ustar00rootroot00000000000000--- test-crypto kem kem_sntrup761 offset 0 kem_sntrup761 offset 1 all tests succeeded 0 tinyssh-20250501/test-crypto-kem.sh000066400000000000000000000001141500472222400170500ustar00rootroot00000000000000#!/bin/sh echo '--- test-crypto kem' ./test-crypto kem echo $? echo exit 0 tinyssh-20250501/test-crypto-onetimeauth.exp000066400000000000000000000001571500472222400210070ustar00rootroot00000000000000--- test-crypto onetimeauth onetimeauth_poly1305 offset 0 onetimeauth_poly1305 offset 1 all tests succeeded 0 tinyssh-20250501/test-crypto-onetimeauth.sh000066400000000000000000000001341500472222400206200ustar00rootroot00000000000000#!/bin/sh echo '--- test-crypto onetimeauth' ./test-crypto onetimeauth echo $? echo exit 0 tinyssh-20250501/test-crypto-sign.exp000066400000000000000000000001301500472222400174140ustar00rootroot00000000000000--- test-crypto sign sign_ed25519 offset 0 sign_ed25519 offset 1 all tests succeeded 0 tinyssh-20250501/test-crypto-sign.sh000066400000000000000000000001161500472222400172360ustar00rootroot00000000000000#!/bin/sh echo '--- test-crypto sign' ./test-crypto sign echo $? echo exit 0 tinyssh-20250501/test-crypto-sort.exp000066400000000000000000000001011500472222400174410ustar00rootroot00000000000000--- test-crypto sort sort_uint32 offset 0 all tests succeeded 0 tinyssh-20250501/test-crypto-sort.sh000066400000000000000000000001161500472222400172650ustar00rootroot00000000000000#!/bin/sh echo '--- test-crypto sort' ./test-crypto sort echo $? echo exit 0 tinyssh-20250501/test-crypto-verify.exp000066400000000000000000000001721500472222400177660ustar00rootroot00000000000000--- test-crypto verify verify_16 offset 0 verify_16 offset 1 verify_32 offset 0 verify_32 offset 1 all tests succeeded 0 tinyssh-20250501/test-crypto-verify.sh000066400000000000000000000001221500472222400175770ustar00rootroot00000000000000#!/bin/sh echo '--- test-crypto verify' ./test-crypto verify echo $? echo exit 0 tinyssh-20250501/test-crypto.c000066400000000000000000000341061500472222400161160ustar00rootroot00000000000000/* derived from djb work from lib25519/libntruprime mj modifications: - rename files to test-crypto.c and _crypto_<>.<>.inc - fix compiler warnings - include crypto.h - use less rounds for valgrind test - reformat using clang-format */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "crypto_uint8.h" #include "crypto_uint32.h" #include "crypto_uint64.h" #include "crypto_declassify.h" #include "crypto.h" const char *targeto = 0; const char *targetp = 0; const char *targeti = 0; const char *targetn = 0; const char *targetoffset = 0; int ok = 1; #define fail ((ok = 0), printf) /* ----- valgrind support */ int valgrind = 0; static unsigned char valgrind_undefined_byte = 0; static char *volatile valgrind_pointer = 0; static char *valgrind_malloc_1(void) { char *x = malloc(1); if (!x) abort(); *(char **volatile) &valgrind_pointer = x; return valgrind_pointer; } static void valgrind_init(void) { char *e = getenv("valgrind_multiplier"); char *x; if (!e) return; x = valgrind_malloc_1(); valgrind_undefined_byte = x[0] + 1; valgrind_undefined_byte *= atoi(e); valgrind_undefined_byte ^= x[0] + 1; free(x); valgrind = 1; } void secret(void *xvoid, long long xlen) { unsigned char *x = xvoid; while (xlen > 0) { *x ^= valgrind_undefined_byte; ++x; --xlen; } } void public(void *x, long long xlen) { crypto_declassify(x, xlen); } /* ----- rng and hash, from supercop/try-anything.c */ typedef crypto_uint8 u8; typedef crypto_uint32 u32; typedef crypto_uint64 u64; #define FOR(i, n) for (i = 0; i < n; ++i) static u32 L32(u32 x, int c) { return (x << c) | ((x & 0xffffffff) >> (32 - c)); } static u32 ld32(const u8 *x) { u32 u = x[3]; u = (u << 8) | x[2]; u = (u << 8) | x[1]; return (u << 8) | x[0]; } static void st32(u8 *x, u32 u) { int i; FOR(i, 4) { x[i] = u; u >>= 8; } } static const u8 sigma[17] = "expand 32-byte k"; static void core_salsa(u8 *out, const u8 *in, const u8 *k) { u32 w[16], x[16], y[16], t[4]; int i, j, m; FOR(i, 4) { x[5 * i] = ld32(sigma + 4 * i); x[1 + i] = ld32(k + 4 * i); x[6 + i] = ld32(in + 4 * i); x[11 + i] = ld32(k + 16 + 4 * i); } FOR(i, 16) y[i] = x[i]; FOR(i, 20) { FOR(j, 4) { FOR(m, 4) t[m] = x[(5 * j + 4 * m) % 16]; t[1] ^= L32(t[0] + t[3], 7); t[2] ^= L32(t[1] + t[0], 9); t[3] ^= L32(t[2] + t[1], 13); t[0] ^= L32(t[3] + t[2], 18); FOR(m, 4) w[4 * j + (j + m) % 4] = t[m]; } FOR(m, 16) x[m] = w[m]; } FOR(i, 16) st32(out + 4 * i, x[i] + y[i]); } static void salsa20(u8 *c, u64 b, const u8 *n, const u8 *k) { u8 z[16], x[64]; u32 u, i; if (!b) return; FOR(i, 16) z[i] = 0; FOR(i, 8) z[i] = n[i]; while (b >= 64) { core_salsa(x, z, k); FOR(i, 64) c[i] = x[i]; u = 1; for (i = 8; i < 16; ++i) { u += (u32) z[i]; z[i] = u; u >>= 8; } b -= 64; c += 64; } if (b) { core_salsa(x, z, k); FOR(i, b) c[i] = x[i]; } } static void increment(u8 *n) { if (!++n[0]) if (!++n[1]) if (!++n[2]) if (!++n[3]) if (!++n[4]) if (!++n[5]) if (!++n[6]) if (!++n[7]) { ; } } static unsigned char testvector_n[8]; static void testvector_clear(void) { memset(testvector_n, 0, sizeof testvector_n); } static void testvector(unsigned char *x, unsigned long long xlen) { static const unsigned char testvector_k[33] = "generate inputs for test vectors"; salsa20(x, xlen, testvector_n, testvector_k); increment(testvector_n); } unsigned long long myrandom(void) { unsigned char x[8]; unsigned long long result; testvector(x, 8); result = x[7]; result = (result << 8) | x[6]; result = (result << 8) | x[5]; result = (result << 8) | x[4]; result = (result << 8) | x[3]; result = (result << 8) | x[2]; result = (result << 8) | x[1]; result = (result << 8) | x[0]; return result; } static unsigned char canary_n[8]; static void canary(unsigned char *x, unsigned long long xlen) { static const unsigned char canary_k[33] = "generate pad to catch overwrites"; salsa20(x, xlen, canary_n, canary_k); increment(canary_n); } void double_canary(unsigned char *x2, unsigned char *x, unsigned long long xlen) { if (valgrind) return; canary(x - 16, 16); canary(x + xlen, 16); memcpy(x2 - 16, x - 16, 16); memcpy(x2 + xlen, x + xlen, 16); } void input_prepare(unsigned char *x2, unsigned char *x, unsigned long long xlen) { testvector(x, xlen); if (valgrind) { memcpy(x2, x, xlen); return; } canary(x - 16, 16); canary(x + xlen, 16); memcpy(x2 - 16, x - 16, xlen + 32); } void input_compare(const unsigned char *x2, const unsigned char *x, unsigned long long xlen, const char *fun) { if (valgrind) return; if (memcmp(x2 - 16, x - 16, xlen + 32)) { fail("failure: %s overwrites input\n", fun); } } void output_prepare(unsigned char *x2, unsigned char *x, unsigned long long xlen) { if (valgrind) { memcpy(x2, x, xlen); return; } canary(x - 16, xlen + 32); memcpy(x2 - 16, x - 16, xlen + 32); } void output_compare(const unsigned char *x2, const unsigned char *x, unsigned long long xlen, const char *fun) { if (valgrind) return; if (memcmp(x2 - 16, x - 16, 16)) { fail("failure: %s writes before output\n", fun); } if (memcmp(x2 + xlen, x + xlen, 16)) { fail("failure: %s writes after output\n", fun); } } /* ----- knownrandombytes */ static const int knownrandombytes_is_only_for_testing_not_for_cryptographic_use = 1; #define knownrandombytes randombytes #define QUARTERROUND(a, b, c, d) \ a += b; \ d = L32(d ^ a, 16); \ c += d; \ b = L32(b ^ c, 12); \ a += b; \ d = L32(d ^ a, 8); \ c += d; \ b = L32(b ^ c, 7); static void core_chacha(u8 *out, const u8 *in, const u8 *k) { u32 x[16], y[16]; int i, j; FOR(i, 4) { x[i] = ld32(sigma + 4 * i); x[12 + i] = ld32(in + 4 * i); } FOR(i, 8) x[4 + i] = ld32(k + 4 * i); FOR(i, 16) y[i] = x[i]; FOR(i, 10) { FOR(j, 4){QUARTERROUND(x[j], x[j + 4], x[j + 8], x[j + 12])} FOR(j, 4) { QUARTERROUND(x[j], x[((j + 1) & 3) + 4], x[((j + 2) & 3) + 8], x[((j + 3) & 3) + 12]) } } FOR(i, 16) st32(out + 4 * i, x[i] + y[i]); } static void chacha20(u8 *c, u64 b, const u8 *n, const u8 *k) { u8 z[16], x[64]; u32 u, i; if (!b) return; FOR(i, 16) z[i] = 0; FOR(i, 8) z[i + 8] = n[i]; while (b >= 64) { core_chacha(x, z, k); FOR(i, 64) c[i] = x[i]; u = 1; FOR(i, 8) { u += (u32) z[i]; z[i] = u; u >>= 8; } b -= 64; c += 64; } if (b) { core_chacha(x, z, k); FOR(i, b) c[i] = x[i]; } } #define crypto_rng_OUTPUTBYTES 736 static int crypto_rng(unsigned char *r, /* random output */ unsigned char *n, /* new key */ const unsigned char *g /* old key */ ) { static const unsigned char nonce[8] = {0}; unsigned char x[32 + crypto_rng_OUTPUTBYTES]; chacha20(x, sizeof x, nonce, g); memcpy(n, x, 32); memcpy(r, x + 32, crypto_rng_OUTPUTBYTES); return 0; } static unsigned char knownrandombytes_g[32]; static unsigned char knownrandombytes_r[crypto_rng_OUTPUTBYTES]; static unsigned long long knownrandombytes_pos = crypto_rng_OUTPUTBYTES; static void knownrandombytes_clear(void) { memset(knownrandombytes_g, 0, sizeof knownrandombytes_g); memset(knownrandombytes_r, 0, sizeof knownrandombytes_r); knownrandombytes_pos = crypto_rng_OUTPUTBYTES; } void knownrandombytes_main(void *xvoid, long long xlen) { unsigned char *x = xvoid; assert(knownrandombytes_is_only_for_testing_not_for_cryptographic_use); while (xlen > 0) { if (knownrandombytes_pos == crypto_rng_OUTPUTBYTES) { crypto_rng(knownrandombytes_r, knownrandombytes_g, knownrandombytes_g); knownrandombytes_pos = 0; } *x++ = knownrandombytes_r[knownrandombytes_pos]; xlen -= 1; knownrandombytes_r[knownrandombytes_pos++] = 0; } } void knownrandombytes(void *xvoid, long long xlen) { knownrandombytes_main(xvoid, xlen); secret(xvoid, xlen); } /* ----- checksums */ static unsigned char checksum_state[64]; static char checksum_hex[65]; void checksum_expected(const char *expected) { long long i; for (i = 0; i < 32; ++i) { checksum_hex[2 * i] = "0123456789abcdef"[15 & (checksum_state[i] >> 4)]; checksum_hex[2 * i + 1] = "0123456789abcdef"[15 & checksum_state[i]]; } checksum_hex[2 * i] = 0; if (strcmp(checksum_hex, expected)) fail("failure: checksum mismatch: %s expected %s\n", checksum_hex, expected); } void checksum_clear(void) { memset(checksum_state, 0, sizeof checksum_state); knownrandombytes_clear(); testvector_clear(); /* not necessary to clear canary */ } void checksum(const unsigned char *x, unsigned long long xlen) { u8 block[16]; unsigned long long i; while (xlen >= 16) { core_salsa(checksum_state, x, checksum_state); x += 16; xlen -= 16; } FOR(i, 16) block[i] = 0; FOR(i, xlen) block[i] = x[i]; block[xlen] = 1; checksum_state[0] ^= 1; core_salsa(checksum_state, block, checksum_state); } static void limits() { #ifdef RLIM_INFINITY struct rlimit r; r.rlim_cur = 0; r.rlim_max = 0; #ifdef RLIMIT_NOFILE setrlimit(RLIMIT_NOFILE, &r); #endif #ifdef RLIMIT_NPROC setrlimit(RLIMIT_NPROC, &r); #endif #ifdef RLIMIT_CORE setrlimit(RLIMIT_CORE, &r); #endif #endif } void *callocplus(long long len) { if (valgrind) { unsigned char *x = malloc(len); if (!x) abort(); return x; } else { unsigned char *x = calloc(1, len + 256); long long i; if (!x) abort(); for (i = 0; i < len + 256; ++i) x[i] = random(); return x; } } void *aligned(void *x, long long len) { if (valgrind) return x; else { long long i; unsigned char *y = x; y += 64; y += 63 & (-(unsigned long) y); for (i = 0; i < len; ++i) y[i] = 0; return y; } } /* ----- catching SIGILL, SIGBUS, SIGSEGV, etc. */ void forked(void (*test)(long long), long long impl) { if (valgrind) { test(impl); return; } fflush(stdout); pid_t child = fork(); int childstatus = -1; if (child == -1) { fprintf(stderr, "fatal: fork failed: %s", strerror(errno)); exit(111); } if (child == 0) { ok = 1; limits(); test(impl); if (!ok) exit(100); exit(0); } if (waitpid(child, &childstatus, 0) != child) { fprintf(stderr, "fatal: wait failed: %s", strerror(errno)); exit(111); } if (childstatus) fail("failure: process failed, status %d\n", childstatus); fflush(stdout); } /* ----- endianness */ /* on big-endian machines, flip into little-endian */ /* other types of endianness are not supported */ void endianness(unsigned char *e, unsigned long long words, unsigned long long bytesperword) { unsigned long long i = 1; if (1 == *(unsigned char *) &i) return; while (words > 0) { for (i = 0; 2 * i < bytesperword; ++i) { long long j = bytesperword - 1 - i; unsigned char ei = e[i]; e[i] = e[j]; e[j] = ei; } e += bytesperword; words -= 1; } } #include "_crypto-test_verify_16.inc" #include "_crypto-test_verify_32.inc" #include "_crypto-test_sort_uint32.inc" #include "_crypto-test_hash_sha256.inc" #include "_crypto-test_hash_sha512.inc" #include "_crypto-test_sign_ed25519.inc" #include "_crypto-test_kem_sntrup761.inc" #include "_crypto-test_dh_x25519.inc" #include "_crypto-test_onetimeauth_poly1305.inc" /* ----- top level */ int main(int argc, char **argv) { (void) argc; valgrind_init(); if (valgrind) limits(); setvbuf(stdout, 0, _IOLBF, 0); if (valgrind) { printf("valgrind %d", (int) valgrind); printf(" declassify %d", (int) crypto_declassify_uses_valgrind); if (!crypto_declassify_uses_valgrind) printf(" (expect false positives)"); printf("\n"); } if (*argv) ++argv; if (*argv) { targeto = *argv++; if (*argv) { targetp = *argv++; if (*argv) { targeti = *argv++; if (*argv) { targetn = *argv++; if (*argv) { targetoffset = *argv++; } } } } } test_verify_16(); test_verify_32(); test_sort_uint32(); test_hash_sha256(); test_hash_sha512(); test_sign_ed25519(); test_kem_sntrup761(); test_dh_x25519(); test_onetimeauth_poly1305(); if (!ok) { printf("some tests failed\n"); return 100; } printf("all tests succeeded\n"); return 0; } tinyssh-20250501/test-tinysshd-makekey.exp000066400000000000000000000005451500472222400204410ustar00rootroot00000000000000--- tinysshd-makekey prints help 100 --- tinysshd-makekey creates key-directory keydirm/ed25519.pk 0 --- tinysshd-makekey fails when directory exists tinysshd-makekey: fatal: unable to create directory keydirm (file already exists) 111 --- tinysshd-makekey handles '-m' parameter (prints help) 100 --- tinysshd-makekey creates '-m' key-directory 0 tinyssh-20250501/test-tinysshd-makekey.sh000066400000000000000000000013261500472222400202550ustar00rootroot00000000000000#!/bin/sh LANG=C export LANG LC_ALL=C export LC_ALL cleanup() { ex=$? rm -rf -- keydirm -m exit "${ex}" } trap "cleanup" EXIT TERM INT echo '--- tinysshd-makekey prints help' echo ./tinysshd-makekey 2>/dev/null echo $? echo echo '--- tinysshd-makekey creates key-directory' echo rm -rf keydirm ./tinysshd-makekey keydirm 2>&1 ls keydirm/*.pk | sort echo $? echo echo '--- tinysshd-makekey fails when directory exists' echo rm -rf keydirm mkdir keydirm ./tinysshd-makekey keydirm 2>&1 echo $? echo "--- tinysshd-makekey handles '-m' parameter (prints help)" echo ./tinysshd-makekey -m 2>/dev/null echo $? echo echo "--- tinysshd-makekey creates '-m' key-directory" echo ./tinysshd-makekey -- -m 2>&1 echo $? echo tinyssh-20250501/test-tinysshd-printkey.exp000066400000000000000000000007431500472222400206600ustar00rootroot00000000000000--- tinysshd-printkey prints help 100 --- tinysshd-printkey prints keys ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgK 0 --- tinysshd-printkey prints only ssh-ed25519 key ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgK 0 --- tinysshd-printkey prints only ecdsa-sha2-nistp256 key 0 --- tinysshd-printkey handles '-r' parameter (prints help) 100 --- tinysshd-printkey prints keys from '-r' key-directory 0 tinyssh-20250501/test-tinysshd-printkey.sh000066400000000000000000000022421500472222400204720ustar00rootroot00000000000000#!/bin/sh cleanup() { ex=$? rm -rf -- keydirp -r exit "${ex}" } trap "cleanup" EXIT TERM INT mkdir keydirp echo '--- tinysshd-printkey prints help' echo ./tinysshd-printkey 2>/dev/null echo $? echo ( echo 'ed25519.pk xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' echo 'nistp256ecdsa.pk xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ) | ( while read name key do echo ${key} > "keydirp/${name}" done ) echo '--- tinysshd-printkey prints keys' echo ./tinysshd-printkey keydirp echo $? echo mv keydirp/nistp256ecdsa.pk keydirp/nistp256ecdsa.pk.bk echo '--- tinysshd-printkey prints only ssh-ed25519 key' echo ./tinysshd-printkey keydirp echo $? echo mv keydirp/nistp256ecdsa.pk.bk keydirp/nistp256ecdsa.pk mv keydirp/ed25519.pk keydirp/ed25519.pk.bk echo '--- tinysshd-printkey prints only ecdsa-sha2-nistp256 key' echo ./tinysshd-printkey keydirp echo $? echo echo "--- tinysshd-printkey handles '-r' parameter (prints help)" echo ./tinysshd-printkey -r 2>/dev/null echo $? echo ./tinysshd-makekey -- -r 2>/dev/null || : echo "--- tinysshd-printkey prints keys from '-r' key-directory" echo ./tinysshd-printkey -- -r 1>/dev/null echo $? echo exit 0 tinyssh-20250501/test-tinysshd.exp000066400000000000000000000652171500472222400170240ustar00rootroot00000000000000--- tinysshd don't accept long hello message 111 --- tinysshd don't accept short hello message 111 --- tinysshd don't accept lower case SSH in hello message 111 --- tinysshd default setup _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -osp _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -o -s -p _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -osP _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -o -s -P _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -oSp _tinysshd-printkex: info: kex algorithms: sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -o -S -p _tinysshd-printkex: info: kex algorithms: sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -oSP _tinysshd-printkex: info: kex algorithms: kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: _tinysshd-printkex: info: encryption algorithms server to client: _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -o -S -P _tinysshd-printkex: info: kex algorithms: kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: _tinysshd-printkex: info: encryption algorithms server to client: _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -Osp _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -O -s -p _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -OsP _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -O -s -P _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -OSp _tinysshd-printkex: info: kex algorithms: sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -O -S -p _tinysshd-printkex: info: kex algorithms: sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -OSP _tinysshd-printkex: info: kex algorithms: kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: _tinysshd-printkex: info: encryption algorithms server to client: _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -O -S -P _tinysshd-printkex: info: kex algorithms: kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: _tinysshd-printkex: info: encryption algorithms server to client: _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -osp, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -o -s -p, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -osP, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -o -s -P, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -oSp, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -o -S -p, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -oSP, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: _tinysshd-printkex: info: encryption algorithms server to client: _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -o -S -P, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: _tinysshd-printkex: info: encryption algorithms server to client: _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -Osp, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -O -s -p, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -OsP, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -O -s -P, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: ssh-ed25519 _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -OSp, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -O -S -p, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -OSP, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: _tinysshd-printkex: info: encryption algorithms server to client: _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -O -S -P, ecdsa-sha2-nistp256 key missing _tinysshd-printkex: info: kex algorithms: kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: _tinysshd-printkex: info: encryption algorithms server to client: _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -osp, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -o -s -p, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -osP, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -o -s -P, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -oSp, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -o -S -p, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -oSP, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: _tinysshd-printkex: info: encryption algorithms server to client: _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -o -S -P, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: _tinysshd-printkex: info: encryption algorithms server to client: _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -Osp, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -O -s -p, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -OsP, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -O -s -P, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: curve25519-sha256,curve25519-sha256@libssh.org,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -OSp, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -O -S -p, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: sntrup761x25519-sha512@openssh.com,kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: chacha20-poly1305@openssh.com _tinysshd-printkex: info: encryption algorithms server to client: chacha20-poly1305@openssh.com _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -OSP, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: _tinysshd-printkex: info: encryption algorithms server to client: _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 --- tinysshd recognizes -O -S -P, ssh-ed25519 key missing _tinysshd-printkex: info: kex algorithms: kex-strict-s-v00@openssh.com _tinysshd-printkex: info: server host key algorithms: _tinysshd-printkex: info: encryption algorithms client to server: _tinysshd-printkex: info: encryption algorithms server to client: _tinysshd-printkex: info: mac algorithms client to server: hmac-sha2-256 _tinysshd-printkex: info: mac algorithms server to client: hmac-sha2-256 tinyssh-20250501/test-tinysshd.sh000066400000000000000000000101201500472222400166210ustar00rootroot00000000000000#!/bin/sh LANG=C export LANG LC_ALL=C export LC_ALL exec 2>&1 rm -rf keydir ./tinysshd-makekey keydir echo "--- tinysshd don't accept long hello message" echo echo 'SSH-2.0 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' | ./tinysshd keydir 1>/dev/null 2>/dev/null echo $? echo echo "--- tinysshd don't accept short hello message" echo echo 'SSH' | ./tinysshd keydir 1>/dev/null 2>/dev/null echo $? echo echo "--- tinysshd don't accept lower case SSH in hello message" echo echo 'ssh-2.0 xxx' | ./tinysshd keydir 1>/dev/null 2>/dev/null echo $? echo # Temp. disabled #echo "--- tinysshd don't accept too many unauthenticated messages" #echo #./_tinysshd-unauthenticated ./tinysshd keydir #echo $? #echo echo '--- tinysshd default setup' echo ./_tinysshd-printkex ./tinysshd keydir echo for i in o O; do for j in s S; do for k in p P; do echo "--- tinysshd recognizes -${i}${j}${k}" echo ./_tinysshd-printkex ./tinysshd "-${i}${j}${k}" keydir echo echo "--- tinysshd recognizes -${i} -${j} -${k}" echo ./_tinysshd-printkex ./tinysshd "-${i}" "-${j}" "-${k}" keydir echo done done done rm -rf keydir ./tinysshd-makekey keydir rm -f keydir/nistp256ecdsa.pk for i in o O; do for j in s S; do for k in p P; do echo "--- tinysshd recognizes -${i}${j}${k}, ecdsa-sha2-nistp256 key missing" echo ./_tinysshd-printkex ./tinysshd "-${i}${j}${k}" keydir echo echo "--- tinysshd recognizes -${i} -${j} -${k}, ecdsa-sha2-nistp256 key missing" echo ./_tinysshd-printkex ./tinysshd "-${i}" "-${j}" "-${k}" keydir echo done done done rm -rf keydir ./tinysshd-makekey keydir rm -f keydir/ed25519.pk for i in o O; do for j in s S; do for k in p P; do echo "--- tinysshd recognizes -${i}${j}${k}, ssh-ed25519 key missing" echo "" ./_tinysshd-printkex ./tinysshd "-${i}${j}${k}" keydir echo echo "--- tinysshd recognizes -${i} -${j} -${k}, ssh-ed25519 key missing" echo ./_tinysshd-printkex ./tinysshd "-${i}" "-${j}" "-${k}" keydir echo done done done #temporary removed exit 0 rm -rf keydir ./tinysshd-makekey keydir echo "--- tinysshd logs 'client closed connection' when trying to write hello message" echo "" ./_tinysshd-test-hello1 ./tinysshd keydir 2>&1 | sed -e 's/tinysshd: .*: //' -e 's/SSH-.*//' -e 's/{.*}//' echo "" echo "--- tinysshd logs 'client closed the connection' when trying to read hello message" echo "" ./_tinysshd-test-hello2 '' ./tinysshd keydir 2>&1 | sed -e 's/tinysshd: .*: //' -e 's/SSH-.*//' -e 's/{.*}//' echo "" echo "--- tinysshd 'logs unacceptable hello string' when trying to read hello message" echo "" ./_tinysshd-test-hello2 SSH ./tinysshd keydir 2>&1 | sed -e 's/tinysshd: .*: //' -e 's/SSH-.*//' -e 's/{.*}//' echo "" echo "--- tinysshd 'logs unacceptable hello string' when trying to read hello message" echo "" ./_tinysshd-test-hello2 ssh- ./tinysshd keydir 2>&1 | sed -e 's/tinysshd: .*: //' -e 's/SSH-.*//' -e 's/{.*}//' echo "" echo "--- tinysshd 'logs unacceptable hello string' when trying to read long hello message" echo "" ./_tinysshd-test-hello2 'SSH-2.0 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ./tinysshd -v keydir 2>&1 | sed -e 's/tinysshd: .*: //' -e 's/SSH-.*//' -e 's/{.*}//' echo "" echo "--- tinysshd 'logs kex problem' when client closed the connection - ends with (connection reset) or (broken pipe)" echo "" ./_tinysshd-test-kex1 ./tinysshd keydir 2>&1 | sed -e 's/tinysshd: .*: //' -e 's/{.*}//' -e 's/(.*)//' echo "" echo "--- tinysshd 'logs kex problem' when client disconnected the connection" echo "" ./_tinysshd-test-kex2 ./tinysshd keydir 2>&1 | sed -e 's/tinysshd: .*: //' -e 's/{.*}//' echo "" exit 0 tinyssh-20250501/test-tinysshnoneauthd.exp000066400000000000000000000000001500472222400205410ustar00rootroot00000000000000tinyssh-20250501/test-tinysshnoneauthd.sh000066400000000000000000000000211500472222400203620ustar00rootroot00000000000000#!/bin/sh exit 0 tinyssh-20250501/tinysshd.c000066400000000000000000000015721500472222400154670ustar00rootroot00000000000000/* 20181206 Jan Mojzis Public domain. */ /* Multi-call binary wrapper */ #include #include "str.h" #include "main.h" static char *basename(char *str) { char *s; char *ret = str; for (s = str; *s; ++s) { if (*s == '/') ret = s + 1; } return ret; } static char *x; static long long xlen; int main(int argc, char **argv) { if (argc < 1) _exit(100); if (!argv[0]) _exit(100); x = basename(argv[0]); if (!x) _exit(100); xlen = str_len(x); if (str_equaln(x, xlen, "tinysshd-printkey")) { return main_tinysshd_printkey(argc, argv); } if (str_equaln(x, xlen, "tinysshd-makekey")) { return main_tinysshd_makekey(argc, argv); } if (str_equaln(x, xlen, "tinysshnoneauthd")) { return main_tinysshd(argc, argv, "tinysshnoneauthd"); } return main_tinysshd(argc, argv, "tinysshd"); } tinyssh-20250501/tools/000077500000000000000000000000001500472222400146115ustar00rootroot00000000000000tinyssh-20250501/tools/tinyssh-convert000077500000000000000000000110241500472222400177140ustar00rootroot00000000000000#!/usr/bin/env python3 import os import sys import base64 import struct """ byte[] AUTH_MAGIC = "openssh-key-v1\x00" string ciphername string kdfname string kdfoptions int number of keys N string publickey1 string publickey2 ... string publickeyN string encrypted, padded list of private keys """ class Parser: """ """ def __init__(self, data = b""): """ """ self.data = data def parse_magic(self): """ """ if len(self.data) < 15 or not self.data.startswith(b"openssh-key-v1\x00"): raise Exception("unable to parse OpenSSH key: magic 'openssh-key-v1' not found") self.data = self.data[15:] def parse_num(self, text): """ """ if (4 > len(self.data)): raise Exception(f"unable to parse OpenSSH key: bad ssh-num {text}") num = struct.unpack('>I', self.data[:4])[0] self.data = self.data[4:] return num def parse_string(self, text): """ """ num = self.parse_num(text) if (num > len(self.data)): raise Exception(f"unable to parse OpenSSH key: bad ssh-string {text}") ret = self.data[:num] self.data = self.data[num:] return ret def usage(f = ""): """ """ if len(f) != 0: print("tinyssh-convert: fatal: %s" % (f)) print("tinyssh-convert: usage: tinyssh-convert out-tinysshkeydir < in-opensshfile") print() exit(100) def writesync(fn = "", data = b""): """ """ f = open(fn, 'wb') f.write(data) f.flush() os.fsync(f.fileno()) f.close() if __name__ == "__main__": if len(sys.argv) != 2: usage("") d=sys.argv[1] if os.path.exists(d): usage("out-tinysshkeydir exist") lines = sys.stdin.readlines() data = "" flagbegin = 0 for line in lines: if line.startswith("-----BEGIN OPENSSH PRIVATE KEY-----"): flagbegin = 1 continue if line.startswith("-----END OPENSSH PRIVATE KEY-----"): break if flagbegin: data += line if flagbegin == 0: raise Exception("unable to parse OpenSSH key: no line -----BEGIN OPENSSH PRIVATE KEY----- found") data = base64.b64decode(data) # parse key p = Parser(data) p.parse_magic() ciphername = p.parse_string("ciphername") if ciphername != b'none': raise Exception("unable to parse OpenSSH key: can't convert encrypted key: ciphername != none") kdfname = p.parse_string("kdfname") if kdfname != b'none': raise Exception("unable to parse OpenSSH key: can't convert encrypted key: kdfname != none") kdfoptions = p.parse_string("kdfoptions") if kdfoptions != b'': raise Exception("unable to parse OpenSSH key: can't convert encrypted key: kdfoptions != ''") pklen = p.parse_num("publickeys") if (pklen != 1): raise Exception("unable to parse OpenSSH key: more than one key in the file") pkssh = p.parse_string("publickey") skssh = p.parse_string("secretkeys") # parse secret key p = Parser(skssh) p.parse_num("checkint") p.parse_num("checkint") sk = [] t = p.parse_string("secret-key type") if t != b'ssh-ed25519': raise Exception(f"unable to parse OpenSSH key: secret-key type={t}: not ssh-ed25519 key") pk = p.parse_string("public-key") pklen = len(pk) sk = p.parse_string("secret-key") sklen = len(sk) p.parse_string("comment") if pklen != 32: raise Exception(f"unable to parse OpenSSH key: public-key length={pklen}: not 32") if sklen != 64: raise Exception(f"unable to parse OpenSSH key: secret-key length={sklen}: not 64") os.umask(0o0022) os.mkdir(d) os.chdir(d) writesync("ed25519.pk", pk) os.umask(0o0077) writesync(".ed25519.sk", sk) tinyssh-20250501/tryfeature.sh000077500000000000000000000014751500472222400162110ustar00rootroot00000000000000#!/bin/sh # version 20241107 scriptname="`basename $0`" if [ x"${CC}" = x ]; then echo "usage: env CC= ${scriptname} feature.c" echo '$CC not set' exit 1 fi if [ x"$1" = x ]; then echo "usage: env CC= ${scriptname} feature.c" echo 'missing feature.c argument' exit 1 fi # input tryname="$1" # output headermacro=`echo ${tryname} | sed 's/\.c//' | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` # temporary binname="${tryname}.tmp.bin" logname="${tryname}.tmp.log" cleanup() { ex=$? rm -f "${binname}" "${logname}" exit "${ex}" } trap "cleanup" EXIT TERM INT "${CC}" ${CFLAGS} -O0 -o "${binname}" "${tryname}" ${LDFLAGS} 1>"${logname}" 2>&1 if [ $? -eq 0 ]; then echo "#define ${headermacro} 1" else echo "#undef ${headermacro}" cat "${logname}" >&2 fi exit 0 tinyssh-20250501/trylibs.sh000077500000000000000000000017301500472222400155010ustar00rootroot00000000000000#!/bin/sh # version 20241109 scriptname="`basename $0`" if [ x"${CC}" = x ]; then echo "usage: env CC= ${scriptname} -l -l ..." echo '$CC not set' exit 1 fi if [ x"$1" = x ]; then echo "usage: env CC= ${scriptname} -l -l ..." echo 'missing -l argument' exit 1 fi # temporary name="${scriptname}" tryname="${name}.tmp.C" binname="${tryname}.tmp.bin" logname="${tryname}.tmp.log" cleanup() { ex=$? rm -f "${binname}" "${tryname}" "${logname}" exit "${ex}" } trap "cleanup" EXIT TERM INT cat < "${tryname}" int main(int argc, char **argv) { (void) argc; (void) argv; return 0; } EOF while true; do [ x"$1" = x ] && break "${CC}" -O0 -o "${binname}" "${tryname}" "$1" 1>"${logname}" 2>&1 if [ $? -eq 0 ]; then echo "${scriptname}: '$1' detected" >&2 echo "$1" else echo "${scriptname}: '$1' not detected" >&2 cat "${logname}" >&2 fi shift done exit 0 tinyssh-20250501/trymlock.c000066400000000000000000000010041500472222400154540ustar00rootroot00000000000000/* 20120923 Jan Mojzis Public domain. */ #include "hasmlock.h" #ifdef HASMLOCK #include #endif #include "trymlock.h" /* The 'trymlock' function tries to lock the memory to make it unswappable. */ void trymlock(void *x, long long len) { #ifdef HASMLOCK mlock(x, len); #else (void) x; (void) len; #endif } /* The 'trymunlock' function tries to unlock the memory. */ void trymunlock(void *x, long long len) { #ifdef HASMLOCK munlock(x, len); #else (void) x; (void) len; #endif } tinyssh-20250501/trymlock.h000066400000000000000000000002131500472222400154620ustar00rootroot00000000000000#ifndef TRYMLOCK_H____ #define TRYMLOCK_H____ extern void trymlock(void *, long long); extern void trymunlock(void *, long long); #endif tinyssh-20250501/uint16_optblocker.c000077700000000000000000000000001500472222400247332cryptoint/uint16_optblocker.custar00rootroot00000000000000tinyssh-20250501/uint32_optblocker.c000077700000000000000000000000001500472222400247272cryptoint/uint32_optblocker.custar00rootroot00000000000000tinyssh-20250501/uint64_optblocker.c000077700000000000000000000000001500472222400247412cryptoint/uint64_optblocker.custar00rootroot00000000000000tinyssh-20250501/uint8_optblocker.c000077700000000000000000000000001500472222400245752cryptoint/uint8_optblocker.custar00rootroot00000000000000tinyssh-20250501/writeall.c000066400000000000000000000012461500472222400154430ustar00rootroot00000000000000#include #include #include "e.h" #include "writeall.h" int writeall(int fd, const void *xv, long long xlen) { const unsigned char *x = xv; long long w; while (xlen > 0) { w = xlen; if (w > 1048576) w = 1048576; w = write(fd, x, (unsigned long long) w); if (w < 0) { if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) { struct pollfd p; p.fd = fd; p.events = POLLOUT | POLLERR; poll(&p, 1, -1); continue; } return -1; } x += w; xlen -= w; } return 0; } tinyssh-20250501/writeall.h000066400000000000000000000001521500472222400154430ustar00rootroot00000000000000#ifndef WRITEALL_H____ #define WRITEALL_H____ extern int writeall(int, const void *, long long); #endif